一个聚类(K = 1)可能是K-均值聚类中K值不同的一种有效的、最适合的聚类。在scikit中的"silhouette_score“(v0.23.1)似乎不适用于一个集群,并且会产生一个意外的错误。
下面是要复制的代码:
import numpy as np
from sklearn.metrics import silhouette_samples, silhouette_score
X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
labels = kmeans.predict(X)
print(labels)
print(silhouette_score(X, labels)) # 2 clusters works
kmeans = KMeans(n_clusters=1, random_state=0).fit(X)
labels = kmeans.predict(X)
print(labels)
print(silhouette_score(X, labels)) # 1 cluster gives ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)
根据这,一个集群的轮廓评分的正确值应为零。
我在这里做错什么了吗?
发布于 2020-07-08 11:34:33
在silhouette_score
文档中,分数以silhouette_coefficient
的方式定义如下:
计算所有样本的平均轮廓系数。 根据每个样本的平均簇内距离(a)和平均最近聚类距离(b)计算轮廓系数。样本的轮廓系数为(b - a) / max(a,b)。为了澄清,b是样本与最近的集群之间的距离,而样本并不是其中的一部分。注意,只有标签数为2 <= n_labels <= n_samples - 1时才定义轮廓系数。
因此,在他们的实现中,他们使用b
,这是样本和最近的集群之间的距离,而样本并不是其中的一部分。根据定义,如果只有一个群集,不允许在多个集群中定义样本,则这将无法工作。因此,它们对大于1的集群数量设置了一个限制。
此外,如果从数学上定义,对于一个簇,剪影得分应该是0,那么为什么要首先计算它呢?
https://stackoverflow.com/questions/62793786
复制相似问题