您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python如何實(shí)現(xiàn)距離和相似性計(jì)算”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python如何實(shí)現(xiàn)距離和相似性計(jì)算”吧!
也稱歐幾里得距離,是指在m維空間中兩個(gè)點(diǎn)之間的真實(shí)距離。歐式距離在ML中使用的范圍比較廣,也比較通用,就比如說(shuō)利用k-Means對(duì)二維平面內(nèi)的數(shù)據(jù)點(diǎn)進(jìn)行聚類,對(duì)魔都房?jī)r(jià)的聚類分析(price/m^2 與平均房?jī)r(jià))等。
兩個(gè)n維向量a
(x11,x12.....x1n)
與 b
(x21,x22.....x2n)
間的歐氏距離
python 實(shí)現(xiàn)為:
def EuclideanDistance(x, y): import numpy as np x = np.array(x) y = np.array(y) return np.sqrt(np.sum(np.square(x-y)))
這里傳入的參數(shù)可以是任意維的,該公式也適應(yīng)上邊的二維和三維
python 實(shí)現(xiàn)為:
def ManhattanDistance(x, y): import numpy as np x = np.array(x) y = np.array(y) return np.sum(np.abs(x-y))
切比雪夫距離(Chebyshev Distance)的定義為:max( | x2-x1 | , |y2-y1 | , … ), 切比雪夫距離用的時(shí)候數(shù)據(jù)的維度必須是三個(gè)以上
python 實(shí)現(xiàn)為:
def ChebyshevDistance(x, y): import numpy as np x = np.array(x) y = np.array(y) return np.max(np.abs(x-y))
有M個(gè)樣本向量X1~Xm,協(xié)方差矩陣記為S,均值記為向量μ,則其中樣本向量X到u的馬氏距離表示為
python實(shí)現(xiàn):
def MahalanobisDistance(x, y): ''' 馬氏居立中的(x,y)與歐幾里得距離的(x,y)不同,歐幾里得距離中的(x,y)指2個(gè)樣本,每個(gè)樣本的維數(shù)為x或y的維數(shù);這里的(x,y)指向量是2維的,樣本個(gè)數(shù)為x或y的維數(shù),若要計(jì)算n維變量間的馬氏距離則需要改變輸入的參數(shù)如(x,y,z)為3維變量。 ''' import numpy as np x = np.array(x) y = np.array(y) X = np.vstack([x,y]) X_T = X.T sigma = np.cov(X) sigma_inverse = np.linalg.inv(sigma) d1=[] for i in range(0, X_T.shape[0]): for j in range(i+1, X_T.shape[0]): delta = X_T[i] - X_T[j] d = np.sqrt(np.dot(np.dot(delta,sigma_inverse),delta.T)) d1.append(d) return d1
def moreCos(a,b): sum_fenzi = 0.0 sum_fenmu_1,sum_fenmu_2 = 0,0 for i in range(len(a)): sum_fenzi += a[i]*b[i] sum_fenmu_1 += a[i]**2 sum_fenmu_2 += b[i]**2 return sum_fenzi/( sqrt(sum_fenmu_1) * sqrt(sum_fenmu_2) )
當(dāng)p=1時(shí),就是曼哈頓距離
當(dāng)p=2時(shí),就是歐氏距離
當(dāng)p→∞時(shí),就是切比雪夫距離
python實(shí)現(xiàn):
def MinkowskiDistance(x, y, p): import math import numpy as np zipped_coordinate = zip(x, y) return math.pow(np.sum([math.pow(np.abs(i[0]-i[1]), p) for i in zipped_coordinate]), 1/p)
兩個(gè)等長(zhǎng)字符串s1與s2之間的漢明距離定義為將其中一個(gè)變?yōu)榱硗庖粋€(gè)所需要作的最小替換次數(shù)
def hanmingDis(a,b): sumnum = 0 for i in range(len(a)): if a[i]!=b[i]: sumnum += 1 return sumnum
杰卡德距離,杰卡德距離用兩個(gè)集合中不同元素占所有元素的比例來(lái)衡量?jī)蓚€(gè)集合的區(qū)分度。
def jiekadeDis(a,b): set_a = set(a) set_b = set(b) dis = float(len( (set_a | set_b) - (set_a & set_b) ) )/ len(set_a | set_b) return dis
杰卡德相似系數(shù)
兩個(gè)集合A和B的交集元素在A,B的并集中所占的比例,稱為兩個(gè)集合的杰卡德相似系數(shù),用符號(hào)J(A,B)表示。
def jiekadeXSDis(a,b): set_a = set(a) set_b = set(b) dis = float(len(set_a & set_b) )/ len(set_a | set_b) return dis
相關(guān)系數(shù)
import math def c_Pearson(x, y): x_mean, y_mean = sum(x)/len(x), sum(y)/len(y) cov =0.0 x_pow = 0.0 y_pow = 0.0 for i in range(len(x)): cov += (x[i]-x_mean) *(y[i] - y_mean) for i in range(len(x)): x_pow += math.pow(x[i] - x_mean, 2) for i in range(len(x)): y_pow += math.pow(y[i] - y_mean, 2) sumBm = math.sqrt(x_pow * y_pow) p = cov / sumBm return p
衡量分布的混亂程度或分散程度的一種度量.
import numpy as np data=['a','b','c','a','a','b'] data1=np.array(data) #計(jì)算信息熵的方法 def calc_ent(x): """ calculate shanno ent of 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 return ent
到此,相信大家對(duì)“Python如何實(shí)現(xiàn)距離和相似性計(jì)算”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。