2017-09-05 2 views
-1

J'ai couru un modèle k-meansSpark K-sortiras d'origine Centre/Centroïdes Cluster avec Normalization

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

puis extraire les centres de cluster (centroïdes)

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

pour écrire de nouveau les résultats Je crée un DataFrame des centres de cluster résultants.

Maintenant, j'ai le problème que j'ai normalisé les données au préalable pour améliorer les résultats de la mise en grappe. Comment puis-je obtenir les centroïdes dans leur forme originale dénormalisée?

+1

Comment le savez-vous amélioré les résultats? –

Répondre

3

Je ne sais pas si cela a un sens de le faire, mais comme ne pas le centre, il vous suffit de multiplier par std vecteur:

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