mysql資料相似度演算法 相似度計算方法

2021-10-17 23:42:18 字數 2909 閱讀 4886

相似度就是比較兩個事物的相似性。一般通過計算事物的特徵之間的距離,如果距離小,那麼相似度大;如果距離大,那麼相似度小。

問題定義:有兩個物件x,y,都包含n維特徵,x=(x1,x2,x3,...,xn),y=(y1,y2,y3,...,yn),計算x和y的相似性。

閔可夫斯基距離(minkowski distance)#

曼哈頓距離(manhattan distance)#

p=1時,閔可夫斯基距離就是曼哈頓距離。

又稱城市街區距離,在方正的北京大街打車,行車距離就是曼哈頓距離,如果在山城重慶就不是了。

歐氏距離(euclidean distance)#

p=2時,閔可夫斯基距離就是歐氏距離。

在平面幾何或者立體幾何中的距離,通常就是歐氏距離,所以歐氏距離也最容易理解。

copy

np.sqrt(np.sum(np.square(x-y)))

切比雪夫距離(chebyshev distance)#

p等於無窮大時,閔可夫斯基距離就是切比雪夫距離。

copy

def twoqbxfdis(a,b):

return max( abs(a[0]-b[0]), abs(a[1]-b[1]))

若將西洋棋棋盤放在二維直角座標系中,格仔的邊長定義為1,座標的x軸及y軸和棋盤方格平行,原點恰落在某一格的中心點,則王從乙個位置走到其他位置需要的最少步數恰為二個位置的切比雪夫距離,因此切比雪夫距離也稱為棋盤距離

"加權(weighted)"閔可夫斯基距離#

當樣本中不同屬性的重要性不同時,可使用"加權距離"(weighted distance)

余弦相似度(cosine similarity)#

copy

np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))

余弦相似性取值[-1,1],值越趨於1,表示兩個向量的相似度越高。余弦相似度與向量的幅值無關,只與向量的方向相關,在文件相似度(tf-idf)和相似性(histogram)計算上都有它的身影。

二維平面上兩向量a(x1,y1),b(x2,y2)之間的夾角余弦公式:

也可直接通過向量運算:

n維空間上兩點a(x1,x2……..xn),b(y1,y2……..yn)的夾角余弦公式:

皮爾遜相關係數(pearson correlation)#

余弦相似度會受到向量的平移影響,怎樣才能實現平移不變性?在余弦相似度的基礎上,每個向量減去這個向量均值組成的向量,也就是皮爾遜相關係數,有時候也直接叫相關係數。

copy

x_=x-np.mean(x)

y_=y-np.mean(y)

d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_))

當兩個向量均值都為0時,皮爾遜相對係數等於余弦相似性。

馬氏距離(mahalanobis distance)#

乙個向量的不同維度如果是不同的量綱,更有甚者,維度之間是相關的,比如身高和體重組成的向量,在閔可夫斯基距離中等同對待,有時,這樣是不恰當的。馬氏距離利用 cholesky transformation 消除了不同維度之間的相關性和尺度不同。

其中,s為樣本的協方差矩陣。當s是單位陣的時候,馬氏距離就是歐式距離;當s是對角陣的時候,馬氏距離是加權歐式距離。

很多時候,乙個事物的有點也可能會構成它的缺點。這裡馬氏距離可以消除不同維度之間的不同尺度,就可能放大了變化細微維度的作用。

我們可以按照連續性將屬性分為「連續屬性」和「離散屬性」;也可以按照有序性將屬性分為「有序屬性」和「無序屬性」[1]。上面的相似性度量都是關於「連續」並「有序」屬性的,下面給出幾個關於「離散屬性」和「無序屬性」的相似性度量。

漢明距離(hamming distance)#

兩個等長字串s1與s2之間的漢明距離定義為將其中乙個變為另外乙個所需要作的最小替換次數。

例如:字串「11110011」與「10010010」之間的漢明距離為3。

漢明距離可以在通訊中累計定長二進位製字中發生翻轉的錯誤資料位,所以它也被稱為訊號距離。漢明重量分析在包括資訊理論、編碼理論、密碼學等領域都有應用。

如果要比較兩個不同長度的字串,不僅要進行替換,而且要進行插入與刪除的運算,在這種場合下,通常使用更加複雜的編輯距離等演算法。

傑卡德相似係數(jaccard similarity)

傑卡德相似係數是衡量兩個集合的相似度一種指標。

copy

up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())

down=np.double(np.bitwise_or(x != 0, y != 0).sum())

d1=(up/down)

傑卡德相似係數是從相似性度量的角度來表述的,從距離度量的角度,則有傑卡德距離(jaccard distance)。

傑卡德相似係數和傑卡德距離本質上是一樣的,只是表述角度不同。

在聚類中,傑卡德相似係數可以作為聚類的效能度量。在推薦系統中,傑卡德相似係數可以度量兩個購買若干商品的使用者之間的相似性。

kl散度(kullback-leibler divergence)#

又叫相對熵,表示兩個隨機分布之間的相似性。

可以證明,kl散度大於等於0,當p=q時等於0;kl散度不滿足對稱性。

hellinger距離(hellinger distance)#

hellinger距離是與kl散度類似的距離,表示隨機分布之間的相似性。

當α=0時

這時,hellinger距離就是兩個隨機分布取平方根之後的歐式距離,符合距離度量的四個性質,是嚴格的距離度量。

總結#如果資料存在「分數膨脹「問題,就使用皮爾遜相關係數

如果資料比較密集,變數之間基本都存在共有值,且這些距離資料都是非常重要的,那就使用歐幾里得或者曼哈頓距離

如果資料是稀疏的,就使用余弦相似度

相似度演算法之余弦相似度

余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖 如上圖二 可以認...

mysql文章相似度計算 文章相似度計算

文章內容相似度計算幾種方式及優缺點 php 內建方法 similar text similar text 是php內建的字串相似度對比函式,是使用方式最便捷的一種,但是因為它的時間複雜度是 o n 3 處理時間會隨著內容長度增加,若比較5000字以上的文章,或者比較文章的量級比較大不建議使用,只是單...

jaccard相似度演算法

jaccard index,又稱為jaccard相似係數 jaccard similarity coefficient 用於比較有限樣本集之間的相似性與差異性。jaccard系數值越大,樣本相似度越高。兩個集合a和b交集元素的個數在a b並集中所佔的比例,稱為這兩個集合的傑卡德係數,用符號 j a,...