当我使用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()
答案 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()