python - 为什么这个 Iris 数据集上的 silhouette_score 总是返回 0?
问题描述
我正在测试 Scikitlearn 的一些功能,虽然他们的示例对我来说很好,并返回一个数字作为剪影,但当我在 Iris 数据集上执行等效操作时,它显示了一个聚类,然后总是输出 0 作为剪影平均值:
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
iris = datasets.load_iris()
print(dir(iris))
print(iris.DESCR)
#print(iris.data[:,1:3]) second and third part of each, columns.
X = iris.data[:, 1:3]
for i in range(2,11):
model = KMeans(n_clusters=i, random_state=0)
model.fit(X)
#print(model.labels_) #Different number for each "cluster" found.
centroids = model.cluster_centers_
#Separate xs [:, 0], ys [:,1] and scatter plot:
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=170, zorder=10, c='m')
plt.scatter(X[:, 0], X[:, 1], c=model.labels_)
#print(plt.scatter.__doc__) # <--- what are the arguments?
plt.xlabel("Sepal width")
plt.ylabel("Petal length")
print(X)
print(model.labels_)
print('For %d clusters the average silhouette score is %d' % (i, silhouette_score(X, model.labels_)))
plt.show()
为什么要这样做,因为它似乎给了它一个与 Scikit 示例类似的 X 数组和标签?
解决方案
将您的打印语句切换为:
print('For %f clusters the average silhouette score is %f' % (i, silhouette_score(X, model.labels_)))
或者:
print('For {} clusters the average silhouette score is {}'.format(i, silhouette_score(X, model.labels_)))
或者:
print(f"For {i} clusters the average silhouette score is {silhouette_score(X, model.labels_)}")
...解决问题。
正如@shahaf 在评论中所说,您正在从 float 转换为 int (%d)。
推荐阅读
- brightway - 在允许多个用户的服务器上安装 Brightway 的最佳方式、数据库的集中存储、可共享性
- cookiecutter - 是否可以在不创建本地文件夹的情况下运行 Cookiecutter 模板文件?
- laravel - 覆盖 laravel 强化 TwoFactorLogin
- performance - 实体是否需要一个特殊的库才能在 Netbeans 中编译?
- python - 从 Pandas 写入数据时在 Excel 中获取类别“日期”
- javascript - 理解 javascript 赋值语法的问题
- python - 如何重新定位matplotlib图例而不改变地块
- c++ - 无法从 .txt 文件中读取西里尔字母
- javascript - 是否可以使用 If 语句检测两个 div 是否相交?
- f# - F# - 如何将数组转换为 nativeptr