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()]
Другие вопросы по тегам