Spark получает фактические кластероиды с StandardScaler
Я установил KMeans с масштабированными функциями, используя 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)
Здесь я хочу получить центероиды в оригинальном масштабе. Центероиды масштабируются.
[ 7.04524479 6.17347978 2.50588155 1.88127377]
[ 6.0454109 7.88294475 0.82973422 0.31972295]
[ 8.22013841 7.19671468 3.13005178 2.59685552]
1 ответ
Решение
Вы StandardScaler
с withStd=True
а также withMean=False
, Чтобы вернуться в исходное пространство, вы должны умножить std
вектор:
[cluster * scalerModel.std for cluster in model.clusterCenters()]
Если withMean
было True
вы бы использовали:
[cluster * scalerModel.std + scalerModel.mean
for cluster in model.clusterCenters()]