当前位置: 首页 > news >正文

K 均值聚类:从概念到实践的无监督学习之旅

在机器学习的世界里,有一类算法能在没有 “参考答案”(标签)的情况下,将相似的数据自动归为一类,这就是聚类算法。其中,K 均值(K-means)算法因其简单高效,成为最常用的聚类方法之一。

一、聚类:无监督学习的 “分组术”

聚类是机器学习中的一种无监督学习任务 —— 也就是说,我们手上的数据没有预设的标签(比如 “猫”“狗” 或 “好”“坏”),需要通过算法自动发现数据中的内在结构,将相似的样本分到同一组(称为 “簇”),不同的样本分到不同的组。

举个例子:如果给你一组包含身高、体重的数据,聚类算法能自动将 “高瘦”“矮胖” 等特征相似的人归为一类,而不需要提前告诉你 “这是高瘦组”。

聚类的核心挑战在于两点:

  • 如何定义 “相似”(通常通过距离度量);
  • 如何评估聚类结果的好坏(因为没有标签,无法直接判断对错)。

二、衡量 “相似性”:距离度量的关键作用

要判断两个样本是否相似,最直观的方式是计算它们之间的 “距离”—— 距离越近,越相似。常用的距离度量有两种:

1. 欧式距离(欧几里得距离)

这是我们最熟悉的距离度量,本质是多维空间中两点之间的 “直线距离”。

2. 曼哈顿距离(出租车距离)

想象在城市网格中,出租车从一个点到另一个点的行驶距离(只能沿直角方向移动),就是曼哈顿距离。

三、K 均值聚类:算法步骤详解

K 均值聚类的核心思想是:通过迭代找到\(k\)个簇的中心,让每个样本都属于离它最近的中心所在的簇,最终使簇内样本尽可能相似,簇间样本尽可能不同。

具体步骤如下:

  1. 初始化:随机选择\(k\)个样本作为初始的 “簇中心”(k是我们需要提前设定的簇数量);
  1. 分配样本:计算每个样本到\(k\)个簇中心的距离,将样本分到距离最近的簇中;
  1. 更新中心:对每个簇,计算簇内所有样本的均值(如均值坐标),作为新的簇中心;
  1. 迭代收敛:重复步骤 2 和 3,直到簇中心不再明显变化(或达到最大迭代次数),此时的聚类结果即为最终结果。

四、如何评估聚类效果?CH 指标

由于聚类是无监督学习,没有标签来直接验证结果,我们需要通过 “内部指标” 评估。其中,CH 指标(Calinski-Harabasz 指数)是常用的一种:

  • 类内紧密度:计算每个样本与所在簇中心的距离平方和,值越小说明簇内样本越集中;
  • 类间分离度:计算各簇中心与整个数据集中心的距离平方和,值越大说明簇与簇之间越分散。

CH 指标的计算公式为 “类间分离度 / 类内紧密度” 的比值,CH 值越大,说明聚类结果越好(簇内越密,簇间越散)。

五、K 均值的优缺点

优点:

  • 简单直观,容易理解和实现;
  • 计算效率高,时间复杂度与样本数量呈线性关系,适合处理大规模常规数据集。

缺点:

  • k 值难确定:需要人工预设\(k\),而实际数据中最优\(k\)往往未知;
  • 对初始簇中心敏感:不同的初始中心可能导致不同的聚类结果;
  • 难以处理复杂形状的簇:比如环形、非凸形数据,容易分错。

六、代码实践:用 Python 实现 K 均值聚类

我们可以用scikit-learn库快速实现 K 均值聚类,步骤如下:

1. 生成模拟数据

用make_blobs函数生成适合聚类的数据集,关键参数:

  • n_samples:样本数量(默认 100);
  • n_features:样本维度(默认 2);
  • centers:簇的数量(默认 3);
  • random_state:随机种子(固定结果)。
from sklearn.datasets import make_blobs
# 生成3个簇,100个样本,2个特征
X, y_true = make_blobs(n_samples=100, n_features=2, centers=3, random_state=42)

2. 应用 K 均值算法

用KMeans类进行聚类,关键参数:

  • n_clusters:簇的数量(即\(k\));
  • max_iter:最大迭代次数;
  • random_state:随机种子。
from sklearn.cluster import KMeans
# 设定k=3,训练模型
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)

3. 可视化结果(可选)

用matplotlib绘制聚类结果,不同簇用不同颜色标记:

import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', label='中心')
plt.legend()
plt.show()

总结

K 均值聚类作为一种经典的无监督学习算法,凭借简单高效的特点,在客户分群、图像分割、异常检测等场景中被广泛应用。但它也有局限性,实际使用时需要结合数据特点选择合适的距离度量和k值

http://www.dtcms.com/a/342612.html

相关文章:

  • 面试后的跟进策略:如何提高录用几率并留下专业印象
  • 暂停更新的高速下载网盘,作者可能不再维护
  • Oracle: cannot decrease column length because some value is too big
  • .NET Core MongoDB 查询数据异常及解决
  • 分布式集群压测+grafana+influxdb+Prometheus详细步骤
  • 详细说明http协议特别是conten-length和chunk编码,并且用linux的命令行演示整个过程
  • Python读取和设置PNG图片的像素值
  • 软件漏洞扫描的测试内容(二)
  • DzzOffice V2.3.7 核心功能升级与关键问题修复,体验全面优化!
  • 计算机网络-1——第一阶段
  • 【苹果软件】Prism Mac 9.4苹果系统免费安装包英文版 Graphpad Prism for Mac 9.4软件免费下载与详细图文教程!!
  • UGUI源码剖析(12):实战演练——从零构建一个健壮的Gradient顶点特效
  • 虚幻基础:目标值之间的过渡
  • 数字货币发展存在的问题:交易平台的问题不断,但监管日益加强
  • C++ string类(c_str , find和rfind , npos , find_first_of)
  • DeepSeek V3.1正式发布,专为下代国产芯设计
  • 【LeetCode 热题 100】322. 零钱兑换——(解法二)自底向上
  • 2025年物流大数据分析的主要趋势
  • 血缘元数据采集开放标准:OpenLineage Dataset Facets
  • Python-Pandas GroupBy 进阶与透视表学习
  • 如何用算力魔方4060安装PaddleOCR MCP 服务器
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • Windows下,将本地视频转化成rtsp推流的方法
  • 高效处理NetCDF文件经纬度转换:一个纯CDO驱动的Bash脚本详解
  • GitHub 热榜项目 - 日榜(2025-08-21)
  • 009.Redis Predixy + Sentinel 架构
  • 深度卷积神经网络AlexNet
  • 【NVIDIA-B200】生产报错 Test CUDA failure common.cu:1035 ‘system not yet initialized‘
  • Docker 搭建 Gitlab 实现自动部署Vue项目