使用KElbowVisualizer时遇AttributeError: 'KMeans'无'k'属性问题求助
问题:使用KElbowVisualizer结合轮廓系数优化KMeans聚类数遇错
问题背景
我找到过完全相似的问题,但给出的解决方案无效,且有其他用户指出原答案存在错误,原提问者未回应疑问,因此再次求助。需求是用yellowbrick的KElbowVisualizer结合轮廓系数(silhouette),为scikit-learn的KMeans算法寻找最优聚类数。
已尝试方案
- 将参数
k改为n_cluster或n_clusters,错误信息无变化,问题未解决; - 将elbow_method函数结果存入变量(参考相似问题答案),无效。
测试数据
import numpy as np data = np.array([[146162.56679954], [137227.54181954], [126450.29169228], [119435.56512675], [114988.18682806], [111546.74599395], [111521.9739634 ], [110335.78734103], [105098.20650161], [ 99178.48409528], [ 93982.20860075], [ 91453.21097512], [ 94160.32926255], [102299.29173218], [114540.38664748], [122133.18759654], [121756.94400854], [118709.47518003], [119216.20443483], [122172.5736574 ], [122433.8120907 ], [120599.22092939], [118789.73304299], [119107.28063106], [123920.58809778], [128772.96569855], [131502.10371984], [129525.67885428], [123411.68604418], [120263.05106831], [114844.47942828], [108214.07115472], [101822.69619871], [ 94871.33385049], [ 91251.9375137 ], [ 90058.80745747], [ 93606.20700239], [101044.76675943], [109125.2713446 ], [112272.386321 ], [104429.87179175], [ 90827.50408907], [ 80805.43033707], [ 76165.48417937], [ 75002.04576279], [ 75428.52404817], [ 77444.72355588], [ 80389.43621805], [ 83401.15424418], [ 87638.20462011]])
聚类数寻找代码
from sklearn.cluster import KMeans from yellowbrick.cluster import KElbowVisualizer # 将结果存入变量visualizer(参考相似问题答案) visualizer = KElbowVisualizer(KMeans(), k=11, metric='silhouette', timings= True) visualizer.fit(data)
报错信息与异常现象
运行后抛出错误:
AttributeError: 'KMeans' object has no attribute 'k'
同时出现两个异常现象:
- 意外生成未请求的图表;
- 设置
timings=True后无计时信息显示。
环境信息
- yellowbrick版本:1.4
- scikit-learn版本:1.1.1
- 运行环境:VSCode、Jupyter Notebook(Anaconda),两处结果一致。
解决方案
问题根源在于yellowbrick 1.4与scikit-learn 1.1.1的兼容性,以及参数传递格式错误。修改后的代码如下:
from sklearn.cluster import KMeans from yellowbrick.cluster import KElbowVisualizer # 指定聚类数范围为2到10(左闭右开,k=(2,11)表示测试2-10) visualizer = KElbowVisualizer( KMeans(random_state=42), # 添加随机种子保证结果可复现 k=(2, 11), # 必须传递范围而非单个数值 metric='silhouette', timings=True ) visualizer.fit(data) visualizer.show() # 显式调用控制图表显示
关键修改说明
k=(2,11):KElbowVisualizer要求k参数为范围(元组),单个数值会触发内部逻辑错误,尝试访问KMeans不存在的k属性。此处表示测试聚类数从2到10。random_state=42:给KMeans添加随机种子,确保每次运行结果一致,便于调试。visualizer.show():显式调用显示图表,避免自动生成未预期的图表,同时timings=True的计时信息会在图表下方正常显示。
如果计时信息仍不显示,建议升级yellowbrick到最新版本(如1.5+),新版本修复了旧版本的兼容性bug,对scikit-learn的支持更完善。
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

