Python機(jī)器學(xué)習(xí)中實(shí)現(xiàn)距離和相似性計(jì)算詳解
歐氏距離
也稱歐幾里得距離,是指在m維空間中兩個(gè)點(diǎn)之間的真實(shí)距離。歐式距離在ML中使用的范圍比較廣,也比較通用,就比如說利用k-Means對(duì)二維平面內(nèi)的數(shù)據(jù)點(diǎn)進(jìn)行聚類,對(duì)魔都房價(jià)的聚類分析(price/m^2 與平均房價(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è)等長字符串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
杰卡德距離 & 杰卡德相似系數(shù)
杰卡德距離,杰卡德距離用兩個(gè)集合中不同元素占所有元素的比例來衡量兩個(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ù) & 相關(guān)距離
相關(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
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)中實(shí)現(xiàn)距離和相似性計(jì)算詳解的文章就介紹到這了,更多相關(guān)Python距離 相似性計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python .py生成.pyd文件并打包.exe 的注意事項(xiàng)說明
這篇文章主要介紹了Python .py生成.pyd文件并打包.exe 的注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Django使用jinja2模板的實(shí)現(xiàn)
本文主要介紹了Django使用jinja2模板的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
python 使用遞歸的方式實(shí)現(xiàn)語義圖片分割功能
這篇文章主要介紹了python 使用遞歸的方式實(shí)現(xiàn)語義圖片分割,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Python中raise用法簡單實(shí)例(超級(jí)詳細(xì),看了無師自通)
python中raise語句用于手動(dòng)觸發(fā)異常,通過raise語句可以在代碼中顯式地引發(fā)異常,從而使程序進(jìn)入異常處理流程,下面這篇文章主要給大家介紹了關(guān)于Python中raise用法的相關(guān)資料,需要的朋友可以參考下2024-03-03
淺談Python里面None True False之間的區(qū)別
這篇文章主要介紹了淺談Python里面None True False之間的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
django rest framework 實(shí)現(xiàn)用戶登錄認(rèn)證詳解
這篇文章主要介紹了django rest framework 實(shí)現(xiàn)用戶登錄認(rèn)證詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

