比较 scikit-learn 版本 1.2.2 和 1.3.1 之间的 k 均值聚类结果

Comparing k-means clustering results between scikit-learn versions 1.2.2 and 1.3.1

提问人:Yin 提问时间:10/18/2023 更新时间:10/19/2023 访问量:50

问:

我在 Python 中使用 scikit-learn 进行 k-means 聚类时遇到了一个问题,其中 1.2.2 和 1.3.1 版本之间的聚类结果似乎不一致。

当我将聚类数 (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()

观察到的差异:

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

查询:

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

  • 以下哪个聚类结果应被视为正确?

感谢您的帮助!

python scikit-learn k-means

评论

0赞 DataJanitor 10/18/2023
几天前也有同样的问题,但似乎被删除了:stackoverflow.com/questions/77284835/......

答:

1赞 ogrisel 10/19/2023 #1

版本之间的更改是否比更改给定版本的值重要得多?例如,尝试使用 0 到 99 的random_state值计算聚类的轮廓系数,并计算平均值和标准差。random_state

如果不同版本的变化与改变random_state种子时测量的标准差的顺序相同,则可以认为两个版本同样正确,并且应忽略“轮廓系数”的微小变化。

例如,您还可以以更长的训练时间为代价来增加甚至获得更稳定(和更高质量的结果)。n_initn_init=10n_init=30

最后,您可能希望将 https://github.com/gittar/breathing-k-means 视为一种更稳定的替代方法,而不是 scikit-learn 中默认实现的传统算法。KMeans