PySpark 如何找到合适数量的簇

PySpark how to find appropriate number of clusters

当我使用 Python 和 sklearn 时,我使用 plot elbow 方法来找到合适数量的 KMean 簇。当我在 PySpark 中工作时,我想做同样的事情。我知道由于 Spark 的分布式特性,PySpark 的功能有限,但是,有没有办法获得这个数字?

我正在使用以下代码绘制肘部使用肘部方法找到最佳簇数 从 sklearn.cluster 导入 KMeans

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

PySpark 不是绘制 eblow 方法的正确工具。要绘制图表,必须将数据收集到 Pandas 数据框中,这在我的情况下是不可能的,因为数据量很大。另一种方法是像下面这样使用 silhouette analysis

# Keep changing the number of clusters and re-calculate
kmeans = KMeans().setK(6).setSeed(1)
model = kmeans.fit(dataset.select('features'))
predictions = model.transform(dataset)
silhouette = evaluator.evaluate(predictions)
print("Silhouette with squared euclidean distance = " + str(silhouette))

或者通过计算 Within Set Sum of Squared Errors 来评估聚类,这在 here

中有解释

我用另一种方式做了。使用 Spark ML 计算特征成本并将结果存储在 Python 列表中,然后绘制它。

# Calculate cost and plot
cost = np.zeros(10)

for k in range(2,10):
    kmeans = KMeans().setK(k).setSeed(1).setFeaturesCol('features')
    model = kmeans.fit(df)
    cost[k] = model.summary.trainingCost

# Plot the cost
df_cost = pd.DataFrame(cost[2:])
df_cost.columns = ["cost"]
new_col = [2,3,4,5,6,7,8, 9]
df_cost.insert(0, 'cluster', new_col)

import pylab as pl
pl.plot(df_cost.cluster, df_cost.cost)
pl.xlabel('Number of Clusters')
pl.ylabel('Score')
pl.title('Elbow Curve')
pl.show()

我觉得最后的回答不完全正确。然而,第一个答案是正确的。查看 Pyspark.ml.clustering 的文档和源代码 model.summary.trainingCost 是 Pyspark 中 Sklearn 的惯性。在 link 中您可以找到文本:

This is equivalent to sklearn's inertia.

轮廓分数由 pyspark.ml.evaluation 的 ClusteringEvaluator class 给出:参见此 link

Davies-Bouldin index and Calinski-Harabasz index of Sklearn are not yet implemented in Pyspark. However, there are some suggested functions of them. For example for the .