关于相似性度量与各类距离的意义
? ? ? ? 兩個向量之間的距離計算,在數(shù)學上稱為向量的距離,也稱為樣本之間的相似性度量(Similarity Meansurement)。它反映為某類事物在距離上接近或遠離的程度。
-
范數(shù)
- 閔可夫斯基距離
- 歐氏距離
- 曼哈頓距離
- 切比雪夫距離
- 夾角余弦
- 海明距離
- 杰卡德相似系數(shù)
特征間的相關性
- 相關系數(shù)與相關距離
- 馬氏距離
范數(shù)
????????在數(shù)學的學習,我們肯定都接觸過范數(shù)的這個概念,下面是對范數(shù)的介紹:
范數(shù):向量的范數(shù)可以簡單、形象地理解為向量的長度,或者向量到坐標原點的距離,或者相應空間內的兩點之間的距離。
向量的范數(shù)定義:向量的范數(shù)是一個函數(shù)||x||,滿足非負性||x||>=0,齊次性||cx||=|c| ||x||,三角不等式||x+y||<=||x||+||y||。
下面是對范數(shù)的解釋:
L1范數(shù):||x||為x向量各個元素絕對值之和。
L2范數(shù):||x||為x向量各個元素平方和的開方。L2范數(shù)又稱Euclidean范數(shù)或者Frobenius范數(shù)。
Lp范數(shù):||x||為x向量各個元素絕對值p次方和的1/p次方。
L∞范數(shù):||x||為x向量各個元素絕對值最大的那個元素,如下:
????????????
?向量范數(shù)的運算(使用線性代數(shù)庫linalg):
b = [2, 6, 4] a1 = np.linalg.norm(b) # 當p值不指定時,默認值為2,為L2范數(shù) a2 = np.linalg.norm(b, 1) a3 = np.linalg.norm(b, 2) a4 = np.linalg.norm(b, 3) a5 = np.linalg.norm(b, np.inf) print(a1) print(a2) print(a3) print(a4) print(a5)結果為:
7.48331477355 12.0 7.48331477355 6.60385449779 6.0Process finished with exit code 0閔可夫斯基距離(Mindkowski Distance)
嚴格意義上講,閔可夫斯基距離不是一種距離,而是一組距離的定義。
兩個n維變量A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n)間的閔可夫斯基距離定義為:
????????????????
其中p是一個變參數(shù)。
- 當p=1時,就是曼哈頓距離。
- 當p=2時,就是歐氏距離。
- 當p—>∞時,就是切比雪夫距離。
根據變參數(shù)的不同,閔可夫斯基距離可以表示一類的距離。
歐式距離(Euclidean Distance)
?????????歐式距離可以理解為L2范數(shù)。
(1)二維平面上兩點a(x1, y1)與b(x2, y2)間的歐氏距離:
????????????
(2)三維空間兩點A(x1, y1, z1)與B(x2, y2, z2)間的歐式距離:
????????????
(3)兩個n維向量A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n)間的歐式距離:
????????????
表示向量運算的形式:
????????????
用程序實現(xiàn)歐式距離:
import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.sqrt((vectorA-vectorB)*(vectorA-vectorB).T))結果為:
[[ 4.47213595]]Process finished with exit code 0曼哈頓距離(Manhattan Distance)
曼哈頓距離可以理解為L1范數(shù)
????????曼哈頓距離的命名原因是從規(guī)劃為方型建筑區(qū)塊的城市(如曼哈頓)間,最短的行車路徑而來(忽略曼哈頓的單向車道以及只存在于3、14大道的斜向車道)。任何往東三區(qū)塊、往北六區(qū)塊的的路徑一定最少要走九區(qū)塊,沒有其他捷徑。
(1)二維平面兩點A(x1, y1)與B(x2, y2)間的曼哈頓距離:
????????????
(2)兩個n維向量A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n)間的曼哈頓距離:
????????????
程序實現(xiàn)曼哈頓距離:
import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.sum(np.abs(vectorA-vectorB)))結果為:
6Process finished with exit code 0切比雪夫距離(Chebyshev Distance)
????????在國際象棋中,國王走一步能夠移動到相鄰的8個方格中的任意一個。國王從格子(x1, y1)走到格子(x2, y2)最少需要的步數(shù)總是max(|x2-x1|, |y1-y2)步。該距離度量的方法與切比雪夫距離類似,切比雪夫距離相當于L∞范數(shù)。
(1)二維平面兩點A(x1, y1)與B(x2, y2)間的切比雪夫距離:
????????????
(2)兩個n維向量A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n)間的切比雪夫距離:
????????????
這個公式的另一種等價形式是:
????????????
程序實現(xiàn)切比雪夫距離:
import numpy as np vectorA = np.mat([3, 4, 7]) vectorB = np.mat([3, 8, 5]) print(np.max(np.abs(vectorA-vectorB)))結果為:
4Process finished with exit code 0夾角余弦(Cosine)
在幾何中,夾角余弦可用來衡量兩個向量方向的差異,機器學習中借用這一概念來衡量樣本向量之間的差異。??????
(1)在二維空間中向量A(x1, y1)與向量B(x2, y2)的夾角余弦公式:
????????????
(2)兩個n維樣本點A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n)的夾角余弦:類似地,對于兩個n維樣本點A(x11, x12, ..., x1n)與B(x21, x22, ..., x2n), 可以使用類似于夾角余弦的概念來衡量它們之間的相似程度。
????????夾角余弦取值范圍為[-1, 1]。夾角余弦越大,表示兩個向量的夾角越小;夾角余弦越小,表示兩個向量的夾角越大。當兩個向量的方向重合時,夾角余弦取最大值1;當兩個向量的方向完全相反時,夾角余弦取最小值-1。
程序實現(xiàn):
import numpy as np vectorA = np.array([3, 4, 7]) vectorB = np.array([3, 8, 5]) cosV = np.dot(vectorA, vectorB)/(np.linalg.norm(vectorA)*np.linalg.norm(vectorB)) print(cosV)結果為:
0.892451645372Process finished with exit code 0海明距離(Hamming Distance)
????????在信息編碼中,兩個合法代碼對應位上編碼不同的位數(shù)稱為碼距,又稱海明距離。
????????例如:字符串“1111”與“1001”之間的海明距離為2。
????????主要應用在信息編碼,為了增強容錯性,應使得編碼間的最小Hamming Distance盡可能大。
程序實現(xiàn):
import numpy as np vectorA = np.mat([1, 0, 1, 0, 1, 1, 1, 0]) vectorB = np.mat([0, 1, 1, 1, 0, 0, 1, 0])non = np.nonzero(vectorB-vectorA) print(len(non[0]))結果為:
5Process finished with exit code 0杰卡德相似系數(shù)(Jaccard Similarity Coefficient)
(1)杰卡德相似系數(shù):兩個集合A和B的交集元素在A、B的并集中所占的比例稱為兩個集合的杰卡德相似系數(shù)。
????????杰卡德相似系數(shù)是衡量兩個集合的相似度的一種指標,可用在衡量樣本的相似度上。
(2)杰卡德距離:與杰卡德相似系數(shù)相反的概念是杰卡德距離(Jaccard Distance)。
????????杰卡德距離用兩個集合中不同元素占所有元素的比例來衡量兩個集合的區(qū)分度。
程序實現(xiàn)(使用scipy中的距離函數(shù)):
import numpy as np import scipy.spatial.distance as dist vectorA = [1, 0, 1, 0, 1, 1, 1, 0] vectorB = [0, 1, 1, 1, 0, 0, 1, 0] # A∪B為[1, 1, 1, 1, 1, 1, 1, 0] 和為7 # A∩B為[0, 0, 1, 0, 0, 0, 1, 0] 和為2 vector = np.mat([vectorA, vectorB]) print(dist.pdist(vector, metric='jaccard'))結果為:
[ 0.71428571]Process finished with exit code 0特征間的相關性
相關系數(shù)(Correlation Coefficient)與相關距離(Correlation Distance)
(1)相關系數(shù)的定義:
相關系數(shù)是衡量兩個特征列之間相關程度的一種方法,其取值范圍是[-1, 1]。相關系數(shù)的絕對值越大,表明特征列X與Y的相關度越高。當X與Y線性相關時,相關系數(shù)取值為1(正線性相關)或-1(負線性相關)。
(2)相關距離的定義:
相關系數(shù)的程序實現(xiàn):
import numpy as np vector1 = [2639, 1881, 1542, 1529, 2730, 2042, 2045, 1807, 2111, 1916, 2110, 1541, 1634, 1477, 2197, 1886, 1783,1625, 1521, 1146, 865, 2229, 1651, 1399, 1760, 1362, 1789, 1631, 1512, 1876, 2031] # 衣著消費 vector2 = [3696, 2254, 1204, 1506, 1972, 1844, 1643, 1217, 3724, 3078, 2997, 1933, 2105, 1487, 1656, 1525, 1652,1738, 2954, 1626, 1320, 1471, 1587, 1396, 1434, 550, 2079, 1388, 1097, 1516, 1281] # 文教娛樂消費 v1_mean = np.mean(vector1) v2_mean = np.mean(vector2)dv1 = np.std(vector1) dv2 = np.std(vector2) corref = np.mean(np.multiply(vector1-v1_mean, vector2-v2_mean))/(dv1*dv2) print(corref) # 使用Numpy相關系數(shù)得到相關系數(shù)矩陣 print(np.corrcoef(vector1, vector2))結果為:
0.470486874287 [[ 1. 0.47048687][ 0.47048687 1. ]]相關系數(shù)矩陣的含義是:如果把第一個特征列作為參照數(shù)據(自己與自己的相關系數(shù)為1),那么第二個與第一個的相關程度是47%。
馬氏距離(Mahalanobis Distance)
(1)馬氏距離的定義:有M個樣本向量X1~Xm,協(xié)方差矩陣記為S,均值記為向量μ,則其中樣本向量X到μ的馬氏距離表示為:
它是用坐標差平方除以方差(或者說乘以方差的倒數(shù)),從而轉化為無量綱數(shù)的,推廣到多維就是要乘以協(xié)方差陣的逆矩陣,這就是馬氏距離的概念。
而其中向量Xi與Xj之間的馬氏距離定義為:
若協(xié)方差矩陣時單位矩陣(各個樣本向量之間獨立同分布),則公式變成了歐式距離公式:
若協(xié)方差矩陣是對角矩陣,則公式變成了標準化歐式距離公式。
(2)馬氏距離的優(yōu)點:與量綱無關,排除變量之間的相關性的干擾。
程序實現(xiàn):
import numpy as np vector1 = [2639, 1881, 1542, 1529, 2730, 2042, 2045, 1807, 2111, 1916, 2110, 1541, 1634, 1477, 2197, 1886, 1783,1625, 1521, 1146, 865, 2229, 1651, 1399, 1760, 1362, 1789, 1631, 1512, 1876, 2031] # 衣著消費 vector2 = [3696, 2254, 1204, 1506, 1972, 1844, 1643, 1217, 3724, 3078, 2997, 1933, 2105, 1487, 1656, 1525, 1652,1738, 2954, 1626, 1320, 1471, 1587, 1396, 1434, 550, 2079, 1388, 1097, 1516, 1281] # 文教娛樂消費 vector = np.mat([vector1, vector2])S_1 = np.linalg.inv(np.cov(vector)) v = vector.T[0] - vector.T[1] distMa = np.sqrt(np.dot(np.dot(v, S_1), v.T)) print(distMa)結果為:
[[ 2.27405171]]Process finished with exit code 0?
?
參考:
1.機器學習算法原理與編程實踐/鄭捷著. 北京:電子工業(yè)出版社,2015.11
轉載于:https://my.oschina.net/u/3888421/blog/2231617
總結
以上是生活随笔為你收集整理的关于相似性度量与各类距离的意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 良心推荐:高品质音乐播放器Audirva
- 下一篇: Randomatic mac - AE随