1. K-means聚类入门:从距离度量说起
第一次接触K-means时,我被一个简单例子震撼到了。假设你面前摆着100个不同颜色的小球,要求不借助任何标签信息将它们分成3组。你会怎么做?大多数人会本能地把颜色相近的球放在一起——这其实就是K-means最朴素的实现。
在算法世界里,这种"相近"需要通过数学语言精确表达。距离度量就是K-means判断相似性的尺子。想象你在城市中寻找最近的咖啡店,欧式距离就像用直尺测量两点间的直线距离,而马氏距离则像考虑交通状况后计算的"实际可达距离"。
我常用一个实际案例来解释这个概念:电商用户分群。假设我们有用户的月消费金额和登录频率两个特征:
- 用户A:[5000元, 15次]
- 用户B:[5200元, 16次]
- 用户C:[1000元, 30次]
用欧式距离计算,A和B的距离是√[(5200-5000)² + (16-15)²] ≈ 200.005,而A和C的距离≈4000.16。显然A和B更相似,应该归为一类。
from sklearn.metrics import pairwise_distances
import numpy as np
users = np.array([[5000,15], [5200,16], [1000,30]])
# 欧式距离矩阵
print(pairwise_distances(users, metric='euclidean'))
2. 欧式距离 vs 马氏距离:尺度差异的较量
在实际项目中,我发现当特征尺度差异大时,欧式距离会出问题。比如用身高(cm)和体重(kg)聚类:
- 身高变化范围可能只有150-190cm
- 体重变化范围可能是40-100kg
这时体重对距离计算的影响会远大于身高。我曾处理过医疗数据,血红蛋白含量(g/L)和白细胞计数(×10⁹/L)就存在类似问题。这时马氏距离就派上用场了。
马氏距离公式: $$ D_M(x,y) = \sqrt{(x-y)^T S^{-1}(x-y)} $$ 其中S是协方差矩阵。它通过考虑特征间的相关性,自动调整各维度的权重。
from scipy.spatial.distance import mahalanobis
import pandas as pd
# 生成模拟数据
data = pd.DataFrame({
'height': np.random.normal(170, 10, 100),
'weight': np.random.normal(60, 15, 100)
})
# 计算协方差矩阵的逆
cov_matrix = np.cov(data.values.T)
inv_cov = np.linalg.inv(cov_matrix)
# 计算两个样本的马氏距离
point1


10万+

被折叠的 条评论
为什么被折叠?



