python 多維向量相似度計算_推薦系統-協同過濾-相似度計算
阿新 • • 發佈:2020-12-26
技術標籤:python 多維向量相似度計算
餘弦相似度
餘弦相似度(Cosine Similarity):衡量了兩個使用者向量之間的向量夾角大小;夾角越小,證明餘弦相似度越大,兩個使用者也就越相似。
這裡的A,B指的就是使用者的向量;
舉例:
如圖:是四個使用者對於四個物品的購買記錄;
我們計算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))
皮爾遜相關係數
相比餘弦相似度,皮爾遜相關係數通過使用使用者平均分對各獨立評分進行修正,減小了評分偏置的影響。(評分偏置:例如兩個使用者,愛好一致,但是甲對所有物品的評分偏低,而乙對所有物品的評分偏高)
公式
舉例:
如圖:為四個使用者對四個商品的歷史評分;
根據公式計算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]