PySpark, как найти подходящее количество кластеров - PullRequest
0 голосов
/ 30 мая 2019

Я строю локоть метод, чтобы найти подходящее число кластера KMean, когда я использую Python и sklearn.Я хочу сделать то же самое, когда я работаю в PySpark.Я знаю, что PySpark имеет ограниченную функциональность из-за распределенной природы Spark, но есть ли способ получить это число?

Я использую следующий код для построения колена Используя метод Elbow, чтобы найти оптимальныйколичество кластеров из sklearn.cluster import 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 голосов
/ 13 июня 2019

Я сделал это по-другому.Рассчитайте стоимость объектов с помощью 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()
0 голосов
/ 03 июня 2019

PySpark не является правильным инструментом для построения метода eblow. Чтобы построить диаграмму, данные должны быть собраны в фрейм данных Pandas, что в моем случае невозможно из-за огромного количества данных. Альтернатива - использовать силуэтный анализ , как показано ниже

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

Или оцените кластеризацию, вычисляя в пределах установленной суммы квадратов ошибок, что объясняется здесь

...