資料內容是人們對不同電影的評價:我們通過計算人與人之間評價電影的相關度來找到口味相同的人,根據口味相同的人來推薦可能喜歡的電影。
資料如下:
the water':2.5,'snakes on
a plane':3.5,'just my luck':3.0,'superman returns':3.5,
'you ,me
and dupree':2.5,'the night listener':3.0},
'gene seymour':,
'michael phillips':,
'claudia puig':,
'mick lasalle':,
'jack mattews':,
'toby':}
兩種計算距離的方法:
from math import sqrt
def sim_distnace(prefs,persion1,persion2):
si={}
foritem
in prefs[persion1]:
ifitem
in prefs[persion2]:
si[item]=1
iflen(si)==0:return
0 sum_of_squares=sum([pow(prefs[persion1][item]-prefs[persion2][item],2)
foritem
in prefs[persion1] if
item
in prefs[persion2]])
return
1/(1+sqrt(sum_of_squares))
def sim_pearson(prefs,p1,p2):
si={}
foritem
in prefs[p1]:
ifitem
in prefs[p2]:
si[item]=1
n=len(si)
if n==0 : return
1 sum1=sum([prefs[p1][it] for
itin si])
sum2=sum([prefs[p2][it] for
itin si])
sum1sq=sum([pow(prefs[p1][it],2) for
itin si])
sum2sq=sum([pow(prefs[p2][it],2) for
itin si])
psum=sum([prefs[p1][it]*prefs[p2][it] for
itin si])
num=psum-(sum1*sum2/n)
den=sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))
if den==0:return
0 r=num/den
return r
測試**:
from recommendations import critics
from distance import sim_pearson
from skimage.transform._geometric import similaritytransform
deftopmatches
(prefs,person,n=5,similarity=sim_pearson):
scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person]
scores.sort();
scores.reverse();
return scores[0:n]
print(topmatches(critics,'toby',n=3))
實驗結果:
[(0.9912407071619299, 'lisa rose'), (0.9244734516419049, 'mick lasalle'), (0.8934051474415647, 'claudia puig')]
def
getrecommendations
(prefs,person,similarity=sim_pearson):
totals={}
simsums={}
for other in prefs:
if other == person:continue
sim=similarity(prefs,person,other)
if sim<0:continue
for item in prefs[other]:
if item not
in prefs[person] or prefs[person][item]==0:
totals.setdefault(item,0)
totals[item]+=prefs[other][item]*sim
simsums.setdefault(item,0)
simsums[item]+=similarity
rankings=[(total/simsums[item],item) for item,total in totals.items()]
rankings.sort()
rankings.reverse()
return rankings
協同過濾 基於使用者的協同過濾itemCF
基於使用者的協同過濾演算法也被稱為最近鄰協同過濾或knn k nearest neighbor,k最近鄰演算法 其核心思想就是,首先根據相似度計算出目標使用者的鄰居集合,然後用鄰居使用者評分的加權組合來為目標使用者作推薦。通常這些演算法都可以總結成三步 首先,使用使用者已有的評分來計算使用者之間的相...
協同過濾之Slope One演算法
純筆記,直接從維基百科上翻譯過來的 slope one演算法是基於評分的item based演算法中最簡單的一種了,它的思想非常簡單,但在很多場合卻有很好的效果。但是slope one只適用於有評分的情況,對於二值評分,如商品的有無購買,這種演算法是不適用的。通常的item based演算法是基於使...
協同過濾之ALS WR演算法
als是alternating least squares的縮寫 意為交替最小二乘法 而als wr是alternating least squares with weighted regularization的縮寫,意為加權正則化交替最小二乘法。該方法常用於基於矩陣分解的推薦系統中。例如 將使用者...