代码之家  ›  专栏  ›  技术社区  ›  user4054919

Spark K-Means通过归一化获得原始簇中心/质心

  •  -1
  • user4054919  · 技术社区  · 7 年前

    val kmeans = new KMeans().setK(k).setSeed(1L)
    val model = kmeans.fit(train_dataset)
    

    然后提取聚类中心(质心)

     var clusterCenters:Seq[(Double,Double,Double,Double,Double,Double,Double,Double,Double)] = Seq()
    for(e <- model.clusterCenters){
      clusterCenters = clusterCenters :+ ((e(0)),e(1),e(2),e(3),e(4),e(5),e(6),e(7),e(8))
    }
    
    import sc.implicits._
    var centroidsDF = clusterCenters.toDF()
    

    现在我有一个问题,我已经规范化了数据之前,以改善聚类结果。

     val scaler = new StandardScaler()
          .setInputCol("features")
          .setOutputCol("scaledFeatures")
          .setWithStd(true)
          .setWithMean(false)
        scalerModel = scaler.fit(train_dataset)
        scaledData = scalerModel.transform(train_dataset)
    

    1 回复  |  直到 7 年前
        1
  •  4
  •   Alper t. Turker    7 年前

    std 矢量:

    import org.apache.spark.ml.feature.ElementwiseProduct
    
    val kmeans: KMeansModel = ???
    val scaler: StandardScalerModel = ???
    
    new ElementwiseProduct()
      .setScalingVec(scaler.std)  // Standard deviation used by scaler
      .setOutputCol("rescaled")
      .setInputCol("cluster")
      .transform(sc.parallelize(
        // Get centers and convert to `DataFrame`
        kmeans.clusterCenters.zipWithIndex).toDF("cluster", "id"))