1. 程式人生 > >相似度的方法

相似度的方法


二、歐幾里得距離

幾個資料集之間的相似度一般是基於每對物件間的距離計算,最常用的是歐幾里德距離:

#-*-coding:utf-8 -*-
#計算歐幾里德距離:
def euclidean(p,q):
#如果兩資料集數目不同,計算兩者之間都對應有的數
same = 0
for i in p:
if i in q:
same +=1

#計算歐幾里德距離,並將其標準化
e = sum([(p[i] - q[i])**2 for i in range(same)])
return 1/(1+e**.5)
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print euclidean(p,q)
三、皮爾遜相關度
幾個資料集中出現異常值的時候,歐幾里德距離就不如皮爾遜相關度‘穩定’,它會在出現偏差時傾向於給出更好的結果。其公式為:

-*-coding:utf-8 -*-
#計算皮爾遜相關度:
def pearson(p,q):
#只計算兩者共同有的
same = 0
for i in p:
if i in q:
same +=1

n = same
#分別求p,q的和
sumx = sum([p[i] for i in range(n)])
sumy = sum([q[i] for i in range(n)])
#分別求出p,q的平方和
sumxsq = sum([p[i]**2 for i in range(n)])
sumysq = sum([q[i]**2 for i in range(n)])
#求出p,q的乘積和
sumxy = sum([p[i]*q[i] for i in range(n)])
# print sumxy
#求出pearson相關係數
up = sumxy - sumx*sumy/n
down = ((sumxsq - pow(sumxsq,2)/n)*(sumysq - pow(sumysq,2)/n))**.5
#若down為零則不能計算,return 0
if down == 0 :return 0
r = up/down
return r
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print pearson(p,q)

四、曼哈頓距離
曼哈頓距離是另一種相似度計算方法,不是經常需要,但是我們仍然學會如何用python去實現,其公式為:

#-*-coding:utf-8 -*-
#計算曼哈頓距離:
def manhattan(p,q):
#只計算兩者共同有的
same = 0
for i in p:
if i in q:
same += 1
#計算曼哈頓距離
n = same
vals = range(n)
distance = sum(abs(p[i] - q[i]) for i in vals)
return distance
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print manhattan(p,q)
五、Jaccard 係數
當資料集為二元變數時,我們只有兩種狀態:0或者1。這個時候以上的計算相似度的方法就無法派上用場,於是我們引出Jaccard係數,這是一個能夠表示兩個資料集都是二元變數(也可以多元)的相似度的指標,其公式為:
#-*-coding:utf-8 -*-
# 計算jaccard係數
def jaccard(p,q):
c = [a for i in p if v in b]
return float(len(c))/(len(a)+len(b)-len(b))
#注意:在使用之前必須對兩個資料集進行去重
我們用一些特殊的資料集去測試一下:

p = ['shirt','shoes','pants','socks']
q = ['shirt','shoes']
print jaccard(p,q)
得出結果是:0.5