K-Means聚类算法:无监督学习实战

K-Means聚类算法原理

K-Means是一种基于距离的无监督学习算法,通过迭代将数据划分为K个簇。核心步骤包括:

  1. 初始化中心点:随机选择K个样本作为初始簇中心(质心)。
  2. 分配样本:计算每个样本到各质心的距离(通常为欧氏距离),将其分配到最近的簇。
  3. 更新质心:重新计算每个簇的均值作为新质心。
  4. 迭代优化:重复步骤2-3直至质心不再显著变化或达到最大迭代次数。

数学公式:

欧氏距离公式:

d(x, y) = \\sqrt{\\sum_{i=1}\^{n}(x_i - y_i)\^2}

质心更新公式(第j个簇的质心c_j):

c_j = \\frac{1}{\|S_j\|}\\sum_{x \\in S_j}x


实战步骤(Python示例)

数据准备

使用sklearn.datasets生成模拟数据:

python 复制代码
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)
模型训练

调用sklearn.cluster.KMeans

python 复制代码
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
可视化结果

使用matplotlib绘制聚类效果:

gitee.com/huang-yong55/liusir/blob/master/t173.md

gitee.com/huang-yong55/liusir/blob/master/e460.md

gitee.com/huang-yong55/liusir/blob/master/w655.md

gitee.com/huang-yong55/liusir/blob/master/a175.md

gitee.com/huang-yong55/liusir/blob/master/v001.md

gitee.com/huang-yong55/liusir/blob/master/y901.md

gitee.com/huang-yong55/liusir/blob/master/k061.md

gitee.com/huang-yong55/liusir/blob/master/a821.md

gitee.com/huang-yong55/liusir/blob/master/w214.md

gitee.com/huang-yong55/liusir/blob/master/d497.md

gitee.com/huang-yong55/liusir/blob/master/p485.md

gitee.com/huang-yong55/liusir/blob/master/j816.md

gitee.com/huang-yong55/liusir/blob/master/s367.md

gitee.com/huang-yong55/liusir/blob/master/u675.md

gitee.com/huang-yong55/liusir/blob/master/n295.md

gitee.com/huang-yong55/liusir/blob/master/p980.md

gitee.com/huang-yong55/liusir/blob/master/s928.md

gitee.com/huang-yong55/liusir/blob/master/w151.md

gitee.com/huang-yong55/liusir/blob/master/b657.md

gitee.com/huang-yong55/liusir/blob/master/m285.md

gitee.com/huang-yong55/liusir/blob/master/y937.md

gitee.com/huang-yong55/liusir/blob/master/l508.md

gitee.com/huang-yong55/liusir/blob/master/w032.md

gitee.com/huang-yong55/liusir/blob/master/g574.md

gitee.com/huang-yong55/liusir/blob/master/e994.md

gitee.com/huang-yong55/liusir/blob/master/v552.md

gitee.com/huang-yong55/liusir/blob/master/l100.md

gitee.com/huang-yong55/liusir/blob/master/d742.md

gitee.com/huang-yong55/liusir/blob/master/m164.md

gitee.com/huang-yong55/liusir/blob/master/h626.md

gitee.com/huang-yong55/liusir/blob/master/o692.md

gitee.com/huang-yong55/liusir/blob/master/q199.md

gitee.com/huang-yong55/liusir/blob/master/t519.md

gitee.com/huang-yong55/liusir/blob/master/s361.md

gitee.com/huang-yong55/liusir/blob/master/h073.md

gitee.com/huang-yong55/liusir/blob/master/o779.md

gitee.com/huang-yong55/liusir/blob/master/x070.md

gitee.com/huang-yong55/liusir/blob/master/a085.md

gitee.com/huang-yong55/liusir/blob/master/q178.md

gitee.com/huang-yong55/liusir/blob/master/r767.md

gitee.com/huang-yong55/liusir/blob/master/g812.md

gitee.com/huang-yong55/liusir/blob/master/t874.md

gitee.com/huang-yong55/liusir/blob/master/h493.md

gitee.com/huang-yong55/liusir/blob/master/w330.md

gitee.com/huang-yong55/liusir/blob/master/v696.md

gitee.com/huang-yong55/liusir/blob/master/a790.md

gitee.com/huang-yong55/liusir/blob/master/z527.md

gitee.com/huang-yong55/liusir/blob/master/v296.md

gitee.com/huang-yong55/liusir/blob/master/b867.md

gitee.com/huang-yong55/liusir/blob/master/k032.md

python 复制代码
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200)
plt.title("K-Means Clustering")
plt.show()

关键调参与优化

  1. 确定K值

    • 肘部法则(Elbow Method):观察不同K值下SSE(Sum of Squared Errors)的拐点。
    • 轮廓系数(Silhouette Score):值越接近1表示聚类效果越好。
  2. 初始化改进

    • 使用init='k-means++'(默认)避免随机初始化导致的局部最优。
  3. 距离度量

    • 高维数据可考虑余弦相似度或马氏距离。

应用场景

  1. 客户分群(如RFM模型)
  2. 图像压缩(颜色量化)
  3. 异常检测(远离簇中心的样本)

局限性

  1. 需预先指定K值,且对非球形簇效果差。
  2. 对噪声和异常值敏感,可尝试K-Medoids或DBSCAN替代。
相关推荐
Lyyaoo.2 小时前
【二分查找】【中等】搜索二维矩阵/排序数组的第一位和最后位置/搜索旋转排序数组/旋转排序数组中的最小值
java·数据结构·算法
土司大王3 小时前
LeetCode hot100——153.寻找旋转排序数组中的最小值:Java 二分模板与 O(log n) 分析
java·算法·leetcode
光电的一只菜鸡3 小时前
isp中关于锐化对图像清晰度的影响
算法
土司大王3 小时前
LeetCode hot100——4.寻找两个正序数组的中位数:Java 二分第K小 递归裁剪
java·算法·leetcode
薛定e的猫咪3 小时前
(ICML2024)QSM:基于 Q 函数梯度对齐分数场的扩散模型离策略强化学习
人工智能·深度学习·算法
hetao17338373 小时前
2026-09-13 hetao1733837 的刷题记录
c++·算法
hansang_IR3 小时前
【题解】[JSOI2016] 扭动的回文串
c++·算法
Lyyaoo.4 小时前
【二分查找】【困难】寻找两个有序数组的中位数
java·数据结构·算法
kevin_kang4 小时前
第05章 实时语音识别的 ASR 原理
算法
kevin_kang4 小时前
第04章 断句原理:本地 VAD 与神经网络 VAD
算法