kmeans聚类选择最优K值python实现

2023-05-16

Kmeans算法中K值的确定是很重要的。

下面利用python中sklearn模块进行数据聚类的K值选择
数据集自制数据集,格式如下:
这里写图片描述

①手肘法
手肘法的核心指标是SSE(sum of the squared errors,误差平方和),

这里写图片描述

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

python代码:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import xlrd

# 从Excel中读取数据存入数组
rawData = xlrd.open_workbook('kmeansdata.xlsx')
table = rawData.sheets()[0]
data = []
for i in range(table.nrows):
    if i == 0:
        continue
    else:
        data.append(table.row_values(i)[1:])
featureList = ['Age', 'Gender', 'Degree']
mdl = pd.DataFrame.from_records(data, columns=featureList)

# '利用SSE选择k'
SSE = []  # 存放每次结果的误差平方和
for k in range(1, 9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(np.array(mdl[['Age', 'Gender', 'Degree']]))
    SSE.append(estimator.inertia_)
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()

效果图:
这里写图片描述

显然,肘部对于的k值为3,故对于这个数据集的聚类而言,最佳聚类数应该选3。

②轮廓系数法
该方法的核心指标是轮廓系数(Silhouette Coefficient),某个样本点Xi的轮廓系数定义如下:
这里写图片描述
其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。而最近簇的定义是
这里写图片描述

其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。

求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

python代码:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import xlrd

# 从Excel中读取数据存入数组
rawData = xlrd.open_workbook('kmeansdata.xlsx')
table = rawData.sheets()[0]
data = []
for i in range(table.nrows):
    if i == 0:
        continue
    else:
        data.append(table.row_values(i)[1:])
featureList = ['Age', 'Gender', 'Degree']
mdl = pd.DataFrame.from_records(data, columns=featureList)


Scores = []  # 存放轮廓系数
for k in range(2, 9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(np.array(mdl[['Age', 'Gender', 'Degree']]))
    Scores.append(silhouette_score(np.array(mdl[['Age', 'Gender', 'Degree']]), estimator.labels_, metric='euclidean'))
X = range(2, 9)
plt.xlabel('k')
plt.ylabel('轮廓系数')
plt.plot(X, Scores, 'o-')
plt.show()

效果图:

这里写图片描述
说明:建议比较两个方法选出的K值,如果没有特殊情况的话,建议首先考虑用手肘法。

参考资料:https://blog.csdn.net/qq_15738501/article/details/79036255

姊妹篇:python进行kmeans聚类

http://www.omegaxyz.com/2018/08/28/python%e5%88%a9%e7%94%a8sklearn%e8%bf%9b%e8%a1%8ckmeans%e8%81%9a%e7%b1%bb/
更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

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

kmeans聚类选择最优K值python实现 的相关文章

随机推荐

  • Python使用matplotlib画动态图

    机器学习需要使用python实现相应的算法 xff0c 因此学习了Matplotlib中的画图 更多内容访问omegaxyz com 当然为了能显示机器学习中每次迭代的效果与收敛速度 xff0c 需要画出动态图形 下面给出两个例子 xff0
  • JavaScript模拟终端输出

    利用JavaScript 43 CSS能够模拟出终端输入画面 xff08 类似于Linux终端画面 xff09 当然更好的代码也可以模拟出黑客帝国那样的输出画面 CSS设置 xff1a height auto表示随着输出字数的增加 xff0
  • 机器学习分类与回归

    分类 xff0c 即classification xff1a a process in which you put something into the group or class it belongs to xff0c 这是指将某物放入
  • 边缘计算与嵌入式系统

    文章目录 边缘计算简介 边缘计算的起源 嵌入式系统与边缘计算 3 1 嵌入式系统概述 3 2 嵌入式系统的发展历史 3 3 嵌入式系统应用到边缘计算 3 4 嵌入式硬件的要求 3 5 边缘计算环境下嵌入式系统与人工智能 观点与看法 4 1
  • QQ聊天记录多角度分析Python实现

    简介 有时候我们想看看自己跟另一个人的时长 频率 时间等或者是聊天过程中谁更在乎谁多一点 xff0c 谁是话痨 xff0c 聊天性格怎么样 xff0c 这时就需要一个聊天记录分析的程序 下面的Python代码能够统计聊天记录中的时间 消息次
  • VUE axios 加载中提示封装

    import axios from 39 axios 39 引入axios以及element ui中的loading和message组件 import MessageBox Indicator from 39 mint ui 39 超时时间
  • 百度文库下载器Python实现

    简介 以前可以用学校的企业账户下载文档 xff0c 后来百度文库改版 xff0c 需要买下载券或者会员 因此需要一个百度文库下载器 之前有冰点文库下载器但是后来不好使了 下面给出利用Python写的百度文库下载器 此下载器可以下载doc类型
  • 特征离散化概述

    定义 连续特征离散化是采取各种方法将连续的区间划分为小的区间 xff0c 并将这连续的小区间与离散值关联起来 连续特征离散化的本质是 xff1a 决定选择多少个分割点和确定分割点的位置 背景 连续数据经常采用离散化处理之后再放入模型 离散化
  • 汇编语言辗转相除法求最大公约数

    辗转相除法 xff0c 又名欧几里德算法 xff08 Euclidean algorithm xff09 xff0c 是求最大公约数的一种方法 它的具体做法是 xff1a 用较小数除较大数 xff0c 再用出现的余数 xff08 第一余数
  • JavaScript入门

    什么是JavaScript JavaScript xff0c 也称ECMAScript xff0c 是一种基于对象和事件驱动并具有相对安全性并广泛用于客户端网页开发的脚本语言 xff0c 同时也是一种广泛用于客户端Web开发的脚本语言 Ja
  • 基于互信息的特征选择算法MATLAB实现

    在概率论和信息论中 xff0c 两个随机变量的互信息 xff08 Mutual Information xff0c 简称MI xff09 或转移信息 xff08 transinformation xff09 是变量间相互依赖性的量度 不同于
  • 海明码汇编语言实现

    海明码简介 海明码其性能是检测一位错 xff0c 是在奇偶校验码的思想上发展起来的 xff0c 它在K位数据位中加入r个校验位 xff0c 形成一个K 43 r位的新码字 xff0c 并且将数据的每个二进制位分配到几个不同的奇偶校验组中 这
  • Linux通过Shell进行数学运算

    在Bash shell环境中 xff0c 可以利用let 和 来执行基本的算术操作 而高级的算术操作可以使用expr和bc这两个工具 let let操作 xff1a let命令可以直接执行基本的算术操作 xff0c 当使用let时 xff0
  • HTML常用标签

    简介 文本标记语言 xff0c 即HTML xff08 Hypertext Markup Language xff09 xff0c 是用于描述网页文档的一种标记语言 HTML之所以称为超文本标记语言 xff0c 是因为文本中包含了所谓 超级
  • HTML5与HTML4区别

    什么是html5呢 xff1f html5最先由WHATWG Web 超文本应用技术工作组 命名的一种超文本标记语言 xff0c 随后和W3C的xhtml2 0 标准 相结合 xff0c 产生现在最新一代的超文本标记语言 可以简单点理解成
  • 列向量互信息计算通用MATLAB代码

    互信息的定义 正式地 xff0c 两个离散随机变量 X 和 Y 的互信息可以定义为 xff1a 其中 p x y 是 X 和 Y 的联合概率分布函数 xff0c 而p x 和p y 分别是 X 和 Y 的边缘概率分布函数 其中 p x y
  • 面向初学者的 Python IDE:Thonny,你值得一试

    Thonny xff0c 这个号称为初学者打造的 IDE 体验怎么样 xff1f 简介 Python 的初学者面对的第一个勉强称得上是 IDE 的肯定是自带的 IDLE 了 我还专门写了一篇文章分析过 xff0c 但是这个工具实在有点古老
  • Python3 OpenCV

    OpenCV是一个基于BSD许可 xff08 开源 xff09 发行的跨平台计算机视觉库 xff0c 可以运行在Linux Windows Android和Mac OS操作系统上 它轻量级而且高效 由一系列 C 函数和少量 C 43 43
  • 基于非支配排序的多目标PSO算法

    这一篇是Xue Bing在一区cybernetics发的论文 xff0c 里面提出了两个多目标PSO特征选择算法 xff0c 一个是NSPSO另一个是CMDPSO 其中NSPSO是参考了NSGA2的框架和思想 下面具体说说NSPSO 非支配
  • kmeans聚类选择最优K值python实现

    Kmeans算法中K值的确定是很重要的 下面利用python中sklearn模块进行数据聚类的K值选择 数据集自制数据集 xff0c 格式如下 xff1a 手肘法 手肘法的核心指标是SSE sum of the squared errors