2017-09-05 44 views
-1

我跑了K-Means模型星火K均值得到原始簇中心/质心与标准化

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() 

写回结果我创建了生成的聚类中心的DataFrame。

现在我有问题了,我已经规范化数据,以提高聚类结果。

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

我怎样才能得到它的原始形式的质心非归?

+1

你怎么知道这个改善的结果? –

回答

3

我不知道,如果它使任何意义,做到这一点,但由于没有中心,你可以乘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"))