python - 如何在 python 中使用 scikit 找到 K-Means 聚类的 k 值
问题描述
我有一个看起来像这样的 Pandas DataFrame:
1 2 3 4 5 6 7 8 9 10 11 ... 467 468 469 470 471 472 473 474 475 476 477
1 1.000000 0.014085 0.134615 0.053030 0.109756 0.092105 0.095238 0.058824 0.104167 0.043478 0.135135 ... 0.045752 0.084112 0.098039 0.060870 0.000000 0.127273 0.043716 0.084615 0.068323 0.122449 0.172414
2 0.014085 1.000000 0.026667 0.039735 0.038095 0.074468 0.134021 0.084337 0.092593 0.184211 0.030303 ... 0.092025 0.107438 0.120690 0.021898 0.098361 0.176471 0.105820 0.127660 0.085714 0.132743 0.100000
3 0.134615 0.026667 1.000000 0.058824 0.054945 0.011494 0.089888 0.040541 0.078947 0.040541 0.141026 ... 0.050955 0.052174 0.063636 0.016000 0.000000 0.098361 0.048128 0.057971 0.072727 0.074766 0.068182
4 0.053030 0.039735 0.058824 1.000000 0.113924 0.056604 0.059880 0.039735 0.094170 0.039735 0.076433 ... 0.113636 0.104396 0.070652 0.072539 0.015152 0.042553 0.108434 0.081340 0.070833 0.059783 0.083333
5 0.109756 0.038095 0.054945 0.113924 1.000000 0.237113 0.102564 0.048077 0.120000 0.101010 0.090090 ... 0.064865 0.077465 0.111940 0.152174 0.011765 0.076087 0.070423 0.126582 0.082902 0.139535 0.145695
.. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
473 0.043716 0.105820 0.048128 0.108434 0.070423 0.062802 0.150754 0.123656 0.333333 0.100000 0.110553 ... 0.178571 0.258706 0.257576 0.074689 0.033333 0.137143 1.000000 0.235556 0.202335 0.187500 0.147059
474 0.084615 0.127660 0.057971 0.081340 0.126582 0.118421 0.209459 0.074324 0.294737 0.135714 0.285714 ... 0.165094 0.215569 0.326667 0.071795 0.054264 0.221311 0.235556 1.000000 0.269608 0.287582 0.225275
475 0.068323 0.085714 0.072727 0.070833 0.082902 0.069149 0.337580 0.117647 0.259091 0.172840 0.286624 ... 0.139344 0.187817 0.204188 0.048035 0.050314 0.111111 0.202335 0.269608 1.000000 0.280899 0.175926
476 0.122449 0.132743 0.074766 0.059783 0.139535 0.130081 0.345455 0.132743 0.343750 0.361702 0.166667 ... 0.173913 0.312977 0.302326 0.059524 0.071429 0.229167 0.187500 0.287582 0.280899 1.000000 0.246753
477 0.172414 0.100000 0.068182 0.083333 0.145695 0.122449 0.200000 0.076923 0.248705 0.157895 0.144828 ... 0.157895 0.222222 0.220126 0.133333 0.065041 0.142857 0.147059 0.225275 0.175926 0.246753 1.000000
这是一个示例,但其他 DataFrame 的行数和列数可能会有所不同。我需要在 scikit 中使用 K-Means 对值进行聚类,但我不知道如何为我的数据帧找到正确的聚类数。有什么建议吗?此外,由于我是 python 新手,并且这是我第一次使用 sci-kit,因此非常感谢任何关于如何执行 K-Means 聚类的简单解释。
解决方案
很常见的是 Elbow 方法(https://www.geeksforgeeks.org/elbow-method-for-optimal-value-of-k-in-kmeans/),您可以将数据拟合到 KMeans 模型并使用 .惯性属性来创建一个具有聚类值的图。
#Creating models for k from 2 to 14
inertia = []
for k in range(2,15):
model = KMeans(n_clusters=k, random_state=12).fit(df)
inertia.append(model.inertia_)
#Plotting the inertia of the models
k_values = range(2,15)
plt.plot(k_values, inertia, 'o-')
plt.xlabel('Number of Clusters')
plt.ylabel('Inertia')
您应该看到与此类似的内容,这表明对于我为此练习创建的特定数据框,理想的 K 值将是 3,因为这是您看到“肘部”的地方 - 并且以下 k 值不会带来惯性变化很大:
推荐阅读
- azure - Azure Log Analytics 和 Azure App Service Access Logs,可以连接吗?
- visual-studio - grid-template-columns alternatives
- python - 如何在更改的日志文件中搜索 Python 中的字符串?
- scala - 带有scala的spark2.2.0中的Regexp_extract抛出错误
- enums - 枚举中冲突的“名称”声明
- html - 静态视口宽度
- javascript - 为什么 JQuery $.post 提交两次?
- c++ - 如何在 autoconf 中为 clang 检查支持编译标志
- ruby-on-rails - 基于条件和来自不同数组的部分渲染
- qt - 具有两个不同边框和自定义半径的 QML 按钮