1. K-Means聚类算法概述
K-Means是一种经典的无监督学习算法,用于将未标记的数据集划分为K个不同的簇。它的核心思想是通过迭代优化,将数据点分配到最近的聚类中心,然后重新计算聚类中心的位置,直到满足收敛条件。
1.1 算法基本概念
K-Means中的"K"代表要形成的簇的数量,"Means"表示算法使用各簇中数据点的均值来确定中心位置。算法通过最小化簇内平方和(Within-Cluster Sum of Squares, WCSS)来实现聚类目标,即让每个数据点尽可能靠近其所属簇的中心。
注意:K-Means对初始中心点的选择敏感,不同的初始化可能导致不同的聚类结果。实践中通常使用k-means++初始化方法来改善这一问题。
1.2 算法数学原理
K-Means的目标函数可以表示为:
code复制J = ΣΣ ||x_i - μ_j||²
其中:
- x_i表示第i个数据点
- μ_j表示第j个簇的中心
- 第一个Σ遍历所有簇
- 第二个Σ遍历属于该簇的所有点
算法通过以下步骤最小化目标函数J:
- 随机初始化K个聚类中心
- 将每个数据点分配到最近的聚类中心
- 重新计算每个簇的中心(均值)
- 重复步骤2-3直到收敛
收敛条件通常是:
- 聚类中心的变化小于某个阈值
- 目标函数J的变化小于某个阈值
- 达到最大迭代次数
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. K-Means算法实现细节
2.1 距离度量选择
K-Means默认使用欧氏距离作为距离度量:
code复制d(x,y) = √Σ(x_i - y_i)²
但在实际应用中,可以根据数据特性选择其他距离度量:
- 曼哈顿距离:适用于具有离群值的数据
code复制d(x,y) = Σ|x_i - y_i| - 余弦相似度:适用于文本数据或高维稀疏数据
code复制similarity = (x·y)/(||x||·||y||) - 马氏距离:考虑特征间相关性的距离度量
提示:在scikit-learn中,可以通过metric参数指定不同的距离度量,但标准KMeans类仅支持欧氏距离。如需使用其他距离度量,需要考虑使用其他实现如KMedoids。
2.2 初始化方法比较
K-Means的聚类结果受初始中心点选择影响很大。常见的初始化方法包括:
-
随机初始化:完全随机选择K个点作为初始中心
- 优点:实现简单
- 缺点:可能导致次优解,需要多次运行
-
k-means++(默认方法):基于概率的智能初始化
- 第一个中心随机选择
- 后续中心选择远离已选中心的点
- 优点:通常能获得更好的初始解
- 缺点:计算开销略大
-
基于先验知识的初始化:根据领域知识指定初始中心
- 优点:可融入专家知识
- 缺点:需要额外的领域知识
实验表明,k-means++通常能在较少的迭代次数内收敛到较好的解,是scikit-learn中的默认方法。
