欧式距离和马式距离的区别

本文探讨了欧式距离和马氏距离在数据挖掘中的应用及其区别。欧式距离受数据分布、噪声、高维度和特征度量标准影响,而马氏距离则通过协方差矩阵消除量纲和属性相关性影响,实现坐标旋转和数据压缩。马氏距离更合理地考虑了全局数据统计特性,避免了欧式距离的局限性。

前言

为什么要讨论这两个距离之间的区别?

因为,距离函数的选择对数据挖掘算法的效果具有很大的影响,使用错误的距离函数对挖掘过程非常有害。有时候,语义非常相似的对象被认为不相似,而语义不相似的对象却被认为是相似的,这都是因为距离函数选择不佳导致的。这篇文章就是想告诉大家欧式距离不是万能的,距离函数的选择应该随应用场景而定。

欧式距离

设有两个n维数据点X=(x1,x2,...,xn)X=(x_1,x_2,...,x_n)X=(x1,x2,...,xn)Y=(y1,y2,...,yn)Y=(y_1,y_2,...,y_n)Y=(y1,y2,...,yn)之间的欧几里得距离为:
Dist(X,Y)=∑i=1n(xi−yi)2=(X−Y)(X−Y)T \begin{aligned} Dist(X,Y)=\sqrt{\sum\limits_{i=1}^n(x_i-y_i)^2}=\sqrt{(X-Y)(X-Y)^T} \end{aligned} Dist(X,Y)=i=1n(xiyi)2 =(XY)(XY)T
欧式距离表示的是两点之间的直线距离,它有个很好的性质就是旋转不变性,即两点之间的距离不会因为坐标轴的改变而改变。然而,欧式距离受到数据分布、噪声、高维度和特征度量标准的影响,效果并不太好。

马氏距离

设有n×mn×mn×m维数据集D,令S∈S\inSRm×mR^{m×m}Rm×m为数据集D的协方差矩阵,X、YX、YXY是数据集D中的任意两行,两个m维行向量的马哈拉诺比斯距离为:
Dist(X,Y)=(X−Y)S−1(X−Y)T \begin{aligned} Dist(X,Y)=\sqrt{(X-Y)S^{-1} (X-Y)^T} \end{aligned} Dist(X,Y)=(<

### 欧式距离马氏距离的概念 #### 欧式距离 欧式距离是最常见的两点间直线距离,在n维空间中,如果存在两个点 \( A(x_1, y_1,...,z_1) \) \( B(x_2,y_2,...,z_2) \),那么它们之间的欧几里得距离可以通过下面的公式计算: \[ d_{Euclidean}(A,B)=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2+...+(z_2-z_1)^2} \] 该度量方法简单直观,适用于各维度相互独立的情况。 #### 马氏距离 相比之下,马氏距离考虑到了各个变量间的协方差影响。设有一个随机向量X=[\( X_1,X_2,\ldots ,X_p \)]T服从多元正态分布N(μ,Σ),则任意一点P到均值μ的马哈拉诺比斯距离定义为: \[ D_M(P)=(X-\mu )^{T}\Sigma ^{-1}(X-\mu ). \] 这里Σ表示协方差矩阵[^1]。 ### 应用场景对比 - **欧式距离的应用** - 当数据集中各属性之间不存在线性相关性或者关联较弱时适用; - 计算简便快速,适合大规模数据分析; - **马氏距离的优势** - 能够处理具有不同尺度以及可能存在相关性的多维特征; - 对于受噪声干扰较大的情况更为稳健; - 常用于模式识别领域内的分类器设计当中,尤其是在生物统计学等领域有着广泛的应用价值。 综上所述,选择何种距离测度取决于具体问题背景下的特性需求。当面对复杂结构化数据集时,考虑到其内部可能存在的依赖关系,通常推荐优先尝试使用马氏距离进行建模分析。 ```python import numpy as np from scipy.spatial.distance import mahalanobis, euclidean def calculate_distances(point_a, point_b, cov_matrix=None): """ Calculate both Euclidean and Mahalanobis distances between two points. Parameters: point_a (array-like): First data point of shape (n_features,) point_b (array-like): Second data point of same shape as `point_a` cov_matrix (ndarray or NoneType): Covariance matrix used for calculating the Mahalanobis distance Returns: tuple: Pair containing float values representing respectively the Euclidean and Mahalanobis distances """ euc_dist = euclidean(point_a, point_b) if cov_matrix is not None: inv_covmat = np.linalg.inv(cov_matrix) maha_dist = mahalanobis(point_a, point_b, inv_covmat) else: maha_dist = None return euc_dist, maha_dist # Example usage with random data generation np.random.seed(42) data_points = np.random.multivariate_normal([0, 0], [[1, .8], [.8, 1]], size=100).T cov_mat = np.corrcoef(data_points) example_point_pair = ([.5,.6],[-.3,-.9]) eudist,mahdist = calculate_distances(*example_point_pair,cov_mat) print(f'Euclidean Distance:{eudist:.3f}') if mahdist is not None: print(f'Mahalanobis Distance:{mahdist:.3f}') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值