Scikit Learn - K-Means - 肘部 - 标准

2024-05-10

今天我想学习一些关于 K-means 的知识。我已经了解该算法并且知道它是如何工作的。现在我正在寻找正确的 k...我发现肘部准则作为检测正确的 k 的方法,但我不明白如何将它与 scikit learn 一起使用?!在 scikit learn 中,我以这种方式对事物进行聚类

kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10) 
kmeans.fit(data)

那么我应该对 n_clusters = 1...n 执行多次此操作并观察错误率以获得正确的 k 吗?认为这很愚蠢并且需要花费很多时间?!


如果事先不知道真实标签(如您的情况),那么K-Means clustering可以使用肘部准则或轮廓系数进行评估。

弯头准则法:

肘部方法背后的想法是在给定数据集上针对一系列 k 值运行 k 均值聚类(num_clusters,例如 k=1 到 10),并且对于 k 的每个值,计算误差平方和 (SSE)。

之后,针对每个 k 值绘制 SSE 线图。如果折线图看起来像一条手臂 - 折线图下方的红色圆圈(如角度),则手臂上的“肘部”就是最佳 k 值(簇数)。 在这里,我们希望最小化 SSE。随着 k 的增加,SSE 趋向于向 0 减小(当 k 等于数据集中数据点的数量时,SSE 为 0,因为此时每个数据点都是自己的簇,并且它与簇的中心之间没有误差)其簇)。

所以目标是选择一个small value of k仍然具有较低的 SSE,并且肘部通常代表我们通过增加 k 开始收益递减的位置。

让我们考虑一下虹膜数据集,

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris['feature_names'])
#print(X)
data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]

sse = {}
for k in range(1, 10):
    kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
    data["clusters"] = kmeans.labels_
    #print(data["clusters"])
    sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()

Plot for above code: enter image description here

我们可以在图中看到,3 是 iris 数据集的最佳簇数(红色圆圈),这确实是正确的。



轮廓系数法:

From sklearn文档 http://scikit-learn.org/stable/modules/clustering.html#silhouette-coefficient,

较高的轮廓系数得分与具有更好定义的聚类的模型相关。 Silhouette Coefficient 是为每个样本定义的,由两个分数组成: `

a:样本与同一类中所有其他点之间的平均距离。

b:样本与下一个样本中所有其他点之间的平均距离 最近的簇。

单个样本的轮廓系数如下:

现在,要找到最优值k for KMeans,循环遍历 1..n 中的 n_clustersKMeans并计算每个样本的轮廓系数。

较高的轮廓系数表明该对象与其自身的簇匹配良好,而与邻近的簇匹配较差。

from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

X = load_iris().data
y = load_iris().target
   
for n_cluster in range(2, 11):
    kmeans = KMeans(n_clusters=n_cluster).fit(X)
    label = kmeans.labels_
    sil_coeff = silhouette_score(X, label, metric='euclidean')
    print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))

Output -

对于 n_clusters=2,轮廓系数为 0.680813620271
对于 n_clusters=3,轮廓系数为 0.552591944521
对于 n_clusters=4,轮廓系数为 0.496992849949
对于 n_clusters=5,轮廓系数为 0.488517550854
对于 n_clusters=6,轮廓系数为 0.370380309351
对于 n_clusters=7,轮廓系数为 0.356303270516
对于 n_clusters=8,轮廓系数为 0.365164535737
对于 n_clusters=9,轮廓系数为 0.346583642095
对于 n_clusters=10,轮廓系数为 0.328266088778

正如我们所看到的,n_簇=2具有最高的轮廓系数。这意味着2应该是最佳簇数,对吧?

但这是问题所在。

Iris 数据集有 3 种花,这与最佳簇数 2 种相矛盾。所以尽管n_簇=2具有最高的轮廓系数,我们会考虑n_簇=3作为最佳簇数,因为 -

  1. Iris 数据集有 3 个物种。(最重要的)
  2. n_簇=3具有第二高的轮廓系数值。

所以选择n_簇=3是最优的编号。鸢尾花数据集的簇。

选择最佳编号集群的类型取决于数据集的类型和我们试图解决的问题。但大多数情况下,采用最高的轮廓系数将产生最佳的簇数。

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scikit Learn - K-Means - 肘部 - 标准 的相关文章

随机推荐

  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • RefreshToken 在我获得新的令牌 Google Sheets API 后没有发回

    我正在使用带有 PHP 的 Google Sheets API 并遵循可以在此处找到的快速入门指南https developers google com sheets quickstart php https developers goog
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • JQuery 屏蔽输入插件不起作用

    我已将 JQuery Masked 输入插件添加到我的 Web 项目中 但它根本不起作用 该插件可以在这里找到 http digitalbush com projects masked input plugin http digitalbu
  • 有没有办法从 MySQL 的列中提取与正则表达式匹配的文本?

    例如 如果特定列中的所有条目都具有 a z 0 9 形式 如何仅提取前导字母 以便 asdf123 和 as3456 分别返回 asdf 和 as 这对于 mysql 正则表达式功能来说是不可能的 除非安装一些似乎是为此设计的 udf 从技
  • FB.getLoginStatus() 不起作用

    我正在尝试编写一段代码来检查用户是否登录 发现FBJS API中有一个内置方法 叫做getLoginStatus 我已经在html中实现了它 但出于某种原因 getLoginStatus 内部的alert 不会被触发 我也尝试在 init
  • PHPExcel输出乱码

    我正在尝试 PHPExcel 附带的简单示例 01simple xls 我得到乱码输出 它 LibreOffice 想要导入文件 它认为字符集是西欧 DOS OS2 861 icelandic 输出是这样的
  • 将任何 D3.js 图表与 DC.js 集成

    我试图弄清楚如何轻松地将任何 D3 js 图表与 DC js 库集成 以便在所有图表之间使用交叉过滤功能 我也确实理解以前曾问过这种性质的问题 添加链接以供参考 DC js 监听图表组渲染 https stackoverflow com q
  • 当 tableView 的 allowedMultipleSelectionDuringEditing 属性为 YES 时,如何实现滑动删除功能?

    在 iOS 5 中 如果我设置allowsMultipleSelectionDuringEditing在 UITableView 上设置为 YES 然后滑动删除功能不再起作用 内置的邮件应用程序支持滑动删除和编辑模式下的多项选择 我也想这样
  • Python:如何从文件中的一行读取字符并将它们转换为浮点数和字符串,具体取决于它们是数字还是字母?

    我有一个如下所示的文件 1 1 C C 1 9873 2 347 3 88776 1 2 C Si 4 887 9 009 1 21 我想逐行读取文件的内容 当我使用的行上只有数字时 for line in readlines file d
  • 我应该如何配置 log4net 以写入 Windows XP 和 7 上的 %LOCALAPPDATA%?

    我有一个内部应用程序 它使用 log4net 进行日志记录 我希望在以下位置生成日志 LOCALAPPDATA Vendor App application log 不幸的是 log4net 正在创建日志文件 APPDATA 反而 这不是一
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有
  • iOS7 无法隐藏状态栏

    我刚刚将我的 iPhone 5 iOS 7 升级到了四个测试版 现在 当我在这台 iPhone 上通过 Xcode 5 运行我的应用程序时 状态栏不会隐藏 尽管它应该隐藏 不工作 UIApplication sharedApplicatio
  • Dart 包的条件导入/代码

    有没有办法根据 Dart 中的环境标志或目标平台有条件地导入库 代码 我正在尝试在两者之间切换dart io的 ZLibDecoder ZLibEncoder 类和基于目标平台的 zlib js 有一篇文章介绍了如何创建统一的界面 http
  • 如何生成随机凸多边形?

    我正在尝试设计一种生成随机二维凸多边形的方法 它必须具有以下属性 坐标应该是整数 多边形应位于角为 0 0 和 C C 的正方形内 其中 C 已给出 多边形的顶点数量应接近给定数量 N 例如 生成具有 10 个顶点并位于正方形 0 100
  • 使用 Ruby CSV 标头转换器

    假设我有以下课程 class Buyer lt ActiveRecord Base attr accesible first name last name 以及 CSV 文件中的以下内容 First Name Last Name John
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 有没有办法模拟小部件或屏幕特定位置的触摸?

    我想触摸或点击小部件上的某处 而不让用户在此时明确触摸屏幕 有什么办法可以做到吗 我已经检查了SO答案 有些人建议使用 集成测试 但在未物理或以某种方式连接到笔记本电脑的设备上无法执行 集成测试 无法找到更好的措辞 我还尝试进行 hitTe
  • Scikit Learn - K-Means - 肘部 - 标准

    今天我想学习一些关于 K means 的知识 我已经了解该算法并且知道它是如何工作的 现在我正在寻找正确的 k 我发现肘部准则作为检测正确的 k 的方法 但我不明白如何将它与 scikit learn 一起使用 在 scikit learn