本文只是對協同過濾的一個簡單的知識總結,對該方面知識的學習,可參考《推薦系統實踐》、《集體智慧編程》。這裏並不給出原因,而只是一個該方面知識點的簡單應用。通過這些簡單的應用再反過來學習相關的知識點,應該能提升很大的興趣。
先談什麼是機器學習:
機器學習:將一組數據傳遞給算法,並由算法推斷出與這些數據的屬性相關的信息——藉助這些信息,算法就能夠預測出未來有可能會出現的其他數據。
因爲幾乎所有的非隨機數據中,都會包含這樣或那樣的“模式”,這些模式的存在使得機器得以據此進行歸納。爲了實現歸納,機器會利用它所認定的出現於數據中的重要特徵對數據進行“訓練”,並藉此得到一個模型。
什麼是推薦系統:
如在線購物中的商品推薦、熱門網站的推薦、以及幫助人們尋找音樂盒影片的應用。
什麼是協同過濾Collaborative Filtering
對一大羣人進行搜索,並從中找出與我們品位相近的一羣人。算法會對這些人所偏愛的內容進行考察,並將它們組合起來構造出一個經過排名的推薦列表。
基於協同過濾算法構建一個推薦系統的過程:(Python實現)
1.收集偏好——可以使用一個嵌套的字典
2.尋找相近的用戶
歐幾里得距離
皮爾遜相關度
3.爲評論者打分,並找到最接近的匹配結果
4.推薦物品
數據集:
一個可以用來做練習的數據集如下:
http://grouplens.org/datasets/movielens/
實例:
1.有如下數據集:描述的是一些用戶對一些電影的評價
#list of movies
critics={'Lisa Rose': {'Lady in 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': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,
'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 3.5},
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
'Superman Returns': 3.5, 'The Night Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
'The Night Listener': 4.5, 'Superman Returns': 4.0,
'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
'You, Me and Dupree': 2.0},
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}
2.尋找相近的用戶
這裏需要計算的是不同人之間品位的相似程度。常用算法有歐幾里德距離和皮爾遜相關度。(詳細內容參考相關書籍)
計算方法這裏不詳述。
算法1:歐幾里德距離
from math import sqrt
def sim_distance(prefs,person1,person2):
si = {}
for item in prefs[person1]:
if item in prefs[person2]: si[item]=1
if len(si)==0:
return 0
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return 1/(1+sqrt(sum_of_squares))
這裏對其加1並取倒數的原因是:避免遇到零整除的錯誤。
這樣總能得到一個介於0到1之間的小數,數越大,表示偏好越相近
算法2:皮爾遜相關度:
皮爾遜相關係數用來判斷兩組數據與某一直線的擬合程度。
通過這種算法,首先會找出兩位評論者都評價過的物品,然後計算兩者的評分總和與平方和,並求得評分的乘積和。從而計算出皮爾遜相關係數。
def sim_pearson(prefs,p1,p2):
si = {}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
n=len(si)
if n==0: 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 den==0: return 0
r=num/den
return r
該函數返回一個介於-1到1之間的數值,越大越相似。
3.爲評論者打分,得到相近的匹配結果
def topMatches(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]
上面對列表進行方向排序,使得相似度最高的排在前面。
4.推薦物品:
思想是:通過一個加權評價值(考慮到一些影片不同的質量,如收到越多的人評價的電影權重應該更高點)來爲影片打分。
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]+=sim
rankings=[(total/simSums[item],item) for item,total in totals.items()]
rankings.sort()
rankings.reverse()
return rankings
通過上面這些步驟,可以構建出一個基本的推薦系統。我們所要做的只是:構建涉及人員、物品和評價值的字典,然後藉此來爲用戶提供建議。
注:關於上面引用的代碼的具體解釋,可以參考 《集體智慧編程》一書。