KMeans算法

2023-11-10

无监督问题,将相似的样本分到一组,难点是如何评估和调参
注意!!!!!!!:对输入数据进行标准化很重要!!!!
it is important to scale the input features.虽然不能保证所有的cluster被聚类的很好,但是通常会改善一些。

一、基本概念

工作原理:

  1. 选取k个点作为初始的类中心点,这些点一开始都是从数据集中随机抽取的
  2. 将每个点分配到最近的类中心点,这样就形成了k个类,然后重新计算每个类的中心点
  3. 重复第二步,直到类不发生变化,或者设置最大迭代数,只要达到最大迭代次数就会结束聚类

质心:centroid,均值,即向量各维取平均值,中心点
距离的度量: 常用欧几里得距离和余弦相似度(要先标准化操作)
优化目标:对所有的K簇进行优化(每个簇里要优化每个样本点x到中心点c的距离越小越好)
在这里插入图片描述

Kmeans算法做出来的分类结果很大程度上由起始centroid决定。如果起始中心点设置不好,最终的结果也只能是局部最优。

二、Centroid Initialization Methods

  1. 可以试着将大概的各个cluster的中心点,输入到算法中。(比如说之前用了其他的聚类算法得到的中心点)
  2. 可以多跑几次,使用不同的随机起始中心点。然后选取最优的。在sklearn中由n_init控制
    如何衡量聚类结果是最优的呢?叫做inertia [ɪˈnɜːrʃə] :mean squared distance between each instance and its closest centroid
    通过Kmeans.inertia_ 调用或者Kmeans.score(x) 会得到负的inertia值(great is better)
  3. 通常初始中心点生成使用 K-Means++ 方法。不需要改成random。

三、Mini-Batch K-Means

K-Means算法在Sklearn中默认采用accelerated K-Means:避免不必要地距离计算

如果要用最原始地K-Means算法可以将 algorithm参数调成'full'

Mini-batch:
不用所有的数据集进行迭代,而是使用小批量的数据。每轮使用小批量数据迭代后,centroid只移动一点点

from sklearn.cluster import MiniBatchKMeans

minibatch_kmeans = MiniBatchKMeans(n_clusters=5)
minibatch_kmeans.fit(X)

Mini-Batch 比原版的运算更快,但inertia(一种聚类的评估指标)会更差一些,尤其当clusters增多时
在这里插入图片描述

四、找寻最优的聚类数量

4.1 拐点

一般来说我们并不知道有多少个聚类K。如果只用inertia单纯的衡量聚类的好坏,是不够的!!
因为随着K聚类的不断地增加,inertia必定减少
The inertia is not a good performance metric when trying to choose k since it keeps getting lower as we increase k. Indeed, the more clusters there are, the closer each instance will be to its closest centroid, and therefore the lower the inertia will be.
在这里插入图片描述
可以看出k=4 是一个拐点,尽管k=5是最优解,但很靠近了。拐点左边的K值没必要在测试了,可以测拐点右边的K值。(这个方法来选择最优的K值是很粗糙的)

4.2 silhouette score 轮廓分数

[ˌsɪluˈet]
silhouette score = (b – a) / max(a, b)
ai:计算样本i到同簇其他样本的平均距离。ai越小,说明样本i越应该被聚类到该簇。将ai称为样本i的簇内不相似度
bi: 计算样本i到其他簇的所有样本的平均距离,bi是这些平均距离中的最小值!!!bi =min{b1, b2, bik}
在这里插入图片描述

s值越接近1越好,取值是[-1,1] ,接近于0,说明此时的样本靠近聚类边界,-1说明很可能被分错了

from sklearn.metrics import silhouette_score
silhouette_score(X, kmeans.labels_)

一种更具有信息的可视化方法是,将每个样本的silhouette 系数画出来,并按照所分配的cluster进行排序
在这里插入图片描述

红色的虚线代表所有cluster的silhouette score的平均值,当在一个cluster中的大部分样本的silhouette score低于这个红线值时,那么这个cluster聚类是相当差的,这意味着它的样本要更接近于其他的cluster。

上图可以看出当k=3和k=6时,有坏的cluster。
k=4,和k=5时的cluster看起来不错:大部分的样本silhouette score超过了红线。
然而仔细看k=4时,index=1,那个橙色的cluster里有更多的样本,显得很粗,而k=5的各个簇的样本数量看上去更平均。所以尽管总体silhouette score,k=4要超过k=5,我们更愿意选择k=5.
https://blog.csdn.net/sinat_29957455/article/details/80113972

五、Kmeans的优缺点

优点是:简单,运算速度快和可扩展,适合常规数据集,然而K-means并不是完美的。
缺点:K值很难确定!它必须跑很多次来避免局部最优。复杂度与样本数量呈线性关系
而且当clusters的形状很怪异时,各个cluster的大小不一时,密度不同时,K-Means的效果并不好。如果初始值中心点生成不好,结果会很差!

六、利用Kmeans做preprocessing

在特征工程时加入一列Kmeans聚类得来的聚类标签,利用GridSearchCV找到最优的K值,来看看通过Kmean聚类后是否会比原始的数据更好

from sklearn.model_selection import GridSearchCV

param_grid = dict(kmeans__n_clusters=range(2, 100))
grid_clf = GridSearchCV(pipeline, param_grid, cv=3, verbose=2)
grid_clf.fit(X_train, y_train)

在这里插入图片描述

七、利用K-Means进行图像压缩。

对数据分析无用,可以省略,在网易云课堂里有教。

八、代码

8.1 聚类

#标准化,要尝试min-max和zscore两种
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_zscore = scaler.fit_transform(data)
#from sklearn.preprocessing import MinMaxScaler
#minmax = MinMaxScaler()
#data_minmax = minmax.fit_transform(data)

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3,random_state=0)
kmeans.fit(data_zscore)
cluster_labels = kmeans.predict(data_zscore)

#将得到的聚类标签粘到原数据上
data['Cluster'] = cluster_labels

8.2 inertia拐点评估聚类的好坏

#https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans
#用来存放设置不同簇数时的SSE值
distortions = []
for i in range(1,8):
    km = KMeans(n_clusters=i,init="k-means++",n_init=10,max_iter=300,tol=1e-4,random_state=0)
    km.fit(data_zscore)
    #获取K-means算法的SSE
    distortions.append(km.inertia_)

#绘制曲线
plt.plot(range(1,8),distortions,marker="o")
plt.xlabel("Number of Cluster")
plt.ylabel("Inertia(SSE)")
plt.show()

在这里插入图片描述

8.3 轮廓曲线判断聚类的好坏

kmeans = KMeans(n_clusters=2,init="k-means++",n_init=10,max_iter=300,tol=1e-4,random_state=0)
from sklearn.metrics import silhouette_samples
cluster_label = kmeans.fit_predict(data_zscore) #获取每个样本的cluster标签
from matplotlib import cm

#获取簇的标号
unique_label = np.unique(cluster_label)
#获取簇的个数
n_clusters = unique_label.shape[0]
#基于欧式距离计算轮廓系数
silhoutte_vals = silhouette_samples(data_zscore,cluster_label,metric="euclidean")

y_ax_lower,y_ax_upper=0,0
yticks=[]    
for i,c in enumerate(unique_label):
    #获取不同簇的轮廓系数
    c_silhouette_vals = silhoutte_vals[cluster_label == c]
    #对簇中样本的轮廓系数由小到大进行排序
    c_silhouette_vals.sort()
    #获取到簇中轮廓系数的个数
    y_ax_upper += len(c_silhouette_vals)
    #获取不同颜色
    color = cm.jet(i / n_clusters)
    #绘制水平直方图
    plt.barh(range(y_ax_lower,y_ax_upper),c_silhouette_vals,height=1.0,edgecolor="none",color=color)
    #获取显示y轴刻度的位置
    yticks.append((y_ax_lower+y_ax_upper) / 2)
    #下一个y轴的起点位置
    y_ax_lower += len(c_silhouette_vals)
    
#获取轮廓系数的平均值
silhouette_avg = np.mean(silhoutte_vals)
#绘制一条平行y轴的轮廓系数平均值的虚线
plt.axvline(silhouette_avg,color="red",linestyle="--")
#设置y轴显示的刻度
plt.yticks(yticks,cluster_labels+1)
plt.ylabel("Cluster")
plt.xlabel("Silhouette Score")
plt.show()

在这里插入图片描述

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

KMeans算法 的相关文章

  • Python学习2——DBSCAN聚类算法

    一 原理 参考博文 xff1a DBSCAN聚类算法Python实现 徐奕的专栏 CSDN博客 dbscan python https blog csdn net xyisv article details 88918448 DBSCAN是
  • [转]DBSCAN聚类算法——机器学习(理论+图解+python代码)

    原文链接 xff1a https blog csdn net huacha article details 81094891 一 前言 二 DBSCAN聚类算法 三 参数选择 四 DBSCAN算法迭代可视化展示 五 常用的评估方法 xff1
  • 【机器学习】DBSCAN聚类算法(含Python实现)

    文章目录 一 算法介绍二 例子三 Python实现3 1 例13 2 算法参数详解3 3 鸢尾花数据集 一 算法介绍 DBSCAN xff08 Density Based Spatial Clustering of Applications
  • K-means聚类算法

    K means 是我们最常用的基于欧式距离的聚类算法 xff0c 其认为两个目标的距离越近 xff0c 相似度越大 本文大致思路为 xff1a 先介绍经典的牧师 村名模型来引入 K means 算法 xff0c 然后介绍算法步骤和时间复杂度
  • DBSCAN聚类算法

    DBSCAN是一种非常著名的基于密度的聚类算法 其英文全称是 Density Based Spatial Clustering of Applications with Noise xff0c 意即 xff1a 一种基于密度 xff0c 对
  • sklearn专题六:聚类算法K-Means

    目录 1 概述 1 1 无监督学习与聚类算法 1 2 sklearn中的聚类算法 2 KMeans 2 1 KMeans是如何工作的 2 2 簇内误差平方和的定义和解惑 2 3 KMeans算法的时间复杂度 3 sklearn cluste
  • Python 机器学习8:sklearn 聚类算法

    1 K Means算法是一种广泛使用的聚类算法 from sklearn cluster import KMeans K Means是聚焦于相似的无监督的算法 xff0c 以距离作为数据对象间相似性度量的标准 xff0c 即数据对象间的距离
  • K-means聚类算法 伪代码 python3代码

    K means 算法及其代码 K means算法介绍K means 伪代码K means python 代码 K means算法介绍 链接 模式识别 聚类分析 K means 伪代码 计算两个点之间的欧式距离 span class toke
  • 机器学习(二):聚类算法1——K-means算法

    Kmeans是一种经典的聚类算法 xff0c 所谓聚类 xff0c 是指在没有给出目标的情况下 xff0c 将样本根据某种关系分为某几类 那在kmeans中 xff0c 是根据样本点间的距离 xff0c 将样本n分为k个类 K means实
  • k-均值(k-means)及Matlab动态实现

    k 均值 k means 及Matlab实现 注 1 仅适合于数值属性的数据 2 对正态分布 高斯分布 数据聚类效果最佳 1 算法思想 k means算法 也称k 均值算法 它把N个对象划分成k个簇 用簇中对象的均值表示每个簇的中心点 质心
  • Open3D DbScanClustering聚类算法及聚类分簇可视化及存储

    DBSCAN聚类算法 是基于密度的聚类算法 该算法需要两个参数 labels np array pcd cluster dbscan eps 0 02 min points 10 print progress True 入参 eps 定义到
  • 机器学习——聚类算法k-means

    机器学习 聚类算法k means 常见的聚类算法 k means算法 k 均值算法 由簇中样本的平均值来代表整个簇 文章目录 机器学习 聚类算法k means 聚类分析概述 一 k means背景 二 k means算法思想 1 k mea
  • 机器学习——聚类——密度聚类法——OPTICS

    目录 理论部分 1 1 提出背景 1 2 OPTICS算法 1 2 1 基本概念 1 2 2 算法流程 1 2 3 优点 1 2 4 缺点 1 3 其它算法 代码部分 2 1 自行实现 2 2 sklearn实现 理论部分 1 1 提出背景
  • 数据挖掘十大算法(二):K-means聚类算法原理与实现

    参考 1 机器学习 KMeans聚类 K值以及初始类簇中心点的选取 2 K Means算法的研究分析及改进 一 K means算法原理 K means算法是最常用的一种聚类算法 算法的输入为一个样本集 或者称为点集 通过该算法可以将样本进行
  • 机器学习--聚类(12)

    一 基本概念 聚类的概念 一种无监督的学习 事先不知道类别 自动将相似的对象归到同一个簇中 应用场景 文档分类器 客户分类 保险欺诈检测 乘车数据分析 二 距离计算 对于有序距离 其中P 1为曼哈顿距离 P 2为欧氏距离 对于无序距离 使用
  • KMeans算法

    目录 一 基本概念 二 Centroid Initialization Methods 三 Mini Batch K Means 四 找寻最优的聚类数量 4 1 拐点 4 2 silhouette score 轮廓分数 五 Kmeans的优
  • Python机器学习之k-means聚类算法

    1 引言 所谓聚类 就是按照某个特定的标准将一个数据集划分成不同的多个类或者簇 使得同一个簇内的数据对象的相似性尽可能大 同时不再一个簇内的数据对象的差异性也尽可能大 聚类算法属于无监督学习算法的一种 k 均值聚类的目的是 把 n个点 可以
  • 聚类算法(二)--层次聚类法

    本文主要介绍层次聚类法的基本原理 距离计算方法 算法的优缺点 以及R语言实战 一 概述 层次聚类 Hierarchical Clustering 试图在不同层次上对数据集进行划分 从而形成树形的聚类结构 数据集的划分可采用 自底向上 的聚合
  • 层次聚类在MATLAB中实现

    层次聚类在MATLAB中实现 By Yang Liu 1 第一种方法 1 输入要聚类的数据 2 计算各个样本之间的欧氏距离 3 把距离化成矩阵 矩阵中的元素 X i j X ij Xij 表示第i个样本和第j个样
  • 分层聚类算法

    分层聚类算法 转载 看到很多地方都讲到分层聚类法 这到底是什么东东 今天来研究一下 分层聚类法是聚类算法的一种 聚类算法是数据挖掘的核心技术 把数据库中的对象分类是数据挖掘的基本操作 其准则是使属于同一类的个体间距离尽可能小 而不同类个体间

随机推荐

  • Hypertable 和 chunk 超表和块

    文档 https docs timescale com v0 9 introduction architecture 概述 TimescaleDB作为PostgreSQL的扩展实现 这意味着Timescale数据库在整个PostgreSQL
  • selenium+chormdriver+python 实现淘宝的信息爬取

    因为我是个爬虫新手 所以对爬虫还不熟练 这几天想着自己做一个淘宝信息的自动爬取 一开始感觉比较简单 但做到了登录界面 发现一直被网站检测出来 不能滑动滑块 接下来从网上翻遍了资料 整理了以下自己的代码 完成了这个艰难的工程 嘻嘻 对我来说
  • Rsync远程同步

    rsync rsync Remote Sync 远程同步 是一个开源的快速备份工具 可以在不同主机之间镜像同步整个目录树 支持增量备份 并保持链接和权限 且采用优化的同步算法 传输前执行压缩 因此非常适用于异地备份 镜像服务器等应用 rsy
  • MFC中设置焦点

    初次接触MFC 实现填完一系列表单后继续添加另外一张 并且将焦点设置为第一张初次填写时的焦点 可能就是指第一个获取焦点的控件 用 SetFocus m hWnd 实现重置表单的功能 UpdateData FALSE 更新数据时是 Updat
  • 【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全的详细讲解

    Docker的工具实践及root概念和Docker容器安全性设置 1 使用案例 2 Docker解决的问题 3 Docker未来发展 4 Docker Hub 服务 5 技术局限 6 Docker环境安全 7 容器部署安全 1 使用案例 D
  • 希腊字母发音对照表及其latex命令

    拉丁字母是26个 希腊 Greek 字母是24个 发音即是它们各自的latex形式 大写字母的是其小写latex首字母大写后的形式 如 Delta Delta notation 西方的数学家们在推导数学定理时 仍然沿用并不好写也不好记的希腊
  • ArcGIS 文本数字写入csv文件后小数点位数减少

    在将经纬度数据写入csv文件的过程中 经度和纬度都是以小数点后保留4为小数的字符串形式存储的 但是在转成csv文件后 打开发现小数点位数缺失了 如图 在网上找了好久也没有找到解决办法 大部分都是解决文本数字过长导致以有效数字形式显示的问题
  • 如何有效的防护DDoS攻击

    DDoS攻击的类型和方法 分布式拒绝服务攻击 简称DDoS 是一种协同攻击 旨在使受害者的资源无法使用 它可以由一个黑客组织协同行动 也可以借助连接到互联网的多个受破坏设备来执行 这些在攻击者控制下的设备通常称为僵尸网络 有多种执行DDoS
  • stm32通用外部spi下载算法实现

    参考硬汉嵌入式 实战技能 任何支持SWD接口的单片机都可以方便移植的SPI Flash烧写算法制作 哔哩哔哩 bilibili 该up主提供的stm32H7的模板工程 目前需求是实现基于正点原子探索者stm32f407zet6 W25Q12
  • SpringMVC上传文件的 4 种方式,你都会么?

    1 本文内容 文件上传开发步骤 单文件上传 多文件上传 通过 MultipartHttpServletRequest 处理文件上传 通过自定义对象接收上传的文件 扩展知识 案例代码 2 预备知识 springmvc 系列中的测试案例 基本上
  • 智能汽车竞赛室外光电 组 1 安装ROS软件平台和运行第一个程序

    机器人操作系统 ROS 对机器人进行编程以使其完全符合在工业环境中的要求 它的工具 库和共享的开放资源 允许开发人员协同工作 利用现有工作的优势 简化和加快创建机器人行为的过程 ROS得到了一个庞大的全球社区的支持 其邮件列表 Wiki和R
  • [从零开始学DeepFaceLab-21]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - AMP模型训练参数详解与优化

    目录 前言 第1章 AMP模型训练参数详解 1 1 AMP参数汇总 1 2 参数详解
  • AOP实现企业级API访问接口监控(通过Google Guava缓存数据)

    开发了企业的功能模块 分享给大家参考 若大家看到我的实现有不足之处或有自己的见解欢迎评论区分享 学习去咯 文章目录 前言 一 AOP的基本知识 1 什么是AOP 2 有哪些AOP的概念 3 AOP包含的几个概念 4 AOP 有哪些应用场景
  • QT打开文件及文件路径

    获取文件夹路径 static QString getExistingDirectory QWidget parent Q NULLPTR const QString caption QString const QString dir QSt
  • Android NDK添加NEON以及cpufeatures支持

    本人使用Android studio3 0进行NDK开发 由于Android develop官网文档是针对2 2版本以下 这里为2 2以上版本的cmakelist配置做以下纪录 一 添加NEON支持 在build gradle app 中添
  • vue实现element自定义新增、删除table表格的行,和可输入input(可以自行修改成双击表格可编辑)

    效果如图 新增表格行 可点编辑再修改表格行内容 也可以自行修改成双击表格可编辑 思路 1 新增表格行 handleAddBtn 给表格数组 我这里是用tableData数组 push空的对象 2 删除行 handleDeleteBtn 首先
  • Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分

    1 run启动参数详解 debug 是否开启调试模式 开启后 debug true 修改过python代码会自动重启 不用停止运行之后再去启动 port 启动指定服务器的端口号 默认是5000 host 主机 默认是127 0 0 1 只有
  • MySQL技术内幕InnoDB存储引擎 学习笔记 第四章 表

    InnoDB引擎表中 每张表都有一个主键 如果创建表时没有显式定义主键 则 1 首先看表中是否有非空的唯一索引 如果有 则该列为主键 2 否则自动创建一个6字节大小的指针作为主键 InnoDB所有数据都逻辑地放在一个表空间中 表空间又由段
  • 基于SSM的校园旧书交易交换平台

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • KMeans算法

    目录 一 基本概念 二 Centroid Initialization Methods 三 Mini Batch K Means 四 找寻最优的聚类数量 4 1 拐点 4 2 silhouette score 轮廓分数 五 Kmeans的优