PySpark如何找到适当数量的集群

时间:2019-05-30 04:09:44

标签: python apache-spark machine-learning pyspark k-means

当我使用Python和sklearn时,我绘制了弯头方法以找到适当数量的KMean群集。我在PySpark工作时也想这样做。我知道由于Spark的分布式特性,PySpark的功能有限,但是,有没有办法获得这个数字?

我正在使用以下代码绘制肘部使用Elbow方法查找最佳簇数 从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()

enter image description here

2 个答案:

答案 0 :(得分:0)

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))

或者通过计算平方误差的集合和内来评估聚类,这在here

中进行了解释

答案 1 :(得分:0)

我用另一种方式做到了。使用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.computeCost(df)

# Plot the cost
df_cost = pd.DataFrame(cost[2:])
df_cost.columns = ["cost"]
new_col = [1,2,3,4,5,6,7,8]
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()