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替代。
相关推荐
INGNIGHT35 分钟前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying35 分钟前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记41 分钟前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
labuladong2 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun612 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法2 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然2 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one2 小时前
算法--桶思想
java·开发语言·算法
wordbaby3 小时前
同一次请求里的两道锁:图解搞懂国密 SM2 与 SM3
算法
miller-tsunami4 小时前
内存管理&模板
c++·算法·内存管理·模板