類似度度量和距離度量在整個機器學習領域都是很是基礎的概念,數據科學家 Gonzalo Ferreiro Volpi 近日經過淺顯易懂的推薦系統示例介紹了這些概念以及它們的計算方式。
在推薦系統中,咱們常常談到「類似度度量」這一律念。爲何?由於在推薦系統中,基於內容的過濾算法和協同過濾算法都使用了某種特定的類似度度量來肯定兩個用戶或商品的向量之間的相等程度。因此總的來講,類似度度量不只僅是向量之間的距離。git
從數學上看,餘弦類似度衡量的是投射到一個多維空間中的兩個向量之間的夾角的餘弦。當在多維空間中繪製餘弦類似度時,餘弦類似度體現的是每一個向量的方向關係(角度),而非幅度。若是你想要幅度,則應計算歐幾里德距離。github
以下例所示,來自 www.machinelearningplus.com
算法
按照定義,常規餘弦類似度反映了方向的差別,而不是位置的差別。所以,使用餘弦類似度指標沒法考慮到用戶評分這樣的差別。調整後餘弦類似度能夠緩解這一問題,具體作法是從每對共同評分的配對減去各自用戶的平均評分,其定義以下:bash
假設一位用戶爲兩部電影分別給出了 0~5 的評分。app
直觀而言,咱們能夠看到用戶 b 和 c 的品味相近,而 a 則頗爲不一樣。但常規的餘弦類似度卻給出了不同的結果。在這樣的案例中,計算調整後餘弦類似度能讓咱們更好地理解用戶之間的相近程度。機器學習
from scipy import spatialdef adjusted_cos_distance_matrix(size, matrix, row_column): distances = np.zeros((size,size)) if row_column == 0: M_u = matrix.mean(axis=1) m_sub = matrix - M_u[:,None] if row_column == 1: M_u = matrix.T.mean(axis=1) m_sub = matrix.T - M_u[:,None] for first in range(0,size): for sec in range(0,size): distance = spatial.distance.cosine(m_sub[first],m_sub[sec]) distances[first,sec] = distance return distances複製代碼
matrix:這就是用戶之間的評分或觀點等你衡量的東西或你的業務商品的原始矩陣。函數
row_columns:若是你衡量的是列之間的距離,則設爲 1;若是你衡量的是行之間的距離,則設爲 0;學習
size:所得矩陣的所需大小。也就是說,當尋找用戶或商品類似度時,這就是用戶或商品的數量。因此若是有 500 個不一樣用戶,則距離矩陣的大小就爲 500×500。ui
下面給出了一個參考示例:spa
user_similarity = adjusted_cos_distance_matrix(n_users,data_matrix,0)
item_similarity = adjusted_cos_distance_matrix(n_items,data_matrix,1)
最後,咱們簡要回顧一些可用在推薦系統中計算類似度的其它方法,但也可用於機器學習中其它任何基於距離的算法:
2. 皮爾森相關性或相關類似度:告訴了咱們兩個項之間的相關程度。相關性越高,則類似度越高。
3. 均方差:在於計算用戶評分之間的平均平方差。MSE 更側重於懲罰更大的錯誤。
而後:
用戶-用戶以及商品-商品類似度示例
咱們藉助以前介紹推薦系統的文章來簡要回顧一下協同過濾的工做方式:假設我喜歡《盲刺客》和《莫斯科紳士》這兩本書;個人朋友 Matias 也喜歡《盲刺客》和《莫斯科紳士》,但也還喜歡《Where the crawdads sing》。看起來我與 Matias 有同樣的興趣。因此你可能會想我也會喜歡《Where the crawdads sing》,即便我還沒讀過它。協同過濾也正是基於這一邏輯,只是你不只能夠比較用戶,也能夠比較商品。
咱們可視化地比較看看推薦系統的用戶-用戶類似度與商品-商品類似度之間的差別:
用戶-用戶類似度
商品-商品類似度
用戶-用戶類似度詳解
商品-商品類似度詳解
x1 和 x4 的類似度大於 x1 和 x5 的類似度。基於這些類似度值,若是有任何用戶搜索電影 x1,他們將被推薦 x4;反之亦然。
關於推薦系統的內容就到此爲止了。可是,請記住類似度度量和距離度量在整個機器學習領域都是很是基礎的概念,理解它們對進一步的學習相當重要。