提问人:Yin 提问时间:10/18/2023 更新时间:10/19/2023 访问量:50
比较 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
问:
我在 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 均值聚类结果的差异?造成差异的原因是什么?
以下哪个聚类结果应被视为正确?
感谢您的帮助!
答:
1赞
ogrisel
10/19/2023
#1
版本之间的更改是否比更改给定版本的值重要得多?例如,尝试使用 0 到 99 的random_state值计算聚类的轮廓系数,并计算平均值和标准差。random_state
如果不同版本的变化与改变random_state种子时测量的标准差的顺序相同,则可以认为两个版本同样正确,并且应忽略“轮廓系数”的微小变化。
例如,您还可以以更长的训练时间为代价来增加甚至获得更稳定(和更高质量的结果)。n_init
n_init=10
n_init=30
最后,您可能希望将 https://github.com/gittar/breathing-k-means 视为一种更稳定的替代方法,而不是 scikit-learn 中默认实现的传统算法。KMeans
评论