1. 程式人生 > >資料探勘python學習——《寫給程式設計師的資料探勘實踐指南》第3章

資料探勘python學習——《寫給程式設計師的資料探勘實踐指南》第3章

第3章  協同過濾——隱式評級及基於物品的過濾

對於一些5分割槽間,10分割槽間等的評分機智,使用者的評分方式可能傾向於極端化,集中在高分或是集中在低分,這樣參差不平的評分對於結果的準確性產生較大的影響。這一章考察對協同過濾的調優方法,目的是高效地產生更精準的預測結果。

討論了顯式評級和隱式評級:

顯示評級:使用者直接評級。

問題1:使用者大都具有惰性,不願意對物品評級;

問題2:使用者可能撒謊或者只給出部分資訊;

問題3:使用者不會更新其評級結果。

隱式評級:不需要使用者給出任何評級得分,而是觀察使用者的行為來獲得結果。

問題:可能由於多使用者共用賬號或是多目的行為使得預測不準確。

基於使用者的過濾(也叫基於記憶體的協同過濾——memory based collaborative filtering):

此前的考慮都是找尋最近的比配使用者,這種做法在有些情況下存在以下兩種問題:

1. 擴充套件性。現實生活中,使用者的數量級往往不止成百上千。一旦使用者的數量過於龐大,其擴充套件性存在一定問題;

2. 稀疏性。在大部分推薦系統中,使用者和商品都很多,但是使用者評級的平均商品數目卻很小,可能找不到最近鄰居。

我們在進行資料探勘的時候,需要針對不同的資料的意義和數量調整預測方案。

為解決以上問題,提出基於物品的過濾——Item-based Filtering(也叫基於模型的協同過濾——model based collaborative filtering)。與基於記憶體的方法相比,基於模型的方法擴充套件性更好。對於大型資料集,這種方法更快,需要的記憶體更少。

分數貶值(分數誇大)現象:分數很高,超過實際應得的分數。

為抵消這種狀況,從每個評級結果中減去平均的評級結果,以下為對餘弦相似度的調整。

做歸一化處理。求得使用者對所有物品評分的平均值,每次計算將該物品的評分減去平均值。餘弦相似度計算公式經過處理後如下:


依照上述公式實現函式如下:

from math import sqrt

def computeSimilarity (band1, band2, users):
    averages = {}
    for (key, ratings) in users.items():
        averages[key] = (float(sum(ratings.values())))/len(ratings.values())

    sum1 = 0
    sum2 = 0
    sum3 = 0

    for (user, ratings) in users.items():
        if band1 in ratings and band2 in ratings:
            avg = averages[user]
            sum1 += (ratings[band1] - avg) * (ratings[band2] - avg)
            sum2 += (ratings[band1] - avg) ** 2
            sum3 += (ratings[band2] - avg) ** 2

    sum23 = sqrt(sum2) * sqrt(sum3)
    if sum != 0:
        return sum1/sum23
    else:
        return 0

users = {"David": {"Imagine Dragons": 3, "Daft Punk": 5,
                    "Lorde": 4, "Fall Out Boy": 1},
          "Matt":  {"Imagine Dragons": 3, "Daft Punk": 4,
                    "Lorde": 4, "Fall Out Boy": 1},
          "Ben":   {"Kacey Musgraves": 4, "Imagine Dragons": 3,
                    "Lorde": 3, "Fall Out Boy": 1},
          "Chris": {"Kacey Musgraves": 4, "Imagine Dragons": 4,
                    "Daft Punk": 4, "Lorde": 3, "Fall Out Boy": 1},
          "Tori":  {"Kacey Musgraves": 5, "Imagine Dragons": 4,
                    "Daft Punk": 5, "Fall Out Boy": 3}}

print(computeSimilarity('Lorde', 'Kacey Musgraves', users))

輸出結果如下:


基於以上的內容,我們可以利用餘弦相似度的計算公式計算兩個物品間的相似度進行預測。

為了預測公式能夠以最佳的方式進行,需要將使用者的評分結果先轉換為-1到1之間的數值,計算得到結果之後再轉換為1到5的評級。

使用者評分結果歸一化公式如下:


復原公式如下:


預測公式如下:


【Slope One 演算法】

也是基於物品過濾的演算法。利用物品對的偏差進行預測。

主要優點:簡潔性,容易實現。

第一步:


第二步: