2017-09-05 10 views
-1

と元のクラスタセンター/重心を得る私は戻って結果を書き込むk平均モデルスパーク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"))