這個是實驗周拓展的任務。做的是基於使用者的協同過濾演算法,參考的是《集體智慧型程式設計》第一章的內容,選取的資料是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曲目中,肯定有一部分 是你特別喜愛的,那麼該如何找到它們呢?專家點評推薦 影評家 通過商品本身尋找 我喜歡披頭四的一張 所以會認為他們的另一張 也不錯 資料探勘不僅僅是用來推薦商品,或是單單給商人增加銷量,同時也能擴充套...