【机器学习】机器学习的基本分类-无监督学习-K-Means聚类

K-Means 是一种基于划分的无监督学习算法,用于数据聚类任务,它通过迭代优化将数据分组为 k 个互斥的簇,使得每个簇内数据点的相似性最大化,而簇间的相似性最小化。它通过最小化簇内样本点到簇中心的距离平方和(即误差平方和,SSE)来完成聚类任务。


1. 算法原理

目标函数

K-Means 的目标是最小化以下目标函数:

  • k:簇的数量。
  • :第 i 个簇的集合。
  • :第 i 个簇的中心(质心)。
  • :样本点 x 到质心 的欧几里得距离。
步骤
  1. 初始化:随机选择 k 个初始质心。
  2. 分配样本点到最近的质心:将每个样本点分配到最近的簇中心,形成 k 个簇。
  3. 更新质心:计算每个簇中所有样本点的均值,作为新的簇中心。
  4. 迭代:重复步骤 2 和 3,直到簇中心不再发生显著变化或达到预设迭代次数。

2. 特点

优点
  1. 简单高效:算法容易理解和实现,适合中小型数据集。
  2. 快速收敛:在大多数情况下,K-Means 收敛速度较快。
缺点
  1. 需要指定 k:聚类数 k 需要预先指定,可能难以确定。
  2. 易受初始点影响:初始质心的选择可能导致不同的聚类结果。
  3. 对异常值敏感:异常点可能显著影响簇中心的位置。
  4. 仅适用于凸簇:不能有效处理非凸形状的簇。

3. 改进方法

  1. K-Means++ 初始化:通过优化初始质心选择,减少对初始点的敏感性。
  • 随机选择第一个质心。

  • 根据与已选质心的距离概率选择后续质心。

  • 应用标准 K-Means 算法。

  1. Mini-Batch K-Means:对大数据集进行小批量更新,提高效率。
  2. 层次聚类结合:先使用层次聚类生成 k 个簇,再进行 K-Means 优化。
  3. Elkan 算法:优化距离计算,加速收敛。

4. 确定 k 的方法

肘部法则 (Elbow Method)
  1. 计算不同 k 值下的误差平方和 (SSE)。
  2. 绘制 k-SSE 曲线,找到"肘部"点(即 SSE 的下降速度明显减缓的位置)。
  3. 该点对应的 k 值通常是最佳选择。
轮廓系数 (Silhouette Coefficient)

衡量聚类的质量:

  • a:样本点与同簇中其他点的平均距离。
  • b:样本点与最近簇中点的平均距离。

5. 实现 K-Means

Python 实现(使用 scikit-learn
python 复制代码
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=42)

# K-Means 聚类
kmeans = KMeans(n_init=10, n_clusters=4, random_state=42)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title('K-Means Clustering')
plt.show()

6. 应用场景

  1. 图像压缩:将像素颜色聚类到 k 个簇。
  2. 客户分群:根据消费行为对客户进行分组。
  3. 文本聚类:将文档划分为不同主题。
  4. 基因聚类:根据基因表达模式进行分组。
  5. 推荐系统:对用户或商品分组,提供个性化推荐。

7. 实验与结果分析

评价指标
  1. SSE (Sum of Squared Errors):衡量簇内误差,值越小越好,但可能会过拟合。
  2. 轮廓系数 (Silhouette Coefficient):衡量聚类效果,值越接近 1,聚类效果越好。
  3. Davies-Bouldin 指数:值越小越好,反映簇的分离程度。
  4. Calinski-Harabasz 指数:簇的分离性和紧凑性,值越大越好。

通过以上指标,可以综合评价聚类效果,选择最佳参数 k 和优化方法。


K-Means 是一种经典而高效的聚类算法,适合初学者和实际应用。通过改进方法和调参,可以应对不同类型的数据和应用场景。

相关推荐
@小博的博客3 小时前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
西猫雷婶3 小时前
CNN卷积计算
人工智能·神经网络·cnn
格林威4 小时前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
007php0075 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
倔强青铜三5 小时前
苦练Python第63天:零基础玩转TOML配置读写,tomllib模块实战
人工智能·python·面试
知识分享小能手5 小时前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue
递归不收敛5 小时前
吴恩达机器学习课程(PyTorch 适配)学习笔记:3.3 推荐系统全面解析
pytorch·学习·机器学习
B站计算机毕业设计之家6 小时前
智慧交通项目:Python+YOLOv8 实时交通标志系统 深度学习实战(TT100K+PySide6 源码+文档)✅
人工智能·python·深度学习·yolo·计算机视觉·智慧交通·交通标志
高工智能汽车6 小时前
棱镜观察|极氪销量遇阻?千里智驾左手服务吉利、右手对标华为
人工智能·华为
IT森林里的程序猿6 小时前
基于机器学习方法的网球比赛胜负趋势预测
python·机器学习·django