基於協同過濾構建簡單推薦系統

本文只是對協同過濾的一個簡單的知識總結,對該方面知識的學習,可參考《推薦系統實踐》、《集體智慧編程》。這裏並不給出原因,而只是一個該方面知識點的簡單應用。通過這些簡單的應用再反過來學習相關的知識點,應該能提升很大的興趣。


先談什麼是機器學習:

機器學習:將一組數據傳遞給算法,並由算法推斷出與這些數據的屬性相關的信息——藉助這些信息,算法就能夠預測出未來有可能會出現的其他數據。
因爲幾乎所有的非隨機數據中,都會包含這樣或那樣的“模式”,這些模式的存在使得機器得以據此進行歸納。爲了實現歸納,機器會利用它所認定的出現於數據中的重要特徵對數據進行“訓練”,並藉此得到一個模型。


什麼是推薦系統:

如在線購物中的商品推薦、熱門網站的推薦、以及幫助人們尋找音樂盒影片的應用。


什麼是協同過濾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


通過上面這些步驟,可以構建出一個基本的推薦系統。我們所要做的只是:構建涉及人員、物品和評價值的字典,然後藉此來爲用戶提供建議。


注:關於上面引用的代碼的具體解釋,可以參考 《集體智慧編程》一書。
發佈了141 篇原創文章 · 獲贊 36 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章