如果事先不知道真实标签(如您的情况),那么K-Means clustering
可以使用肘部准则或轮廓系数进行评估。
弯头准则法:
肘部方法背后的想法是在给定数据集上针对一系列 k 值运行 k 均值聚类(num_clusters
,例如 k=1 到 10),并且对于 k 的每个值,计算误差平方和 (SSE)。
之后,针对每个 k 值绘制 SSE 线图。如果折线图看起来像一条手臂 - 折线图下方的红色圆圈(如角度),则手臂上的“肘部”就是最佳 k 值(簇数)。
在这里,我们希望最小化 SSE。随着 k 的增加,SSE 趋向于向 0 减小(当 k 等于数据集中数据点的数量时,SSE 为 0,因为此时每个数据点都是自己的簇,并且它与簇的中心之间没有误差)其簇)。
所以目标是选择一个small value of k
仍然具有较低的 SSE,并且肘部通常代表我们通过增加 k 开始收益递减的位置。
让我们考虑一下虹膜数据集,
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris['feature_names'])
#print(X)
data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]
sse = {}
for k in range(1, 10):
kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
data["clusters"] = kmeans.labels_
#print(data["clusters"])
sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()
Plot for above code:
我们可以在图中看到,3 是 iris 数据集的最佳簇数(红色圆圈),这确实是正确的。
轮廓系数法:
From sklearn文档 http://scikit-learn.org/stable/modules/clustering.html#silhouette-coefficient,
较高的轮廓系数得分与具有更好定义的聚类的模型相关。 Silhouette Coefficient 是为每个样本定义的,由两个分数组成:
`
a:样本与同一类中所有其他点之间的平均距离。
b:样本与下一个样本中所有其他点之间的平均距离
最近的簇。
单个样本的轮廓系数如下:
现在,要找到最优值k
for KMeans
,循环遍历 1..n 中的 n_clustersKMeans
并计算每个样本的轮廓系数。
较高的轮廓系数表明该对象与其自身的簇匹配良好,而与邻近的簇匹配较差。
from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
X = load_iris().data
y = load_iris().target
for n_cluster in range(2, 11):
kmeans = KMeans(n_clusters=n_cluster).fit(X)
label = kmeans.labels_
sil_coeff = silhouette_score(X, label, metric='euclidean')
print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))
Output -
对于 n_clusters=2,轮廓系数为 0.680813620271
对于 n_clusters=3,轮廓系数为 0.552591944521
对于 n_clusters=4,轮廓系数为 0.496992849949
对于 n_clusters=5,轮廓系数为 0.488517550854
对于 n_clusters=6,轮廓系数为 0.370380309351
对于 n_clusters=7,轮廓系数为 0.356303270516
对于 n_clusters=8,轮廓系数为 0.365164535737
对于 n_clusters=9,轮廓系数为 0.346583642095
对于 n_clusters=10,轮廓系数为 0.328266088778
正如我们所看到的,n_簇=2具有最高的轮廓系数。这意味着2应该是最佳簇数,对吧?
但这是问题所在。
Iris 数据集有 3 种花,这与最佳簇数 2 种相矛盾。所以尽管n_簇=2具有最高的轮廓系数,我们会考虑n_簇=3作为最佳簇数,因为 -
- Iris 数据集有 3 个物种。(最重要的)
-
n_簇=3具有第二高的轮廓系数值。
所以选择n_簇=3是最优的编号。鸢尾花数据集的簇。
选择最佳编号集群的类型取决于数据集的类型和我们试图解决的问题。但大多数情况下,采用最高的轮廓系数将产生最佳的簇数。
希望能帮助到你!