聚类分析算法——K-means聚类 详解

        K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为 K 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。


1. K-means 的核心思想

        K-means 的目标是将数据集划分为 K 个簇(clusters),使得每个数据点属于距离最近的簇中心。通过反复调整簇中心的位置,K-means 不断优化簇内的紧密度,从而获得尽量紧凑、彼此分离的簇。

核心思想

  • 簇(Cluster):K-means 通过最小化簇内距离的平方和,使得数据点在簇内聚集。
  • 簇中心(Centroid):簇中心是簇中所有点的平均值,表示簇的中心位置。
  • 簇分配和更新:K-means 通过不断更新簇分配和簇中心,来逐步收敛。

2. K-means 的算法步骤

        K-means 聚类的流程分为两个主要步骤:分配(Assignment)更新(Update)。以下是详细步骤:

  1. 选择 K 值
    设定簇的数量 K

  2. 初始化簇中心
    随机选择 K 个数据点作为初始簇中心(centroids)。

  3. 分配步骤(Assignment Step)
    对于数据集中的每个点,将它分配到最近的簇中心对应的簇。这里的“距离”通常使用欧氏距离(Euclidean distance)。

  4. 更新步骤(Update Step)
    根据当前的簇分配,重新计算每个簇的中心,即计算簇内所有点的均值作为新的簇中心。

  5. 重复 3 和 4 步
    不断重复分配和更新步骤,直到簇中心不再发生变化(收敛)或达到指定的最大迭代次数。


3. K-means 的数学公式

        K-means 的目标是最小化簇内平方误差和(Within-Cluster Sum of Squares,WCSS),即每个点到其所属簇中心的距离的平方和,公式如下:

其中:

  • K 是簇的数量。
  • C_{i}是第 i 个簇的点集。
  • x是属于 C_{i} 的数据点。
  • \mu _{i}是第 i 个簇的中心。
  • \left | \right |x-\mu _{i}\left | \right |^{2} 表示数据点 x 与簇中心 \mu _{i} 之间的欧氏距离平方。

欧氏距离

K-means 通常采用欧氏距离来衡量点到簇中心的距离,其公式为:

d\left ( x,\mu \right )=\sqrt{\sum_{j=1}^{n}\left ( x_{j}-\mu _{j} \right )^{2}}

其中 n 是数据的维度。


4. K-means 的伪代码

KMeans(X, K):
    1. 随机选择 K 个点作为初始簇中心
    2. 重复以下步骤,直到簇中心不再发生变化:
        a. 分配每个点到最近的簇中心
        b. 重新计算每个簇的中心,作为簇内所有点的均值
    3. 返回最终的簇分配和簇中心

分配步骤(Assignment Step)

对于每个数据点,找到距离最近的簇中心  μj​:

c_{i}=arg \underset{j}{min}\left | \right | x_{i}-\mu _{j} \left | \right |

更新步骤(Update Step)

更新每个簇的中心 \mu _{j} 为簇内所有点的均值:

\mu _{j}=\frac{1}{\left | C_{j} \right |}\underset{x\in C_{j}}{\sum }x


5. K-means 的时间复杂度分析

  • 每次分配步骤:需要计算每个点到 K 个簇中心的距离,复杂度为 O(n*K)
  • 更新步骤:重新计算每个簇的中心,需要遍历所有点,复杂度也是 O(n*K)
  • 总复杂度:若迭代次数为 T,则总体复杂度为 O(n*K*T)

6. K-means 的优缺点

优点

  • 简单高效:在样本数量较少或维度较低时效果很好。
  • 收敛速度快:在适合的初始中心选择下,K-means 通常可以较快收敛。

缺点

  • 对初始点敏感:初始簇中心的选择对最终结果影响较大。
  • 只能发现球形簇:K-means 假设每个簇是凸形且大小相近,不能处理非球形的簇。
  • 对离群点敏感:离群点会影响簇的中心计算。

7. K 值的选择

确定最佳的簇数 K 是 K-means 聚类中的一个难点。常用的选择方法有:

  1. 肘部法(Elbow Method)
    绘制不同 K 值下的 WCSS 图,寻找“肘部”点作为最佳 K值。

  2. 轮廓系数(Silhouette Coefficient)
    衡量聚类结果的紧密度和分离度。通常,轮廓系数越高,聚类效果越好。

  3. Calinski-Harabasz 指数
    衡量簇内的方差与簇间方差之比,值越大越好。


8. Python 实现 K-means

我们可以使用 scikit-learn 中的 KMeans,以及手动实现以便更深入理解。

8.1 使用 scikit-learn 实现 K-means

from sklearn.cluster import KMeans
import numpy as np

# 生成示例数据
X = np.array([[1, 2], [2, 2], [3, 3], [8, 7], [8, 8], [25, 80]])

# 初始化并训练 KMeans 模型
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

# 获取簇标签和簇中心
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

print("Cluster labels:", labels)
print("Centroids:", centroids)

输出

Cluster labels: [0 0 0 1 1 1]
Centroids: [[ 2.   2.33333333]
            [13.66666667 31.66666667]]

8.2 手动实现 K-means 算法

以下是 K-means 的核心逻辑手动实现:

import numpy as np

def initialize_centroids(X, k):
    indices = np.random.choice(len(X), k, replace=False)
    return X[indices]

def closest_centroid(X, centroids):
    distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
    return np.argmin(distances, axis=1)

def update_centroids(X, labels, k):
    return np.array([X[labels == i].mean(axis=0) for i in range(k)])

def kmeans(X, k, max_iters=100, tol=1e-4):
    centroids = initialize_centroids(X, k)
    for i in range(max_iters):
        labels = closest_centroid(X, centroids)
        new_centroids = update_centroids(X, labels, k)
        if np.all(np.abs(new_centroids - centroids) < tol):
            break
        centroids = new_centroids
    return labels, centroids

# 示例数据
X = np.array([[1, 2], [2, 2], [3, 3], [8, 7], [8, 8], [25, 80]])

# 运行 K-means
labels, centroids = kmeans(X, k=2)
print("Cluster labels:", labels)
print("Centroids:", centroids)

9. 收敛性与初始中心的选择

        K-means 的收敛性受到初始簇中心选择的影响。K-means++ 是一种改进的初始化方法,可以帮助选择更合理的初始中心,减少陷入局部最优的风险。

K-means++ 初始中心选择步骤

  1. 随机选择一个点作为第一个中心。
  2. 对于每个点,计算其与已选择中心的最小距离。
  3. 根据与最近中心的距离平方值选择下一个中心,概率越大则越有可能成为下一个中心。

10. 总结

        K-means 是一种简单、快速的聚类算法,广泛应用于数据聚类任务。通过反复优化簇中心位置,K-means 不断收敛并找到数据的聚类结构。然而,它对初始条件敏感,对簇形状有限制,适合于球形且均匀分布的簇。在实际应用中,可通过结合 K-means++、肘部法和轮廓系数等手段改进其效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

VMware 17 安装RedHat7.0

1.创建新的虚拟机&#xff0c;选择典型安装&#xff0c;【下一步】 2.选择“稍后安装操作系统&#xff08;S&#xff09;”&#xff0c;【下一步】 注&#xff1a;选择“安装程序光盘映像文件&#xff08;iso&#xff09;&#xff08;M&#xff09;”这一项&#xff0c;虚拟机…

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性&#xff0c;通常被称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为不可分割的最小工作单元&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。这意味着如果事务执行过程中发生…

别玩了!软考初级网络管理员无非就这23页纸!背完稳!

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 考点2、子网划分 【考法分析】 本考点的基本考法是给出一个IP网段&#xff0c;同时提出需要划分多少个子网&#xff0c;或每个子网…

技术干货|如何巧妙利用数字孪生技术助力口腔保健分析

行业&#xff1a; 口腔医疗 挑战&#xff1a; 传统方法缺乏预测口腔内受力状态&#xff0c;也很难从患者方面获得反馈&#xff0c;因此将口腔扫描、牙齿形状/位置识别和正畸数字模型生成的过程数字化是一个重大机会。 正畸治疗是牙科中最大的类别之一&#xff0c;随着病例的…

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…

从壹开始解读Yolov11【源码研读系列】——Data.Base.py.BaseDataset:可灵活改写的数据集加载处理基类

目录 一、base.BaseDataset 1.__init__类初始化 2.get_img_files根据地址获得图片详细地址 3.get_labels&#xff08;自定义&#xff09;获取标签数据 4. update_labels指定类别和单分类设定 5.set_rectangle开启批量矩阵训练 6.cache_images加载图片进程可视化 7.load_image内…

超出人类思维的「系统0」:AI正在创造一种新的思维方式吗?

在大众的认知中&#xff0c;人类的思维分为系统 1&#xff08;System 1&#xff0c;直觉的、快速的、无意识的、自动思考&#xff09;和系统 2&#xff08;System 2&#xff0c;有逻辑的、缓慢的、有意识的、计划和推理&#xff09;。 如今&#xff0c;一种不同于 System 1 和…

华为ICT题库-云服务部分

1651、关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f;&#xff08;云服务考点&#xff09; (A)使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 (B)通过外部文件创建数据盘镜像必须明确指定操作系统类型 (C)使用云服务…

阿里旺旺ActiveX控件ImageMan溢出

Welcome to Windows pwn~ 环境搭建&#xff1a; 虚拟机&#xff1a;winxp sp3 32位 再装一些常用的tools&#xff0c;olldby&#xff0c;immundbg&#xff0c;windbg这些。 漏洞版本的软件&#xff1a;AliIM2010_taobao(6.50.00C) PoC crash 分析 运行PoC&#xff0c;win…

新闻记者职业资格考试备考资料包分享(重要考点)!

24年新闻记者职业资格考试时间&#xff1a;11月2日&#xff0c;今天给大家整理的是新闻记者职业资格考试备考资料包&#xff08;重要考点&#xff09;23版&#xff0c;可以更有重点的进行复习~ 「新闻记者职业资格」 资料链接&#xff1a; https://pan.quark.cn/s/965044c95…

三菱FX5U CPU 存储卡引导运行操作

在CPU模块的电源0FF->ON时或复位时&#xff0c;将保存在SD存储卡内的文件传送至CPU模块自动判别的传送目标存储器。 引导运行的步骤如下所示。 1、进行引导文件设置。 2、安装SD存储卡。 3、将引导文件设置及引导文件写入至SD存储卡中。 4、CPU模块的电源0FF→>0N或复位…

【学习】ZLMediaKit试用

服务端准备 下载ZLMediaKit压缩包&#xff0c;解压 /linux/Release路径下启用MediaServer ./MediaServer -d &/linux/Release路径下config.ini更改配置 也可以将进入web控制台 rtmp默认端口1935, rtsp默认端口554,http默认端口80, SSL默认端口443 进入web控制台 http…

域渗透AD渗透攻击利用 python脚本攻击之IPC连接 以及 python生成exe可执行程序讲解方式方法

Python脚本批量检测ipc连接 import os, timeips [192.168.1.121,192.168.1.8 ] users {administrator,hack,hack1,test, } passs {123qq.com,456qq.com,Admin12345 } for ip in ips:for user in users:for mima in passs:exec1 "net use \\" "\\" i…

基于springboot小区物联网平台源码

小区物联网平台是一个专为小区硬件管理设计的物联网管理平台&#xff0c;其核心功能在于与各大厂商的门禁设备、道闸设备、监控设备、智能锁以及充电桩等进行高效对接。该平台支持HTTP、MQTT、ComNet等多种协议&#xff0c;以便轻松实现与各大小区云平台的互联互通。 目前&…

Moveit-轨迹优化

mvoeit轨迹周期不固定的问题&#xff0c;以及我们希望对moveit规划出来的轨迹进一步优化的项目需求 首先看一个关节角运动的python函数&#xff0c;通过这个函数我们可以实现机械臂从当前位姿运动到设定位姿的功能 #用于控制机械臂移动到目标位置&#xff0c;接受三个参数 #t…

高效实现用友BIP与吉客云的数据集成方案案例

用友BIP数据集成到吉客云的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确对接是实现业务协同的重要基础。本文将重点介绍一个实际运行的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将用友BIP的数据无缝集成到吉客云中&#xff0…

Golang高级语法-工具链

Golang工具链是一个强大的工具集&#xff0c;可以帮助开发人员管理和构建Golang应用程序&#xff0c;包括编译、链接、测试、代码分析、文档生成等。本文将介绍Golang工具链的基本用法和示例代码&#xff0c;让您更好地了解和使用它。 1 环境 在开始之前&#xff0c;您需要安装…

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…

双十一我都入手了啥大件?这几款超值好物分享给你

​马上就到一年一度的“双11”大促&#xff0c;简单与大家分享&#xff0c;最近自己买过或者是看好的生活好物。以数码为主&#xff0c;平常的一点生活会提及一些。 耳机党必备&#xff0c;听歌不伤耳朵&#xff01;——南卡OE MIX开放式耳机 一句话推荐&#xff1a;百元旗舰…