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替代。
相关推荐
Navigator_Z1 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
云泽8084 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh154 小时前
Go 迭代器
算法
语戚4 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
CS创新实验室5 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新6 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
8Qi86 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS7 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚7 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业7 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机