Python之協同過濾(尋找相近的使用者)

2021-07-26 03:37:27 字數 2766 閱讀 4885

資料內容是人們對不同電影的評價:我們通過計算人與人之間評價電影的相關度來找到口味相同的人,根據口味相同的人來推薦可能喜歡的電影。

資料如下:

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的縮寫,意為加權正則化交替最小二乘法。該方法常用於基於矩陣分解的推薦系統中。例如 將使用者...