K-means 聚类模型详解

ops/2024/9/22 22:20:09/

K-means 聚类模型详解

K-means 是一种常用的无监督学习算法,用于将数据集分成 K 个簇。其目标是最小化各个簇内数据点到簇中心的距离平方和。K-means 广泛应用于图像压缩、市场细分、模式识别等领域。

算法步骤
  1. 初始化: 随机选择 K 个初始簇中心(质心)。
  2. 分配: 将每个数据点分配给距离最近的簇中心。
  3. 更新: 重新计算每个簇的质心。
  4. 重复: 重复步骤 2 和 3,直到簇中心不再变化或达到预设的迭代次数。
公式推导

目标函数: 最小化各个簇内的平方误差和(Sum of Squared Errors, SSE)。

( X = { x 1 , x 2 , . . . , x n } ) ( X = \{x_1, x_2, ..., x_n\} ) (X={x1,x2,...,xn}) 为数据集, $ C = {c_1, c_2, …, c_K} $ 为簇中心, $S_i $ 为第 i 个簇中的数据点集合。目标函数为:
J = ∑ i = 1 K ∑ x ∈ S i ∥ x − c i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in S_i} \|x - c_i\|^2 J=i=1KxSixci2

其中, ∥ x − c i ∥ \|x - c_i\| xci​ 表示数据点 x x x 到簇中心 $ c_i $ 的欧氏距离。

算法步骤

步骤 1: 初始化 C = { c 1 , c 2 , . . . , c K } C = \{c_1, c_2, ..., c_K\} C={c1,c2,...,cK}(随机选择 K 个数据点作为初始簇中心)。

步骤 2: 对每个数据点 $ x_j $​,分配到最近的簇中心:
S i = { x j : ∥ x j − c i ∥ 2 ≤ ∥ x j − c k ∥ 2 , ∀ k , 1 ≤ k ≤ K } S_i = \{x_j : \|x_j - c_i\|^2 \leq \|x_j - c_k\|^2, \forall k, 1 \leq k \leq K\} Si={xj:xjci2xjck2,k,1kK}
步骤 3: 重新计算每个簇的簇中心:
c i = 1 ∣ S i ∣ ∑ x ∈ S i x c_i = \frac{1}{|S_i|} \sum_{x \in S_i} x ci=Si1xSix

步骤 4: 重复步骤 2 和 3,直到簇中心不再变化。

运用示例

下面是一个使用 K-means 算法进行数据聚类的 Python 示例,使用 sklearn 库。

python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成示例数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42, cluster_std=0.60)# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.title("Generated Data")
plt.show()# 使用 K-means 进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)# 获取簇中心
centers = kmeans.cluster_centers_# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title("K-means Clustering")
plt.show()

在这里插入图片描述

解释
  1. 生成数据: 使用 make_blobs 生成 300 个样本点,分成 4 个簇,标准差为 0.60。
  2. 可视化数据: 使用 plt.scatter 绘制生成的数据。
  3. K-means 聚类: 创建 KMeans 对象,设置簇数为 4,并拟合数据。
  4. 获取聚类结果: 使用 predict 方法获取每个数据点的簇标签。
  5. 获取簇中心: 使用 cluster_centers_ 属性获取簇中心坐标。
  6. 可视化聚类结果: 绘制聚类后的数据点,并标记出簇中心。
优缺点

优点:

  • 简单易理解,实现和解释都很直观。
  • 计算效率高,适用于大规模数据集。

缺点:

  • 需要预先指定簇的数量 K K K
  • 对初始值敏感,不同的初始值可能导致不同的结果。
  • 适用于球形簇,不适用于非球形簇或密度不均匀的簇。

总结

K-means 是一种高效的聚类算法,通过迭代优化簇内距离平方和实现数据的自动分组。尽管有一些限制,如需要预先指定簇数和对初始值敏感,但在许多实际应用中仍然非常有用。通过结合实际数据集进行聚类分析,可以更好地理解数据的结构和模式。


http://www.ppmy.cn/ops/44978.html

相关文章

C++:函数模版简介

如果我们想要实现一个通用的交换函数,在C语言中,我们大概要定义无数个参数不同的交换函数,并且它们的函数名需要各不相同,相信这样的调用便会非常困难,想要调哪个函数还要记得对应的函数名。在C中,有了重载…

寻找峰值 ---- 二分查找

题目链接 题目: 分析: 因为题目中要找的是任意一个峰值即可, 所以和<山脉数组的峰值索引>这道题差不多因为峰值左右都小于峰值, 所以具有"二段性", 可以使用二分查找算法如果nums[mid] < nums[mid 1], mid一定不是峰值, 所以left mid 1如果nums[mid] &…

香橙派华为昇腾CANN架构编译opencv4.9

香橙派华为升腾AI盒子 为啥要编译opencv4.9.0&#xff0c; 因为在4.9.0 中增加了华为昇腾CANN的外接开发库&#xff0c;下图为盒子外观&#xff0c;此次一接到这个盒子&#xff0c;立刻开始开箱操作&#xff0c;首先就是要编译opencv4.9&#xff0c;以前在香橙派3588 的盒子中…

如何让你的网站能通过域名访问

背景 当我们租一台云服务器&#xff0c;并在上面运行了一个Web服务&#xff0c;我们可以使用云服务器的公网IP地址进行访问&#xff0c;如下&#xff1a; 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的&#xff0c;购买域名…

PHP身份证识别接口、线上平台如何实现身份证实名认证功能?

线上平台实现身份证实名认证的功能&#xff0c;需要结合身份证识别接口来完成。首先&#xff0c;用户通过上传身份证图片或者拍照的方式实现证件信息的提取&#xff0c;身份证实名认证接口通过对提取到的证件信息进行核验&#xff0c;以此来实现线上用户身份的实名认证&#xf…

go recover

recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数&#xff0c;在其他作用域中调用不会发挥作用。 // A _panic holds information about an active panic. // // A _panic value must only ever live on the stack. // // The argp and link fi…

滑动窗口模板(Java)

题目描述 有一个长为 &#x1d45b; 的序列 &#x1d44e;&#xff0c;以及一个大小为 &#x1d458; 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff0c;对于序列 [1,3,−1,−3,5,3,6,7] …

C# 元组 Tuple

C# 元组 Tuple 元组创建元组访问元组元素命名元组元素元组的类型使用元组作为方法返回值 解构解构元组的基本用法解构部分元组解构方法 元组 在C#中&#xff0c;元组&#xff08;Tuple&#xff09;是一种数据结构&#xff0c;它允许你将多个值组合成一个单一的对象。 元组在处…