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