KMeans 算法
KMeans 算法的核心是计算样本与质心之间的距离,不同的距离度量方法会导致聚类结果的差异。
1. 欧氏距离(Euclidean Distance)
- 公式:\(d(x,y) = \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}\)
- 特点:最常用的距离度量,直观表示空间中两点的直线距离。
- 适用场景:数据分布均匀、各向同性的场景,如坐标点聚类。
- 实现:
sklearn默认使用欧氏距离。
2. 曼哈顿距离(Manhattan Distance)
- 公式:\(d(x, y) = \sum_{i=1}^{n} |x_i - y_i|\) ,各维度差值的绝对值之和。
- 二维空间示例在二维平面中,点\((x_1, y_1)\)和\((x_2, y_2)\)的曼哈顿距离为:\(d = |x_1 - x_2| + |y_1 - y_2|\)
3. 余弦相似度(Cosine Similarity)
- 公式:\(\text{sim}(x,y) = \frac{x \cdot y}{||x|| \cdot ||y||}\)
- 特点:衡量方向相似性,而非绝对距离。常用于高维数据(如文本、图像)。
- 适用场景:文档聚类、推荐系统。
- 注意:需将相似度转换为距离(如
1 - 余弦相似度)。
4. 切比雪夫距离(Chebyshev Distance)
- 公式:\(d(x,y) = \max_i |x_i - y_i|\)
- 特点:只考虑维度间的最大差异,对异常值不敏感。
- 适用场景:网格状数据或需要忽略次要差异的场景。
5. 闵可夫斯基距离(Minkowski Distance)
-
公式:\(d(x,y) = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{1/p}\)
-
参数: \(p \geq 1\)
- \(p=1\) 时退化为曼哈顿距离;
- \(p=2\) 时即为欧氏距离;
- \(p \to \infty\) 时趋近于切比雪夫距离。
-
适用场景:通用距离度量,通过调整 \(p\) 适应不同数据特性。
6. 马氏距离(Mahalanobis Distance)
- 公式:\(d(x,y) = \sqrt{(x-y)^T S^{-1} (x-y)}\)
- 特点:考虑数据的协方差结构,对各向异性数据效果好。
- 适用场景:处理具有相关性的高维数据(如基因数据)。
7. 汉明距离(Hamming Distance)
- 公式:两个向量中不同元素的比例。
- 适用场景:分类变量或二进制数据(如文本编码、基因序列)。
8. 编辑距离(Levenshtein Distance)
- 定义:将一个字符串转换为另一个字符串所需的最少编辑操作次数(插入、删除、替换)。
- 适用场景:自然语言处理中的文本聚类。
如何在 KMeans 中使用不同距离?
-
sklearn 中的 KMeans:默认仅支持欧氏距离,若需其他距离,可通过自定义距离矩阵实现(但计算效率较低)。
-
自定义实现:类似你提供的代码,通过修改距离计算逻辑支持不同度量(如示例中的曼哈顿距离)。
-
替代算法 :
- DBSCAN:支持任意距离度量,基于密度聚类。
- 谱聚类:通过相似度矩阵定义距离,适用于非线性结构。
选择建议
- 连续数值数据:优先考虑欧氏距离或曼哈顿距离。
- 高维稀疏数据:余弦相似度更合适。
- 有相关性的数据:马氏距离能消除维度间的相关性影响。
不同距离度量会引导 KMeans 发现不同形状的簇(如欧氏距离倾向于发现球形簇),需根据数据特性和业务需求选择。

浙公网安备 33010602011771号