我遇到了一个问题,那就是在Python1.2.2和1.3.1版本之间使用SCISKIT-LEARN进行k-Means集群时,集群结果似乎不一致.

当我将集群数量(K)设置为3时,两个版本的集群结果不一致.

下面是一段代码(使用Toy数据集):

from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_samples, silhouette_score
from sklearn.cluster import KMeans
import numpy as np

digits = load_digits()
X = digits.data

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

kmeans = KMeans(n_clusters=3, random_state=42)
cluster_labels = kmeans.fit_predict(X_scaled)

sample_silhouette_values = silhouette_samples(X_scaled, cluster_labels)
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
y_lower = 10  

sil_score = silhouette_score(X_scaled, cluster_labels)

for i in range(3): 
    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
    ith_cluster_silhouette_values.sort()
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i
    ax.fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_silhouette_values, alpha=0.7)
    ax.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
    y_lower = y_upper + 10  

ax.set_xlabel("The silhouette coefficient values")
ax.axvline(x=sil_score, color="red", linestyle="--")
ax.set_title(f"Silhouette analysis for KMeans clustering with n_clusters = {i}")
ax.set_title("Silhouette plot for the various clusters")
plt.show()

Discrepancies Observed:

我们注意到fit和fit_predict方法的结果存在差异. 在查看scikit-learn的更新日志(log)时,我观察到这两个版本之间确实有更新.然而,我不确定这些变化是否是我们聚类结果差异背后的原因.

Queries:

  • SCRICKIT-LEARN 1.2.2和1.3.1之间的版本差异是否会导致k-均值聚类结果的差异?造成这种差异的原因是什么?

  • 这些集群结果中的哪些应该被认为是正确的?

感谢您的帮助!

推荐答案

版本之间的更改比更改给定版本的random_state值重要得多吗?例如,try 计算RANDOM_STATE值从0到99的集群的轮廓系数,并计算平均值和标准差.

如果跨版本的更改与更改RANDOM_STATE种子时测量的标准偏差的量级相同,则可以认为这两个版本都是同样正确的,并且您应该忽略轮廓系数的微小变化.

您还可以将n_init增加到n_init=10甚至n_init=30,以获得更稳定(和更高质量的结果),但代价是训练时间更长.

最后,您可能想要了解一下https://github.com/gittar/breathing-k-means,它是一个传统KMeans算法的更稳定的替代方案,而传统的KMeans算法默认是在SCRICKIT-LEARN中实现的.

Python相关问答推荐

pyramid 内部数组中的连续序列-两极

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

如何使用scipy从频谱图中回归多个高斯峰?

如何让剧作家等待Python中出现特定cookie(然后返回它)?

使用miniconda创建环境的问题

运行总计基于多列pandas的分组和总和

将两只Pandas rame乘以指数

如何找到满足各组口罩条件的第一行?

从dict的列中分钟

运输问题分支定界法&

将输入聚合到统一词典中

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Scrapy和Great Expectations(great_expectations)—不合作

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何使用SentenceTransformers创建矢量嵌入?

从Windows Python脚本在WSL上运行Linux应用程序

在Python中使用if else或使用regex将二进制数据如111转换为001""

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

比较两个有条件的数据帧并删除所有不合格的数据帧

操作布尔值的Series时出现索引问题