k-means算法原理

news2024/9/20 22:44:45

1 算法简介

k-means(k均值)算法由不同学者于20世纪50-60年代在不同领域提出的一种聚类算法。随后该算法不断得到了改进,成为了一种非常广泛应用的聚类算法。k-means算法是将样本按距离划分为k个簇的一种聚类算法。

2 算法的基本原理

2.1 相关概念

簇:数据点的集合,将相似的数据形成一个集合;

质心:簇中所有点距离的中心。

2.2 距离度量

常见的距离度量包括曼哈顿距离和欧氏距离。k-means一般是通过平方差来衡量点与点之间的“距离”。

m维数据点x=(x_{1},x_{2},...,x_{m})^{T},y=(y_{1},y_{2},...,y_{m})^{T}

2.2.1 曼哈顿距离

曼哈顿距离(Manhattan Distance)又称绝对距离、市区距离。

数据点x,y的曼哈顿距离定义如下:

d(x,y)=\sum_{m=1}^{M}\left | x_{m} -y_{m}\right |

2.2.2 欧氏距离

欧氏距离(欧几里得距离,Euclidean Distance)定义如下:

d(x,y)=\sqrt{\sum_{m=1}^{M}\left ( x_{m} -y_{m} \right )^{2}}

2.2.3 k-means的平方差度量

k-means算法中,一般是通过平方差来衡量点之间的距离。

d(x,y)=\sum_{m=1}^{M}\left ( x_{m} -y_{m} \right )^{2}

2.3 问题求解

k-means算法,将样本分为K个簇,求每一个样本点到该簇质心距离的平方之和,并使其最小化,满足这样的条件的质心即为算法的解,相应的簇即为对样本的聚类划分。

样本X_{i}\in \mathbb{R}^{m},i=1,2,...,N,假设其质心为Z_{j},j=1,2,...,K,则目标函数为:

Obj = \sum_{j=1}^{K}\sum_{i=1}^{N_{j}}\left \| X_{i}-Z_{j} \right \|^{2}

要使得上式取得极小值,对于确定的簇j,应有\frac{\partial Obj}{\partial Z_{j}}=0,即

\frac{\partial \sum_{i=1}^{N_{j}}\left \| X_{i}-Z_{j} \right \|^{2}}{\partial Z_{j}}=\frac{\partial \sum_{i=1}^{N_{j}}(X_{i}-Z_{j})^{T}(X_{i}-Z_{j})}{\partial Z_{j}}=0

求解得Z_{j}=\frac{1}{N_{j}}\sum_{i=1}^{N_{j}}X_{i}

此处给出了质心取值的计算方法,但没有解决簇的划分。对于这一问题,解决的办法是启发式迭代。

3 算法过程

3.1 输入输出

(1)输入:样本X_{i}\in \mathbb{R}^{m},i=1,2,...,N,簇的个数K

(2)输出:K个簇。

3.2 算法初始化

质心初始化及迭代停止条件等。

质心初始化:随机选取K个样本Z_{1}^{(0)},Z_{2}^{(0)},...,Z_{K}^{(0)}作为K个簇的质心;

计算样本与质心距离:计算各样本到各簇心的距离,样本X_{i}到各质心的距离为\left \| X_{i}-Z_{j}^{(0)} \right \|^{2},j=1,2,...,K

簇的划分:样本X_{i}其所属簇为使得距离取最小值的第j个簇 。记这一划分为q^{(0)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(0)} \right \|^{2}

则第j个簇的所有样本集合为S_{j}^{(0)}=\left \{ X_{i}| q^{(0)}(X_{i})=j,i=1,2,...,N\right \}

3.3 进行迭代

对于t=1,2,...,T轮迭代:

1)更新质心

新的质心为Z_{j}^{(t)}=\frac{1}{N_{j}}\sum_{X_{i}\in S_{j}}^{}X_{i},其中N_{j}为簇S_{j}的样本数量。

2)计算样本与新质心的距离

计算各样本到各质心的距离,样本X_{i}到各质心的距离为(X_{i}-Z_{j}^{(t)})^{2},j=1,2,...,K

3)新的簇划分

样本X_{i}其所属新的簇使距离取最小值的第j个簇。记这一划分为q^{(t)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(t)} \right \|^{2}

则第j个簇的所有样本集合为S_{j}^{(t)}=\left \{ X_{i}| q^{(t)}(X_{i})=j,i=1,2,...,N\right \}

4)迭代判断

当质心不再变化,或质心的距离小于指定值,或迭代次数等满足停止条件时,停止迭代;否则进行迭代;

5)得到最终簇划分

q^{(T)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(T)} \right \|^{2}

其对应的簇为:S_{j}^{(T)}=\left \{ X_{i}| q^{(T)}(X_{i})=j,i=1,2,...,N\right \}j=1,2,...,K

4 算法实例

这里用sklearn中的KMeans模型进行演示。

import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#样本生成
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=1)

#模型训练
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)

#模型预测
y_predict = kmeans.predict(X)

#散点图绘制
plt.scatter(X[:, 0], X[:, 1], c=y_predict, s=50, cmap='viridis')

#质心可视化
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x',s=100, alpha=0.5)

5 算法总结

k-means算法是一种无监督学习,具有简易高效的优势,但其也存在一些缺点:

1)需要预先设定簇类的数量,设定的值可能不是较优的,导致划分不够理想。

2)初始质心的选择对k-means算法的结果影响很大,容易得到局部最优解。

3)k-means算法对极端值比较敏感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeError: Cannot read property ‘xxx‘ of undefined

1.首先贴出控制台的报错信息 2.从报错信息看的一脸疑惑,xxx属性或方法确实定义了,引入后怎么就报错了,一开始还怀疑是小程序缓存导致的,清理缓存重新编译还是报错,然后怀疑是分包导致的,后来看到我的代码是…

一、stm32在cubemx配置硬件crc与rng测试演示

一、crc配置 1、配置crc界面 2、crc主要调用的函数 这两个都可以生成crc,存在一些区别,但都可以生成crc其结果都是一样的。 二、rng配置 1、rng配置的界面 2、rng生成函数 这三个函数都可以生成随机数,其中开启中断后可调用回调函数&am…

在Linux中宏观的看待线程

线程一旦被创建,几乎所有的资源都是被所有的线程共享的。线程也一定要有自己私有的资源,什么样的资源应该是线程私有的? 1.PCB属性私有 2.要有一定的私有上下文结构 3.每个线程都要有独立的栈结构 ps -aL ##1. Linux线程概念 ###什么是线程…

深度学习每周学习总结N6:使用Word2vec实现文本分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结:1.加载数据2. 构建词典3. 生成数据批次和迭代器4.模型搭建及初始化5. 定义训练与评估函数6. 拆分数据集并运行模…

界面控件(无ui文件)

目录 菜单栏 工具栏 状态栏 停靠部件和核心部件 菜单栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {// 菜单栏,获取当前窗口的菜单栏,没有会自动创建一个QMenuBar *mb this->menuBar();// 添加菜单QMenu *menuFile mb-&g…

【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点

Pre-trained Language Models及其各种微调模型的实现细节和特点 1. Pre-trained Language Models2. semi-supervised Learning3. zero-shot4. Parameter-Efficient Fine-Tuning4.1 含义:4.2 实现方式: 5. LoRA5.1 LoRA 的主要特点:5.2 LoRA 的…

【QT 5 QT 6 构建工具qmake-cmake-和-软件编译器MSVCxxxvs MinGWxxx说明】

【QT 5报错:/xxx/: error: ‘class Ui::frmMain’ has no member named ‘xxx’-和-软件编译器MSVCxxxvs MinGWxxx说明】 1、前言2 、qt 中 Qmake CMake 和 QBS1-qmake2-Cmake3-QBS4-官网一些说法5-各自特点 3、软件编译套件1-Desktop Qt 6.7.2 llvm-mingw 64-bit2-…

SpringBoot排除默认日志框架

默认用的logback application.properties中的配置无需改变,自动装配会根据条件(哪个日志的.class是否存在) 进行切换 只要切换日志配置文件就好 比如原来使用的logback-spring.xml换成log4j2-spring.xml 日志文件网上找找

Flink-DataWorks第三部分:数据集成(第59天)

系列文章目录 2.4 任务配置方式 2.4.1 DataStudio侧离线同步 2.4.1.1 开发流程概览 2.4.1.2 步骤一:新建离线同步节点 2.4.1.3 步骤二:配置同步网络链接 2.4.1.4 步骤三:配置数据来源与去向 2.4.1.5 步骤四:配置字段映射关系 2.4…

C:野指针介绍(定义、危害、规避)以及野指针与空指针的区分

目录 1、野指针 1.1 野指针的成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 1.2 野指针的危害 1.3 如何规避野指针 1. 指针初始化 2. 小心指针越界 3.指针变量不使用就及时赋上NULL 4. 指针使用前检查是否是空指针 5. 避免返回局部变量的地址 1.4 区…

微信小程序【五】摇骰子

摇骰子 一、dice.js二、dice.json三、dice.wxml四、dice.wxss 效果简述:点击设置“骰子个数”,喝一杯前,先摇一摇。 骰子图片命名示例: 1.png、2.png 一、dice.js Page({data: {numDice: 1, // 初始化骰子数diceImages: [],dic…

【iOS多线程(二)】GCD其他方法详解

GCD其他方法 dispatch_semaphore (信号量)什么是dispatch_semaphore(信号量)?dispatch_semaphore主要的三个方法dispatch_semaphore主要作用线程安全线程同步 dispatch_afterdispatch_time_t 两种形式 GCD 一次性代码(只执行一次&#xff09…

电脑维修店的主题源码 简洁wordpress企业主题模版下载

简洁wordpress企业主题,一个简洁的电脑维修店的主题 源码下载:https://download.csdn.net/download/m0_66047725/89612932 更多资源下载:关注我。

【深度学习】TTS,CosyVoice,推理部署的代码原理讲解分享

文章目录 demo代码加载配置文件speech_tokenizer_v1.onnx(只在zero_shot的时候使用)campplus.onnx(只为了提取说话人音色embedding)`campplus_model` 的作用代码解析具体过程解析总结示意图CosyVoiceFrontEndCosyVoiceModel推理过程总体推理过程推理速度很慢: https://git…

OpenNebula-6.9.80使用介绍

目录 准备:给宿主机添加一块网卡 1. 创建群组 2. 创建用户 3. 创建集群 4. 创建主机 5. 安全组 6. 网络模板 7. 虚拟网络 8. 导入镜像 9. 创建虚拟机模板 10. 实例化虚拟机 11. 卸载磁盘 12. 再次实例化 13. 添加新节点 14. 虚拟机迁移 准备&…

面壁的智能开源 MiniCPM-V 2.6 边缘人工智能多模态功能与 GPT-4V 不相上下

"MiniCPM-V2.6 "是一个边缘多模态人工智能模型,仅拥有 80 亿个参数,却在单图像、多图像和视频理解任务中取得了低于 200 亿个参数的三项 SOTA(艺术境界)成绩,显著增强了边缘多模态能力,并与 GPT-…

python.tkinter设计标记语言(转译2-html)

TOC 前言 本文只作为笔记记录。 前文我们已经通过TinText渲染器部分和TinML获得了test.tin解释后的标记内容列表。本文,我们将根据这个解释结果将Tin标记转为html文件。 转为html的好处 第一,Tin标记语言作为一个小小小小小项目,光把编写…

34-《球兰》

球兰 球兰(学名:Hoya carnosa(L.f.)R. Br),又名:马骝解、狗舌藤、铁脚板等,马利筋亚科球兰属多年生植物 。攀援灌木,附生于树上或石上,茎节上生气根。分布于云…

单链表-数据结构

一、单链表 1.结构定义 typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList; 2.功能实现 ①创造结点 //创造结点 LNode* NewNode(int x) {struct LNode* ret (LNode*)malloc(sizeof(LNode));ret->data x;ret->next NULL;return ret; } ②插…

TypeError: (0 , _xxx.default) is not a function

1.首先从控制台报错信息看很让人疑惑,好像并没有这个函数,我这里是引入了address.js这个这个文件里面的函数导致的 2. 直接说原因:导入的函数不是default,但使用的时候没有使用"{}" import xxx from yyy 3.直接加上&q…