Расхождение в сравнении результатов Kmeans от искры и склеарна - PullRequest
0 голосов
/ 18 июня 2020

Я сравниваю результаты алгоритма k-means от spark и sklearn. Я строю график суммы квадратов расстояний от образцов до ближайшего центра кластера с помощью обоих алгоритмов.

from pyspark.sql import SparkSession
import pandas as pd
import pyspark.sql.functions as sf
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.clustering import KMeans as spark_KMeans

spark = SparkSession.builder.master("local[*]").getOrCreate()

pdf = pd.DataFrame(load_iris()['data'],
                  columns=load_iris()['feature_names']
                 )
pdf = pd.DataFrame(load_iris().data, columns=load_iris().feature_names)
pdf.columns = pdf.columns.str.replace(' \(cm\)', '').str.replace(' ', '_').tolist()

sdf = spark.createDataFrame(pdf)
vecAssembler = VectorAssembler(inputCols=sdf.columns, outputCol="features")
sdf = vecAssembler.transform(sdf)

clustering_spark_model = spark_KMeans()\
                        .setFeaturesCol("features")\
                        .setPredictionCol("cluster")
#                         .setInitMode("k-means||")\
#                         .setInitSteps(2)
sse_pdf, sse_sdf ={}, {}

for k in range(2,30):
    km_pdf = KMeans(n_clusters=k, n_init=20)
    km_pdf.fit(pdf)
    sse_pdf[k] = km_pdf.inertia_
    km_sdf = clustering_spark_model.setK(k)
    km_model_sdf = km_sdf.fit(sdf)
    sse_sdf[k] = km_model_sdf.computeCost(sdf)

plt.figure()
x_pdf, y_pdf = zip(*list(sse_pdf.items()))
x_sdf, y_sdf = zip(*list(sse_sdf.items()))
plt.plot(x_pdf,y_pdf, label="sklearn")
plt.plot(x_sdf,y_sdf, label="spark")
plt.xlabel("Cluster number")
plt.ylabel("SSE")
plt.legend(loc="upper right")
plt.show()

Я вижу некоторые колебания для алгоритма искры и некоторые расхождения с алгоритмом sklearn. Что-то ожидается? Я попытался установить initMode, увеличить initSteps и установить начальное значение в обоих алгоритмах, но все же есть некоторые несоответствия для большого количества кластеров. SSE comparison

...