基於使用者的協調推薦演算法

2021-08-30 17:55:00 字數 3141 閱讀 2229

這個是實驗周拓展的任務。做的是基於使用者的協同過濾演算法,參考的是《集體智慧型程式設計》第一章的內容,選取的資料是moives的100k的資料。

詳細可以見實驗周的實驗報告。

# -*- coding: utf-8 -*-

import codecs

from math import sqrt

# 皮爾遜相關度評價

defsim_pearson

(prefs, p1, p2)

: si =

for item in prefs[p1]

:if item in prefs[p2]

: si[item]=1

n =len(si)

# 兩者沒有共同之處,則返回1if0

== n:

return

1# 對所有的偏好求和

sum1 =

sum(

[prefs[p1]

[it]

for it in si]

) sum2 =

sum(

[prefs[p2]

[it]

for it in si]

)# 求平方和

sum1sq =

sum(

[pow

(prefs[p1]

[it],2

)for it in si]

) sum2sq =

sum(

[pow

(prefs[p2]

[it],2

)for it in si]

)# 求乘積之和

psum =

sum(

[prefs[p1]

[it]

* prefs[p2]

[it]

for it in si]

)# 計算皮爾遜評價值

num = psum -

(sum1 * sum2 / n)

den = sqrt(

(sum1sq -

pow(sum1,2)

/ n)

*(sum2sq -

pow(sum2,2)

/ n))if

0== den:

return

0 r = num / den

return r

# 獲取相似度評價表

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[

:n]# 進行推薦

defgetrecommendations

(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]

+= sim

rankings =

[(total / simsums[item]

, item)

for item, total in totals.items()]

rankings.sort(

) rankings.reverse(

)return rankings

# 讀取所有的資料

defloadmovielens

(path=

'c:\ml-100k'):

movies =

for line in codecs.

open

(path +

'/u.item'

,'r'

,encoding=

'iso-8859-15'):

(id, title)

= line.split(

'|')[0

:2] movies[id]

= title

prefs =

first =

true

for line in codecs.

open

(path +

'/u.data'

,'r'

,encoding=

'iso-8859-15'):

if first:

first =

false

continue

(user, movieid, rating, ts)

= line.split(

'\t'

) prefs.setdefault(user,

) prefs[user]

[movies[movieid]]=

float

(rating)

return prefs

prefs = loadmovielens(

)rankings = getrecommendations(prefs,

'1')

print

(rankings)

推薦演算法之基於使用者的協調過濾

基於使用者的的協調過濾演算法是推薦統統最古老的演算法,簡稱usercf。該演算法的誕生一定程度上標誌著推薦系統的誕生。本文將對usercf演算法原理進行講解,並且基於movielens資料集給出實現 供大家交流學習。找到和目標使用者興趣相似的使用者集合 找到這個集合中使用者喜歡的且目標使用者沒有聽說...

推薦系統 基於使用者的協調過濾

作為推薦系統 這一系列的第二篇文章,我們今天主要來聊一聊目前比較流行的一種推薦演算法 協調過濾 當然,這裡我們只講理論,並不會涉及到相關 或者相關框架的使用,在這一系列的後續文章,如果可能,我們可以將我們的所有理論知識整合一下,實踐乙個 推薦系統的 實戰。顧名思義,協同過濾就是指使用者可以齊心協力,...

推薦系統之基於使用者的協調過濾

在如何海量的資料時代,如何從海量的商品中選擇相關產品?在1100萬首itunes曲目中,肯定有一部分 是你特別喜愛的,那麼該如何找到它們呢?專家點評推薦 影評家 通過商品本身尋找 我喜歡披頭四的一張 所以會認為他們的另一張 也不錯 資料探勘不僅僅是用來推薦商品,或是單單給商人增加銷量,同時也能擴充套...