協(xié)同過濾——曼哈頓距離、歐式距離、皮爾遜相關(guān)系數(shù)
假設(shè)你要在亞馬遜上買書,系統(tǒng)要給你推薦一些書,利用協(xié)同過濾的話,原理是找出與你愛好相近的用戶的購書清單,把他買了而你還沒買的書推薦給你。
1. 如何尋找相似用戶
假設(shè)用戶可以對(duì)書采取5星評(píng)級(jí)方式表達(dá)自己的喜好,0 表示很差,5 表示很好。如下圖:
要找到與你喜好相近的用戶,可以通過計(jì)算你與每個(gè)用戶之間的打分的距離判斷。距離越近,意味著喜好越相近。

2. 曼哈頓距離


Python實(shí)現(xiàn):
def manhattan(rating1, rating2):
distance = 0
for key in rating1:
if key in rating2:
distance += abs(rating1[key] - rating2[key])
return distance
## rating1, rating2 結(jié)構(gòu)如下:
rating1: {"Blues Traveler": 3.5, "Broken Bells": 2.0,
"Norah Jones": 4.5, "Phoenix": 5.0,
"The Strokes": 2.5, "Vampire Weekend": 2.0}
rating2 : {"Blues Traveler": 2.0, "Broken Bells": 3.5,
"Slightly Stoopid": 3.5, "Vampire Weekend": 3.0}
## users 結(jié)構(gòu),可能會(huì)多次用到
users = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0,
"Norah Jones": 4.5, "Phoenix": 5.0,
"Slightly Stoopid": 1.5,
"The Strokes": 2.5, "Vampire Weekend": 2.0},
"Bill": {"Blues Traveler": 2.0, "Broken Bells": 3.5,
"Deadmau5": 4.0, "Phoenix": 2.0,
"Slightly Stoopid": 3.5, "Vampire Weekend": 3.0},
"Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0,
"Deadmau5": 1.0, "Norah Jones": 3.0,
"Phoenix": 5, "Slightly Stoopid": 1.0},
"Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0,
"Deadmau5": 4.5, "Phoenix": 3.0,
"Slightly Stoopid": 4.5, "The Strokes": 4.0,
"Vampire Weekend": 2.0},
"Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0,
"Norah Jones": 4.0, "The Strokes": 4.0,
"Vampire Weekend": 1.0},
"Jordyn": {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0,
"Phoenix": 5.0, "Slightly Stoopid": 4.5,
"The Strokes": 4.0, "Vampire Weekend": 4.0},


3. 畢達(dá)哥拉斯定理(勾股定理)


3.1 計(jì)算明式距離

3.2 找出最近鄰
3.3 根據(jù)最近鄰的喜好進(jìn)行推薦
4. 皮爾遜相關(guān)系數(shù)
因?yàn)橛脩舻脑u(píng)分標(biāo)準(zhǔn)不一致,在A眼里,5分代表好,3分代表差,可能B的標(biāo)準(zhǔn)是3分代表好,0分代表差。皮爾遜相關(guān)系數(shù)就是平衡“分?jǐn)?shù)貶值”這一問題。


假如有一組數(shù)據(jù):

X 代表 Clara 這一列的五個(gè)數(shù)字, Y 代表 Robert 這一列的數(shù)字。
代入公式計(jì)算即得到皮爾遜相關(guān)系數(shù)。

得出的皮爾遜相關(guān)系數(shù)值在0-1之間,越接近1,表示相似度越高。
5. 余弦相似度
亞馬遜上有成千上萬本書,找到與你喜好相同的用戶,你們共同的評(píng)分項(xiàng)可能很少,有大量的項(xiàng)是空白,數(shù)據(jù)稀疏。如果把所有數(shù)據(jù)拿來計(jì)算,因?yàn)榇罅?值會(huì)影響最后的計(jì)算結(jié)果,可能會(huì)導(dǎo)致本來有很多共同評(píng)分項(xiàng)的用戶,由于0值過多,分擔(dān)計(jì)算結(jié)果,反而不是你的最近鄰。余弦相似度會(huì)忽略0-0匹配:

||x|| 表示向量x 的長度,點(diǎn)乘表示內(nèi)積。
余弦相似度取值范圍1到-1,其中1表示完全相似,-1 表示完全不相似。
6. 總結(jié)
無論利用哪種公式,計(jì)算出的首先都是最近鄰,然后根據(jù)最近鄰的書單進(jìn)行推薦。