Python實(shí)現(xiàn)各類距離

import numpy as np
import operator
import scipy.spatial.distance as dist  
def pp_ps(inX, dataSet,function):
    # 將點(diǎn)與點(diǎn)的距離寫為點(diǎn)與數(shù)據(jù)集的計(jì)算,返回一維數(shù)據(jù)
    distances = np.array([function(inX, dataSet[i]) for i in range(group.shape[0])])
    return distances

閔可夫斯基距離(Minkowski Distance)

\mathrm{L}_p(\mathbf{x}_i, \mathbf{x}_j)=\sqrt[p]{\sum_{k=1}^{n}\left(x_{i}^{(l)}-x_{j}^{(l)}\right)^{p}}

  • p=1:曼哈頓距離
  • p=2:歐式距離
  • p \rightarrow \infty:切比雪夫距離
np.linalg.norm
def Minkowski_distance_1(vector1, vector2, p):
    return pdist(np.vstack((vector1, vector2)), 'minkowski', p)
20190503191108.png

歐式距離(Euclidean Distance)

\mathrm{L}_2(\mathbf{x}_i, \mathbf{x}_j) = \sqrt{\sum_{k=1}^{n}\left(x_{i}^{(l)}-x_{j}^{(l)}\right)^{2}}

def euclidean_distance_1(inX, dataSet):
    # 點(diǎn)與樣本集的歐式距離
    sub = inX - dataSet
    squ_sub = sub**2
    sum_squ_sub = np.sum(squ_sub, axis=1)
    distances = sum_squ_sub**0.5
    return distances
def euclidean_distance_2(inX, dataSet):
    # 點(diǎn)與樣本集的歐式距離
    return np.linalg.norm(inX - dataSet,axis=1)
def euclidean_distance_3(vector1, vector2):
    # 點(diǎn)與點(diǎn)的歐式距離
    return pdist(np.vstack((vector1, vector2)), 'euclidean')

標(biāo)準(zhǔn)歐式距離(Standardized Euclidean Distance)

\mathrm{L}_2(\mathbf{x}_i, \mathbf{x}_j) = \sqrt{\sum_{k=1}^{n}\left(x_{i}^{(l)}-x_{j}^{(l)}\right)^{2}}

def euclidean_distance_1(vector1, vector2):
    # 點(diǎn)與點(diǎn)的標(biāo)準(zhǔn)歐式距離,v是方差向量林螃,表示 v[i]表示第i個(gè)分量的方差戏锹,如果缺失宋下。默認(rèn)自動(dòng)計(jì)算政模。
    return pdist(X, 'seuclidean', V=None)

曼哈頓距離(Manhattan Distance)

\mathrm{L}_{1}(\mathbf{x}_i, \mathbf{x}_j)=\sum_{l=1}^{n}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|

def manhattan_distance_1(inX, dataSet):
    # 點(diǎn)與樣本集的曼哈頓距離
    sub = inX - dataSet
    abs_sub = np.abs(sub)
    distances = np.sum(abs_sub, axis=1)
    return distances
def manhattan_distance_2(inX, dataSet):
    # 點(diǎn)與樣本集的曼哈頓距離
    return np.linalg.norm(inX - dataSet,axis=1,ord=1)
def manhattan_distance_3(vector1, vector2):
    # 點(diǎn)與點(diǎn)的曼哈頓距離
    return pdist(np.vstack((vector1, vector2)), 'cityblock')

切比雪夫距離(Chebyshev Distance)

\mathrm{L}_{\infty}(\mathbf{x}_i, \mathbf{x}_j)=\max _{l}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|

def chebyshev_distance_1(inX, dataSet):
    # 點(diǎn)與樣本集的切比雪夫距離
    sub = inX - dataSet
    abs_sub = np.abs(sub)
    distances = np.max(abs_sub, axis=1)
    return distances
def chebyshev_distance_2(inX, dataSet):
    # 點(diǎn)與樣本集的切比雪夫距離
    return np.linalg.norm(inX - dataSet,axis=1,ord=np.inff)
def chebyshev_distance_3(vector1, vector2):
    # 點(diǎn)與點(diǎn)的切比雪夫距離
    return pdist(np.vstack((vector1, vector2)), 'chebyshev')

馬氏距離(Mahalanobis Distance)

  • 要求樣本數(shù)要大于維數(shù)笋熬,否則無法求協(xié)方差矩陣
    有M個(gè)樣本向量X1~Xm,協(xié)方差矩陣記為S菩鲜,均值記為向量μ园细,則其中樣本向量X到u的馬氏距離表示為:
    \mathrm{D}(\mathrm{X})=\sqrt{(X-\mu)^{T} S^{-1}(X-\mu)}
    其中向量X_{i}, X_{j}之間的馬氏距離定義為:
    \mathrm{D}\left(X_{i}, X_{j}\right)=\sqrt{\left(X_{i}-X_{j}\right)^{T} S^{-1}\left(X_{i}-X_{j}\right)}
    若協(xié)方差矩陣是單位矩陣(各個(gè)樣本向量之間獨(dú)立同分布),則公式就成了歐式距離:
    \mathrm{D}\left(X_{i}, X_{j}\right)=\sqrt{\left(X_{i}-X_{j}\right)^{T}\left(X_{i}-X_{j}\right)}
#方法一:根據(jù)公式求解
def Mahalanobis_distance_1(x,y):
    X=np.vstack([x,y])
    XT=X.T
    S=np.cov(X)   #兩個(gè)維度之間協(xié)方差矩陣
    SI = np.linalg.inv(S) #協(xié)方差矩陣的逆矩陣
    #馬氏距離計(jì)算兩個(gè)樣本之間的距離,此處共有10個(gè)樣本接校,兩兩組合猛频,共有45個(gè)距離。
    n=XT.shape[0]
    d1=[]
    for i in range(0,n):
        for j in range(i+1,n):
            delta=XT[i]-XT[j]
            d=np.sqrt(np.dot(np.dot(delta,SI),delta.T))
            d1.append(d)
    return d1
        
#方法二:根據(jù)scipy庫求解
def Mahalanobis_distance_2(x,y):
    X=np.vstack([x,y])
    XT=X.T
    d2=pdist(XT,'mahalanobis')
    return d2

巴氏距離(Bhattacharyya Distance)

D_{B}(p, q)=-\ln (B C(p, q))
其中B C(p, q)=\sum_{x \in X} \sqrt{p(x) q(x)}

def bhattacharyya_distance_1(vector1, vector2):
    # 點(diǎn)與樣本集的巴氏距離:
    BC = np.sum(np.sqrt(vector1 * vector2))
    return -np.log(BC)

漢明距離(Hamming Distance)

兩個(gè)等長字符串s1與s2之間的漢明距離定義為將其中一個(gè)變?yōu)榱硗庖粋€(gè)所需要作的最小替換次數(shù)蛛勉。例如字符串“1111”與“1001”之間的漢明距離為2鹿寻。

def hamming_distance_1(vector1, vector2):
    # 點(diǎn)與點(diǎn)的漢明距離
    return np.shape(np.nonzero(vector1 - vector2)[0])[0]
def hamming_distance_2(vector1, vector2):
    # 點(diǎn)與點(diǎn)的漢明距離
    return pdist(np.vstack((vector1, vector2)), 'hamming')

皮爾遜系數(shù)(Pearson Correlation Coefficient)

\rho=\frac{\operatorname{Cov}(X, Y)}{\sigma_{X} \sigma_{Y}}

from scipy.stats import pearsonr
x = [0.5, 0.4, 0.6, 0.3, 0.6, 0.2, 0.7, 0.5]
y = [0.6, 0.4, 0.4, 0.3, 0.7, 0.2, 0.5, 0.6]
pearsonr(x, y)
# 輸出:(r, p)
# r:相關(guān)系數(shù)[-1,1]之間
# p:p值越小

信息熵(Informationentropy)

data1=np.array(['a','b','c','a','a','b'])
#計(jì)算信息熵的方法
def entropy(x):
    x_value_list = set([x[i] for i in range(x.shape[0])])
    ent = 0.0
    for x_value in x_value_list:
        p = float(x[x == x_value].shape[0]) / x.shape[0]
        logp = np.log2(p)
        ent -= p * logp
    print(ent)
calc_ent(data1),data1

n是類別數(shù)诽凌,p\left(x_{i}\right)是第i類的概率
H=-\sum_{i=1}^{n} p\left(x_{i}\right) \log _{2} p\left(x_{i}\right)

夾角余弦(Cosine)

\cos (\theta)=\frac{A B}{|\mathrm{A} \| \mathrm{B}|} = \frac{\sum_{i=1}^{n} A_{i} \times B_{i}}{\sqrt{\sum_{i=1}^{n}\left(A_{i}\right)^{2}} \times \sqrt{\sum_{i=1}^{n}\left(B_{i}\right)^{2}}}

def Cosine_distance_1(vector1, vector2):
    # 點(diǎn)與點(diǎn)的夾角余弦距離
    return np.dot(vector1,vector2)/(np.linalg.norm(vector1)*(np.linalg.norm(vector2)))
def Cosine_distance_2(vector1, vector2):
    # 點(diǎn)與點(diǎn)的夾角余弦距離
    return pdist(np.vstack((vector1, vector2)), 'cosine')

杰卡德相似系數(shù)(Jaccard similarity coefficient)

  • 相似系數(shù)
    \mathrm{J}(\mathrm{A}, \mathrm{B})=\frac{|\mathrm{A} \cap \mathrm{B}|}{|\mathrm{A} \cup \mathrm{B}|}
  • 杰卡德距離
    \mathrm{J}_{\delta}(\mathrm{A}, \mathrm{B})=1-\mathrm{J}(\mathrm{A}, \mathrm{B})=\frac{|\mathrm{A} \cup \mathrm{B}|-|\mathrm{A} \cap \mathrm{B}|}{|\mathrm{A}\cup\mathrm{B}|}
def jaccard_similarity_coefficient(vector1, vector2):
    # 點(diǎn)與點(diǎn)的杰卡德距離
    return dist.pdist(np.array([vector1, vector2]), 'jaccard')

經(jīng)典貝葉斯公式

\mathrm{P}(\mathrm{B} | \mathrm{A})=\frac{P(\mathrm{A} | \mathrm{B}) \mathrm{P}(\mathrm{B})}{\mathrm{P}(\mathrm{A})}

堪培拉距離(Canberra Distance)

def canberra_distance_1(vector1, vector2):
    # 點(diǎn)與點(diǎn)的堪培拉距離
    return dist.pdist(np.array([vector1, vector2]), 'canberra')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毡熏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侣诵,更是在濱河造成了極大的恐慌痢法,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窝趣,死亡現(xiàn)場(chǎng)離奇詭異疯暑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哑舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幻馁,“玉大人洗鸵,你說我怎么就攤上這事≌锑拢” “怎么了膘滨?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稀拐。 經(jīng)常有香客問我火邓,道長,這世上最難降的妖魔是什么德撬? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任铲咨,我火速辦了婚禮,結(jié)果婚禮上蜓洪,老公的妹妹穿的比我還像新娘纤勒。我一直安慰自己,他們只是感情好隆檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布摇天。 她就那樣靜靜地躺著粹湃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泉坐。 梳的紋絲不亂的頭發(fā)上为鳄,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音腕让,去河邊找鬼济赎。 笑死记某,一個(gè)胖子當(dāng)著我的面吹牛司训,可吹牛的內(nèi)容都是我干的液南。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滑凉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畅姊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤若未,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后粗合,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隙疚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了供屉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片行冰。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伶丐,靈堂內(nèi)的尸體忽然破棺而出悼做,到底是詐尸還是另有隱情,我是刑警寧澤撵割,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布贿堰,位于F島的核電站,受9級(jí)特大地震影響啡彬,放射性物質(zhì)發(fā)生泄漏羹与。R本人自食惡果不足惜故硅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纵搁。 院中可真熱鬧吃衅,春花似錦、人聲如沸腾誉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽利职。三九已至趣效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猪贪,已是汗流浹背跷敬。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留热押,地道東北人西傀。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像桶癣,于是被迫代替她去往敵國和親拥褂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容