2017-12-08 9 views
1

StandardScalerを使用してスケールされた機能を備えたKMeansが用意されています。問題は、クラスタのセンタイドも縮尺されていることです。プログラムで元のセンソイドを得ることは可能ですか? Spark StandardScalerを使用して実際のクラスタの中心を取得する

import pandas as pd 
import numpy as np 
from pyspark.ml.feature import VectorAssembler 
from pyspark.ml.feature import StandardScaler, StandardScalerModel 
from pyspark.ml.clustering import KMeans 

from sklearn.datasets import load_iris 

# iris data set 
iris = load_iris() 
iris_data = pd.DataFrame(iris['data'], columns=iris['feature_names']) 

iris_df = sqlContext.createDataFrame(iris_data) 

assembler = VectorAssembler(
    inputCols=[x for x in iris_df.columns],outputCol='features') 

data = assembler.transform(iris_df) 

scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures", withStd=True, withMean=False) 
scalerModel = scaler.fit(data) 
scaledData = scalerModel.transform(data).drop('features').withColumnRenamed('scaledFeatures', 'features') 

kmeans = KMeans().setFeaturesCol("features").setPredictionCol("prediction").setK(3) 
model = kmeans.fit(scaledData) 
centers = model.clusterCenters() 

print("Cluster Centers: ") 
for center in centers: 
    print(center) 

は、ここで私は、元の規模でcenteroidsを取得したいです。 センダイドは縮尺されています。

withStd=TruewithMean=False
[ 7.04524479 6.17347978 2.50588155 1.88127377] 
[ 6.0454109 7.88294475 0.82973422 0.31972295] 
[ 8.22013841 7.19671468 3.13005178 2.59685552] 

答えて

0

あなたStandardScalerwithMeanは、あなたが使用したいTrueた場合

[cluster * scalerModel.std for cluster in model.clusterCenters()] 

[cluster * scalerModel.std + scalerModel.mean 
    for cluster in model.clusterCenters()] 
バックあなたは stdベクトルで乗算する必要があり、最初のスペースに移動するには
関連する問題