1. 兰氏距离:从数学定义到生活化理解
第一次听说兰氏距离时,我也被这个看似高大上的名词唬住了。但当我真正理解它之后,发现这其实就是我们日常生活中常用的"相对误差"概念的升级版。想象一下这样的场景:你和朋友各自测量同一张桌子的长度,你测得100cm,朋友测得102cm。如果直接用差值2cm来衡量误差,这就是曼哈顿距离;但如果用2cm除以两者之和202cm,得到约0.99%的相对误差——这就是兰氏距离的核心思想。
兰氏距离的数学定义非常简洁:
python复制def canberra_distance(x, y):
return sum(abs(xi - yi) / (abs(xi) + abs(yi)) for xi, yi in zip(x, y))
这个公式的精妙之处在于分母部分。分母中的绝对值相加(|xi| + |yi|)起到了自动标准化的作用,使得距离值始终落在0到1之间。我曾在电商平台的价格比较项目中实测过,当两个商品价格分别为10元和12元时,兰氏距离是0.09;而100元和120元的相同比例差价,距离值同样是0.09。这种对量纲不敏感的特性,在处理不同量级数据时特别有用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 异常值检测:兰氏距离的杀手锏应用
2.1 为什么兰氏距离擅长捕捉微小异常
在金融风控领域,我遇到过这样一个实际案例:某支付平台的交易监控系统需要检测异常交易。使用欧氏距离时,一个1000元的正常交易和1010元的可疑交易,距离值只有10;而另一个1元正常交易和11元欺诈交易,距离也是10。显然,后者10倍的金额变化更值得警惕,但欧氏距离无法反映这种差异。
改用兰氏距离后,情况完全不同:
- 1000元和1010元:距离=10/2010≈0.00497
- 1元和11元:距离=10/12≈0.833
这个特性使得兰氏距离对接近零值的小幅波动极其敏感。在工业设备预测性维护中,我们用它来检测传感器信号的微小异常。当设备正常时,振动信号可能在0.01-0.02之间波动;初期故障时可能突增至0.05。虽然绝对值变化不大,但兰氏距离能放大这种差异。
2.2 实现一个简单的异常检测器
下面是我在实际项目中使用过的Python实现:
python复制from sklearn.neighbors import Nearest
