简 介:下面是我在学习时候的记录并加上自己的理解。本文意在记录自己近期学习过程中的所学所得,如有错误,欢迎大家指正。
关键词:Python、机器学习
我们有的时候需要计算多个样本之间的距离,这在聚类分析、分类等多种应用中有很重要的地位,但是我们计算距离也会有很多种方式,常见的有欧氏距离、曼哈顿距离、余弦距离等,不同的距离度量方式也会得到不同的结果。
1.欧式距离
欧式距离就是我们常见的两点间的距离公式,我们有两个向量 X = { x 1 , x 2 , x 3 , . . . , x n } X=\{x_1,x_2,x_3,...,x_n\}X={x1,x2,x3,...,xn} ,Y = { y 1 , y 2 , y 3 , . . . , y n } Y=\{y_1,y_2,y_3,...,y_n\}Y={y1,y2,y3,...,yn} ,它们之间的欧式距离定义为:
d i s t { X , Y } = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + . . . + ( x n − y n ) 2 2 dist\{X,Y\}=\sqrt[2]{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}dist{X,Y}=2(x1−y1)2+(x2−y2)2+...+(xn−yn)2
代码进行实现:
>>>from scipy.spatial import distance >>>import numpy as np >>>x=np.random.rand(5,3) >>>distance.cdist(x,x,"euclidean") array([[0. , 0.82990217, 0.51629391, 0.99795209, 1.02249614], [0.82990217, 0. , 0.56393995, 1.20075826, 0.74219282], [0.51629391, 0.56393995, 0. , 0.8845384 , 0.5321388 ], [0.99795209, 1.20075826, 0.8845384 , 0. , 0.84551631], [1.02249614, 0.74219282, 0.5321388 , 0.84551631, 0. ]])
"eculidean"参数的意思就是采用欧式距离进行计算,发现返回的矩阵是一个对称矩阵,然后对角线的元素为0,样本数据到自身的距离为0,我们观察每一行就可以发现自身距离哪一个样本最相近、相似。
2.曼哈顿距离
曼哈顿距离与欧式距离不一样的是,它采用的是各坐标点之间的绝对值之和,它的距离定义为:
d i c t { X , Y } = ∣ x 1 − y 2 ∣ + ∣ x 2 − y 2 ∣ + . . . + ∣ x n − y n ∣ dict\{X,Y\}=|x_1-y_2|+|x_2-y_2|+...+|x_n-y_n|dict{X,Y}=∣x1−y2∣+∣x2−y2∣+...+∣xn−yn∣
代码实现:
>>>distance.cdist(x,x,"cityblock") array([[0. , 1.01612564, 0.78488965, 1.43836375, 1.70427565], [1.01612564, 0. , 0.81865638, 2.05881281, 1.0202692 ], [0.78488965, 0.81865638, 0. , 1.28359666, 0.91938601], [1.43836375, 2.05881281, 1.28359666, 0. , 1.30778372], [1.70427565, 1.0202692 , 0.91938601, 1.30778372, 0. ]])
3.切比雪夫距离
切比雪夫距离是指两个点之间各个坐标数值差绝对值的最大值,距离定义为:
d i c t { X , Y } = m a x i ∣ x i − y i ∣ dict\{X,Y\}=max_i|x_i-y_i|dict{X,Y}=maxi∣xi−yi∣
代码实现:
>>>distance.cdist(x,x,"chebyshev") array([[0. , 0.8179627 , 0.41831074, 0.8843322 , 0.75547722], [0.8179627 , 0. , 0.39965195, 0.78974337, 0.68897626], [0.41831074, 0.39965195, 0. , 0.81146349, 0.33716647], [0.8843322 , 0.78974337, 0.81146349, 0. , 0.65222775], [0.75547722, 0.68897626, 0.33716647, 0.65222775, 0. ]])
4.余弦距离
余弦距离是通过测量两个向量的夹角来进行度量两个向量之间的相似性,余弦距离定义为:
d i s t { X , Y } = X ∗ Y ∑ x i 2 2 ∗ ∑ y i 2 2 dist\{X,Y\}=\frac{X*Y}{\sqrt[2]{\sum{x_i^2}}*\sqrt[2]{\sum{y_i^2}}}dist{X,Y}=2∑xi2∗2∑yi2X∗Y
代码实现:
>>>distance.cdist(x,x,"cosine") array([[0.00000000e+00, 2.25503928e-01, 1.02124613e-01, 6.42061802e-01, 3.51046034e-01], [2.25503928e-01, 0.00000000e+00, 9.70318929e-02, 5.84748128e-01, 1.57888440e-01], [1.02124613e-01, 9.70318929e-02, 1.11022302e-16, 3.40537163e-01, 8.29298244e-02], [6.42061802e-01, 5.84748128e-01, 3.40537163e-01, 1.11022302e-16, 1.61000466e-01], [3.51046034e-01, 1.57888440e-01, 8.29298244e-02, 1.61000466e-01, 0.00000000e+00]])
5.相关系数距离
相关系数距离是根据相关性来定义的,距离定义为:
d i s t { X , Y } = ( x − x ‾ ) ∗ ( y − y ‾ ) ∑ x i − X ‾ 2 ∗ ∑ y i − Y ‾ 2 dist\{X,Y\}=\frac{(x-\overline{x})*(y-\overline{y})}{\sqrt[2]{\sum{x_i-\overline{X}}}*\sqrt[2]{\sum{y_i-\overline{Y}}}}dist{X,Y}=2∑xi−X∗2∑yi−Y(x−x)∗(y−y)
代码实现:
>>>distance.cdist(x,x,"correlation") array([[1.11022302e-16, 5.86032316e-01, 2.53864969e-02, 1.67676504e+00, 1.87869710e+00], [5.86032316e-01, 1.11022302e-16, 3.92732690e-01, 1.95031467e+00, 9.29197448e-01], [2.53864969e-02, 3.92732690e-01, 0.00000000e+00, 1.82441490e+00, 1.74950760e+00], [1.67676504e+00, 1.95031467e+00, 1.82441490e+00, 0.00000000e+00, 7.56775041e-01], [1.87869710e+00, 9.29197448e-01, 1.74950760e+00, 7.56775041e-01, 0.00000000e+00]])
6.马氏距离
马氏距离表示数据的协方差距离,是一种计算两个未知样本集的相似度的有效方法,距离定义:
d i s t { X , Y } = ( X − Y ) T ∑ − 1 ( X − Y ) 2 dist\{X,Y\}=\sqrt[2]{(X-Y)^T\sum^{-1}(X-Y)}dist{X,Y}=2(X−Y)T∑−1(X−Y)
代码实现:
>>>distance.cdist(x,x,"mahalanobis") array([[0. , 2.8248868 , 1.60369019, 2.74503908, 2.99946609], [2.8248868 , 0. , 2.58322883, 2.99330483, 2.80400815], [1.60369019, 2.58322883, 0. , 2.6914824 , 1.51050662], [2.74503908, 2.99330483, 2.6914824 , 0. , 2.71938256], [2.99946609, 2.80400815, 1.51050662, 2.71938256, 0. ]])