首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么scikit学习silhouette_score为一个集群返回一个错误?

为什么scikit学习silhouette_score为一个集群返回一个错误?
EN

Stack Overflow用户
提问于 2020-07-08 11:27:44
回答 1查看 1.5K关注 0票数 3

一个聚类(K = 1)可能是K-均值聚类中K值不同的一种有效的、最适合的聚类。在scikit中的"silhouette_score“(v0.23.1)似乎不适用于一个集群,并且会产生一个意外的错误。

下面是要复制的代码:

代码语言:javascript
复制
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)

根据,一个集群的轮廓评分的正确值应为零。

我在这里做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,那么为什么要首先计算它呢?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62793786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档