文本是一種高維的語義空間,需要對其進行抽象分解,從而能夠從數學角度去量化其相似性。
距離度量的方式有多種多樣,但是一種相似度計算方式并不適用與所有的情況,需要根據不同的情況和數據類型進行選擇。
余弦相似度
余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小,余弦值越接近1,就表明夾角越接近0度,兩個向量越相似。
相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。
適合word2vec模型向量化的數據。
Python代碼實現:
def cosine_similarity(vector1, vector2):
dot_product = 0.0
normA = 0.0
normB = 0.0
for a, b in zip(vector1, vector2):
dot_product += a * b
normA += a ** 2
normB += b ** 2
if normA == 0.0 or normB == 0.0:
return 0
else:
return round(dot_product / ((normA**0.5)*(normB**0.5)) * 100, 2)
或者
import numpy as np
def get_cossimi(x,y):
myx=np.array(x)
myy=np.array(y)
cos1=np.sum(myx*myy)
cos21=np.sqrt(sum(myy*myy))
cos22=np.sqrt(sum(myx*myx))
return (cos1/float(cos22*cos21))
曼哈頓距離(L1范數)
統計相同坐標軸上的距離的和。
歐式距離(L2范數)
歐氏距離是最常用的距離計算公式,衡量的是多維空間中各個點之間的絕對距離,當數據很稠密并且連續時,這是一種很好的計算方式。
因為計算是基于各維度特征的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,如在KNN中需要對特征進行歸一化。
def distance(vector1,vector2):
d=0;
for a,b in zip(vector1,vector2):
d+=(a-b)**2;
return d**0.5;
閔可夫斯基距離(Lp范數)
歐式距離和曼哈頓距離在形式上比較相近,其實它們都是閔可夫斯基距離的特殊化。閔可夫斯基距離適合TF-IDF向量化后的數據或者提煉出來的主題模型數據。
皮爾森相關系數(pearson)
皮爾森相關系數是衡量線性關聯性的程度。
兩個連續變量(X,Y)(X,Y)的pearson相關性系數PX,YPX,Y等于它們之間的協方差cov(X,Y)cov(X,Y)除以它們各自標準差的乘積σXσX,σYσY。系數的取值總是在-1.0到1.0之間,接近0的變量被成為無相關性,接近1或者-1被稱為具有強相關性。
from math import sqrt
def multipl(a,b):
sumofab=0.0
for i in range(len(a)):
temp=a[i]*b[i]
sumofab+=temp
return sumofab
def corrcoef(x,y):
n=len(x)
#求和
sum1=sum(x)
sum2=sum(y)
#求乘積之和
sumofxy=multipl(x,y)
#求平方和
sumofx2 = sum([pow(i,2) for i in x])
sumofy2 = sum([pow(j,2) for j in y])
num=sumofxy-(float(sum1)*float(sum2)/n)
#計算皮爾遜相關系數
den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
return num/den
Jaccard相似性系數
Jaccard(杰卡德)相似性系數主要用于計算兩個一元unary向量(buy or not, click or not)相似性的度量,或者用于集合sets相似性形式定義。若樣本間的特征屬性由符號和布爾值標識,無法衡量差異具體值的大小,只能獲得“是否相同”這樣一種結果,而Jaccard系數關心的是樣本間共同具有的特征。適合詞集模型向量化的數據。
Jaccard相似度沒有考慮評分的大小。
kl散度/相對熵/kl距離
相對熵(relative entropy)又稱為KL散度(Kullback–Leibler divergence,簡稱KLD)、信息散度(information divergence)、信息增益(information gain)。
KL散度是兩個概率分布P和Q差別的非對稱性的度量(designed to measure the difference between probability distributions),KL散度是用來度量使用基于Q的編碼來編碼來自P的樣本平均所需的額外的位元數。 典型情況下,P表示數據的真實分布,Q表示數據的理論分布,模型分布,或P的近似分布。