深入解密 K 均值聚类:从理论基础到 Python 实践

1. 引言

在机器学习领域,聚类是一种无监督学习的技术,用于将数据集分组成若干个类别,使得同组数据之间具有更高的相似性。这种技术在各个领域都有广泛的应用,比如客户细分、图像压缩和市场分析等。聚类的目标是使得同类样本之间的相似性最大化,而不同类样本之间的相似性最小化。

K 均值聚类 (K-Means Clustering) 是一种基于距离度量的迭代优化算法,通过选择若干个质心 (centroid) 来对数据进行分组,使得每个数据点所属的聚类内距离质心的距离之和最小化。由于其算法的简单性和高效性,K 均值在数据分析中被广泛使用。

在现实生活中,我们可以将 K 均值聚类应用于客户细分,以帮助企业识别具有相似购买行为的客户群体,或者用于图像压缩,通过将图像像素点聚类来减少颜色的数量。在这篇文章中,我们将深入探讨 K 均值聚类的数学原理、算法实现步骤,并提供 Python 代码示例来帮助读者理解其实际应用。

2. 什么是 K 均值聚类?

K 均值聚类是一种基于质心的聚类算法,它通过反复迭代的方式将数据点分配到 K 个聚类中。每个质心代表一个聚类的中心位置,算法会不断调整质心的位置,直到满足一定的收敛条件。K 均值聚类的目标是最小化每个聚类内部所有点到其质心的距离之和。

具体来说,K 均值聚类的步骤可以概括如下:

  1. 随机选择 K 个初始质心。

  2. 将每个数据点分配到离它最近的质心所在的聚类。

  3. 重新计算每个聚类的质心,即对聚类中的所有数据点取平均值。

  4. 重复步骤 2 和 3,直到质心的位置不再发生变化,或者达到预设的迭代次数。

K 均值聚类的最终结果是 K 个聚类,每个聚类由一个质心及其所有属于该聚类的数据点组成。其目标是使得每个聚类内的数据点与质心之间的总距离最小。

3. K 均值聚类的数学原理

K 均值聚类的目标是最小化每个数据点到所属质心的距离的平方和 (Sum of Squared Errors, SSE):

其中,

  • :聚类的数量。

  • :第 i 个聚类。

  • :第 i 个聚类的质心。

  • :属于聚类 的数据点。

这个优化问题的目标是通过不断调整每个聚类的质心来最小化 SSE。该过程通过交替进行两步:分配 (Assignment) 和更新 (Update),直到达到收敛条件。

4. 算法实现步骤详解

K 均值聚类算法主要包含以下步骤:

步骤 1:选择 K 值

K 值是指要将数据分成的聚类数。选择合适的 K 值是 K 均值聚类算法中一个非常重要的步骤,因为不合适的 K 值会影响聚类的效果。通常可以通过 "肘部法则 (Elbow Method)" 来确定合适的 K 值。

步骤 2:初始化质心

可以随机选择 K 个数据点作为初始质心,或者使用一些启发式的方法,如 K-Means++,以更好地初始化质心,减少随机性对聚类效果的影响。

步骤 3:分配数据点

将每个数据点分配到离它最近的质心所在的聚类中。通常使用欧几里得距离来计算数据点与质心之间的距离。

步骤 4:更新质心

对于每一个聚类,重新计算其质心的位置。具体来说,将聚类中的所有数据点的坐标进行平均,得到新的质心位置。

步骤 5:收敛判断

判断质心是否发生变化。如果质心位置不再变化,或者达到预设的最大迭代次数,算法停止。此时的聚类结果即为最终的聚类划分。

5. Python 代码实现

下面我们用 Python 及其常用库 NumPy 和 Matplotlib 实现 K 均值聚类算法:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
​
# 生成模拟数据集
np.random.seed(42)
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
​
# 可视化数据集
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Generated Data')
plt.show()
​
# 定义K均值聚类算法
class KMeans:def __init__(self, k=3, max_iters=100, tol=1e-4):self.k = kself.max_iters = max_itersself.tol = tol
​def fit(self, X):self.centroids = X[np.random.choice(range(X.shape[0]), self.k, replace=False)]for _ in range(self.max_iters):# 分配数据点到最近的质心self.clusters = self._assign_clusters(X)# 重新计算质心new_centroids = self._compute_centroids(X)# 检查质心是否收敛if np.all(np.linalg.norm(self.centroids - new_centroids, axis=1) < self.tol):breakself.centroids = new_centroids
​def _assign_clusters(self, X):distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)return np.argmin(distances, axis=1)
​def _compute_centroids(self, X):return np.array([X[self.clusters == i].mean(axis=0) for i in range(self.k)])
​def predict(self, X):distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)return np.argmin(distances, axis=1)
​
# 训练模型
kmeans = KMeans(k=4)
kmeans.fit(X)
​
# 预测聚类结果
y_pred = kmeans.predict(X)
​
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], s=200, c='red', marker='X')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-Means Clustering Results')
plt.show()

6. 选择 K 值:肘部法则

选择合适的 K 值是 K 均值聚类的重要步骤。肘部法则是一种常用的方法,它通过计算不同 K 值下 SSE 的变化趋势来选择合适的 K。随着 K 的增加,SSE 会减少,但当减少的速度显著减小时,最佳 K 值即为 "肘部点"。

以下是使用肘部法则的代码示例:

sse = []
for k in range(1, 10):kmeans = KMeans(k=k)kmeans.fit(X)sse.append(sum(np.min(np.linalg.norm(X[:, np.newaxis] - kmeans.centroids, axis=2), axis=1) ** 2))
​
# 可视化肘部法则
plt.plot(range(1, 10), sse, marker='o')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('SSE')
plt.title('Elbow Method for Optimal K')
plt.show()

7. K 均值聚类的优缺点

优点:
  • 简单易懂:K 均值聚类算法简单直观,易于实现。

  • 高效性:对于较大规模的数据,K 均值算法计算效率较高。

缺点:
  • 对初始值敏感:算法对初始质心位置敏感,可能陷入局部最优。K-Means++ 是一种改进方法,可以更好地选择初始质心。

  • 需指定 K 值:K 值需要事先给定,这对于不熟悉数据结构的用户来说是个挑战。

  • 易受异常值影响:异常值对质心计算有较大影响,可能使结果偏离。

8. K-Means++ 的改进

为了减少对初始质心选择的敏感性,K-Means++ 提供了一种改进策略,确保初始质心尽可能分散,减少局部最优解的可能性。Scikit-Learn 库实现的 KMeans 就采用了 K-Means++ 作为默认的初始质心选择方法。

from sklearn.cluster import KMeans
​
# 使用KMeans++初始化
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
y_kmeans = kmeans.fit_predict(X)
​
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-Means++ Clustering Results')
plt.show()

9. 实际应用

K 均值聚类在实际生活中有着广泛的应用,包括:

  • 客户细分:根据购买行为或浏览习惯将客户进行分类,方便精准营销。

  • 图像压缩:通过对图像的像素进行聚类,将相似颜色的像素归为同一类,从而减少颜色种类,达到压缩图像的目的。

  • 市场分析:K 均值可以用于找出不同市场中的相似产品。

10. 总结

K 均值聚类是一种强大且简单的聚类算法,适合处理结构化的数值数据。它在很多应用场景下表现良好,但也有其局限性,比如对初始值敏感和易受异常值影响。在实际应用中,结合肘部法则和 K-Means++ 等改进方法,可以提高聚类效果。

希望本文让你对 K 均值聚类的原理和实现有更深的理解,并能利用代码在自己的项目中进行聚类分析。如果你有任何问题或建议,欢迎在评论区交流!

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

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

相关文章

【ROS的TF系统】

系列文章目录 TF系统简介 前面的章节实现了SLAM节点的建图功能&#xff1a; 激光雷达节点—> /scan话题 —>hector_mapping节点—> 地图数据话题/map 本期来实现SLAM节点的定位功能&#xff1a; TF&#xff08;TransForm&#xff09;主要描述的是两个坐标系的空间关…

趣说产品安全设计的十大经典原则,看一遍就再难忘记!

全设计原则在产品和系统的开发中占据着至关重要的地位。这些原则强调了从一开始就将安全性融入到设计过程中的重要性&#xff0c;而不是作为事后补救措施。通过遵循这些原则&#xff0c;开发者能够创建更加健壮和安全的产品&#xff0c;有效减少潜在的安全漏洞和威胁。接下来博…

【回溯】力扣 77.组合

一、题目 二、思路 采用回溯算法&#xff0c;注意点&#xff1a; 递归出口&#xff1a;已经选够 k k k 个数参数传递&#xff1a;由于不可以重复选择相同的数字&#xff0c;因此每选一个数就会使得可选择的范围对应缩小。不妨设定选择的顺序是从 1 1 1 到 n n n 依次进行选…

疯狂Spring Boot讲义[推荐1]

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…

『 Linux 』网络传输层 - TCP(二)

文章目录 TCP六个标志位TCP的连接三次握手 四次挥手为什么是三次握手和四次挥手 重传机制 TCP六个标志位 在TCP协议报文的报头中存在一个用于标志TCP报文类型的标志位(不考虑保留标志位),这些标志位以比特位选项的方式存在,即对应标志位为0则表示为假,对应标志位为1则为真; SYN…

LeetCode --- 421周赛

题目列表 3334. 数组的最大因子得分 3335. 字符串转换后的长度 I 3336. 最大公约数相等的子序列数量 3337. 字符串转换后的长度 II 一、数组的最大因子得分 数据范围足够小&#xff0c;可以用暴力枚举移除的数字&#xff0c;得到答案&#xff0c;时间复杂度为O(n^2)&#…

动态规划-回文串问题——5.最长回文子串

1.题目解析 题目来源&#xff1a;5.最长回文子串——力扣 测试用例 2.算法原理 1.状态表示 判断回文子串需要知道该回文子串的首尾下标&#xff0c;所以需要一个二维数组且数据类型为bool类型来存储每个子字符串是否为回文子串&#xff0c; 即dp[i][j]:以第i个位置为起始&a…

微积分复习笔记 Calculus Volume 1 - 4.4 The Mean Value Theorem

4.4 The Mean Value Theorem - Calculus Volume 1 | OpenStax

docker engine stopped

1&#xff09;环境&#xff1a;win 10 2&#xff09;docker安装时已经已经安装了虚拟机 3&#xff09;启用网络适配器 4&#xff09;启用docker服务&#xff08;依赖服务LanmanServer&#xff09; 5&#xff09;全都弄好了&#xff0c;docker还是打不开&#xff0c;没办法了&a…

【VM实战】VMware迁移到VirtualBox

VMware 虚拟机开机卸载VMware Tools 调整虚拟磁盘 对于Windows 10及以上的虚拟机&#xff0c;一般VMware默认都会选Nvme固态硬盘。在导出前必须将其改为SATA&#xff0c;否则VirtualBox导入会报Appliance Import错误 (E_INVALIDARG 0x80070057) 先删掉当前盘的挂载&#xff…

某本书上的一张序列图评点

贝贝 2019-8-24 10:56 潘老师&#xff0c;这个图是不是不太对。插卡&#xff0c;输入密码并不是ATM的职责&#xff1f; UMLChina潘加宇: 这种图用建模思维一挤压&#xff0c;脓包太多了。 问题一、几个生命线上的实例&#xff0c;抽象级别不一致。 ATM用户--系统&#xff0…

Docker | 校园网上docker pull或者docker run失败的一种解决方法

场景 需要从仓库拉取镜像 无论使用命令docker pull 还是 docker run 但是总是显示如下的错误: 解决方法 查看虚拟机网络连接方式 Linux上检查校园网是否登录 有界面 无界面 只是命令行操作的Linux 关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)

推荐一款功能强大的AI实时变声器:FliFlik Voice Changer

FliFlik VoiCE Changer是一款专注于声音变换与音频处理的创新软件&#xff0c;旨在满足从日常娱乐、游戏直播到播客制作、专业音频编辑的多种应用场景需求。无论是想在游戏中变换声音逗乐队友&#xff0c;还是在播客中塑造个性化的音效&#xff0c;这款软件都能提供灵活而强大的…

YOLOv8改进,YOLOv8改进损失函数采用SlideLoss来处理样本不平衡问题,助力涨点

摘要 作者提出了一种基于 YOLOv5 改进的实时人脸检测模型,称为YOLO-FaceV2。设计了一个感受野增强模块(RFE)来提升小尺度人脸的感受野,并引入了 NWD 损失,以弥补 IoU 在小目标位置偏差上的敏感性。针对人脸遮挡问题,提出了 SEAM 注意力模块,并引入了排斥损失进行优化。…

【django】django RESTFramework前后端分离框架快速入门

目录 一、搭建项目开发环境 1.1 pycharm创建项目 1.2 修改配置settings.py 1.3 新增 static与staticfiles文件夹 1.4 生成数据表 1.5 创建超级用户 1.6 启动项目 二、安装REST_Framework 2.1 安装 2.2 配置settings 2.3 重新执行生成数据库脚本 三、修改路由 四、s…

【微服务】Java 对接飞书多维表格使用详解

目录 一、前言 二、前置操作 2.1 开通企业飞书账户 2.2 确保账户具备多维表操作权限 2.3 创建一张测试用的多维表 2.4 获取飞书开放平台文档 2.5 获取Java SDK 三、应用App相关操作 3.1 创建应用过程 3.2 应用发布过程 3.3 应用添加操作权限 四、多维表应用授权操作…

二维legendre多项式

Legendre 多项式常用来表征方形波前的畸变。 目录 一维legendre多项式正交性自正交性 二维Legendre多项式正交性证明 可视化二维 Legendre 多项式解释 Legendre拟合方法1MATLAB 实现解释方法21. 定义一维 Legendre 多项式函数2. 生成二维 Legendre 多项式矩阵3. 计算 Legendre…

台式电脑如何改ip地址:全面解析与实操指南

有时候&#xff0c;由于IP地址冲突、网络安全、隐私保护或特定应用需求&#xff0c;我们可能需要更改台式电脑的IP地址。然而&#xff0c;对于不熟悉网络设置的用户来说&#xff0c;这一过程可能显得复杂而陌生。本文将通过全面解析与实操指南&#xff0c;帮助大家轻松掌握台式…

【私聊记录】最近在忙什么啊?听说你在学人工智能?

小舒&#xff1a;哎&#xff0c;你最近在忙什么啊&#xff1f; 小元&#xff1a;我在学习人工智能呢。 小舒&#xff1a;人工智能&#xff1f;难不难学啊&#xff1f; 小元&#xff1a;不难&#xff0c;找到正确的学习姿势就不难了&#xff01; 小舒&#xff1a;那你为什么想学…

电动越野车行业全面深入分析

电动越野摩托车是将电动技术与越野性能相结合的一类摩托车&#xff0c;采用电力驱动&#xff0c;具有环保、节能、低噪音等优点&#xff0c;同时保留了越野摩托车的强劲动力和适应复杂地形的能力。电动越野摩托车通常配备高性能电动机和电池组&#xff0c;可提供强劲的动力输出…