Я использую метод локтя, чтобы найти подходящее количество кластеров KMean, когда я использую Python и sklearn. Я хочу сделать то же самое, когда работаю в PySpark. Я знаю, что PySpark имеет ограниченную функциональность из-за распределенного характера Spark, но есть ли способ получить этот номер?
Я использую следующий код для построения локтя. Используя метод локтя, чтобы найти оптимальное количество кластеров. из 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 — неподходящий инструмент для построения метода выдувания. Чтобы построить диаграмму, данные должны быть собраны в фрейм данных 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))
Или оцените кластеризацию, вычислив в пределах заданной суммы квадратичных ошибок, что объясняется здесь.
Я сделал по другому. Рассчитайте стоимость функций с помощью 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 — это инерция Sklearn в Pyspark. В связь вы можете найти текст:
This is equivalent to sklearn's inertia.
Оценка силуэта задается классом ClusteringEvaluator из pyspark.ml.evaluation: см. этот связь
Индекс Дэвиса-Булдина и Индекс Калинского-Харабаша Sklearn еще не реализованы в Pyspark. Тем не менее, есть некоторые предполагаемые функции из них. Например для Индекс Дэвиса-Булдина.