K-means聚类实战:从理论到代码实现的距离度量艺术

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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值