scikit-learn 1.2.2与1.3.1版本K-Means聚类结果差异咨询
scikit-learn K-Means 1.2.2与1.3.1版本聚类结果不一致问题
我在Python中使用scikit-learn进行K-Means聚类时遇到问题:1.2.2与1.3.1版本的聚类结果不一致,当设置聚类数k=3时差异尤为明显。
测试代码片段
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和fit_predict方法的结果存在差异。查阅scikit-learn更新日志后发现两个版本间有更新,但不确定是否是导致聚类结果差异的原因。
问题:
- scikit-learn 1.2.2与1.3.1的版本差异是否会导致K-Means聚类结果变化?原因是什么?
- 哪个版本的聚类结果应被视为正确?
问题解答
- 版本差异确实会导致K-Means结果变化
scikit-learn 1.3.0版本对K-Means的核心逻辑做了关键调整:
- 重构了
k-means++初始化算法的实现细节,优化了初始化阶段的质心选择逻辑,提升了高维数据下的初始化稳定性 - 修复了旧版本中存在的数值精度问题,避免了部分边缘场景下的迭代偏差
- 即使设置了
random_state=42,由于初始化算法的实现逻辑变更,相同随机种子生成的初始质心位置也会不同,最终导致后续迭代的聚类分配结果出现差异。
- 不存在“绝对正确”的版本,需结合评估指标判断
K-Means是依赖初始质心的局部最优算法,不同初始状态可能收敛到不同的局部极小值,两个版本的结果都是各自实现下的合法收敛结果:
- 若追求更优的聚类稳定性和现代算法优化,1.3.1版本的结果更可靠,其改进后的初始化逻辑能更大概率找到质量更优的聚类划分
- 可通过轮廓系数(silhouette score)、Calinski-Harabasz指数等量化指标对比两个版本的聚类质量,选择指标表现更优的结果
- 若需要和历史分析结果保持一致,可暂时回退到1.2.2版本;若追求长期的算法可靠性,建议升级到1.3.1及以上版本
内容的提问来源于stack exchange,提问作者Yin
相关产品推荐
相关产品推荐

