1. 程式人生 > 其它 >python 多維向量相似度計算_推薦系統-協同過濾-相似度計算

python 多維向量相似度計算_推薦系統-協同過濾-相似度計算

技術標籤:python 多維向量相似度計算

餘弦相似度

餘弦相似度(Cosine Similarity):衡量了兩個使用者向量之間的向量夾角大小;夾角越小,證明餘弦相似度越大,兩個使用者也就越相似。

d36fd437598e594c00a6e0be92a893e2.png

這裡的A,B指的就是使用者的向量;

舉例:

6b12c2ca067a8d4988aecb627dd5a43b.png

如圖:是四個使用者對於四個物品的購買記錄;

我們計算User_A跟User_B的相似度約等於0.408;

Python Demo:

import numpy as np

def cosine_similarity(x, y):
    """ 計算兩個向量x和y的餘弦相似度 """
    assert len(x) == len(y), "len(x) != len(y)"
    zero_list = [0] * len(x)
    if x == zero_list or y == zero_list:
        return float(1) if x == y else float(0)

    res = np.array([[x[i] * y[i], x[i] * x[i], y[i] * y[i]] for i in range(len(x))])
    cos = sum(res[:, 0]) / (np.sqrt(sum(res[:, 1])) * np.sqrt(sum(res[:, 2])))
    
    return cos

User_A = [1, 1, 0, 1]
User_B = [1, 0, 1, 0]
print('User_A與User_B的餘弦相似度為: ', cosine_similarity(User_A, User_B))

皮爾遜相關係數

相比餘弦相似度,皮爾遜相關係數通過使用使用者平均分對各獨立評分進行修正,減小了評分偏置的影響。(評分偏置:例如兩個使用者,愛好一致,但是甲對所有物品的評分偏低,而乙對所有物品的評分偏高)

公式

48c5afd77580dcdf3905481f08fc53b5.png

舉例:

6dbd2a4afdfcc6e03bac48317ec1fbc2.png

如圖:為四個使用者對四個商品的歷史評分;

根據公式計算User_A跟User_B的相似度約等於0.8868;

Python Demo:

import numpy as np

User_A = [0, 3, 3, 5]
User_B = [1, 2, 2, 5]

A_mean = User_A - np.mean(User_A)
B_mean = User_B - np.mean(User_B)

print('User_A與User_B的皮爾遜相關係數為: ', np.dot(A_mean, B_mean)/(np.linalg.norm(A_mean)*np.linalg.norm(B_mean)))

# 方法二:
# np.corrcoef(np.vstack([User_A, User_B]))[0][1]