python中K-Means的肘部法



我使用K- means算法(在sklearn中)来聚类1-D数组的值,我想在我的脚本中决定最优的簇数(K)。

我熟悉肘部方法,但所有的实现都需要绘制聚类WCSS值,并在视觉上发现肘部方法。

是否有一种方法可以通过代码(不是视觉)找到弯头,或者其他方法可以通过代码找到最优K ?

比较简单的方法是将弯头折线上最小k值与最大k值对应的点连接起来,然后找到折线与直线垂直距离最大的点:

import numpy as np
from sklearn.cluster import KMeans

def select_k(X: np.ndarray, k_range: np.ndarray) -> int:
wss = np.empty(k_range.size)
for i, k in enumerate(k_range):
kmeans = KMeans(k)
kmeans.fit(X)
wss[i] = ((X - kmeans.cluster_centers_[kmeans.labels_]) ** 2).sum()
slope = (wss[0] - wss[-1]) / (k_range[0] - k_range[-1])
intercept = wss[0] - slope * k_range[0]
y = k_range * slope + intercept
return k_range[(y - wss).argmax()]

最新更新