這本書豆瓣上得分很高, 可以當作機器學習, 資料探勘在當前web應用的入門書,我也是乙個門外漢加初學者, 正在讀這本書
*****第二章****
1. 相似度, 偏好
首先看例子, 現在有乙個資料集(書中給出的),記錄每個人對不同電影的打分, 如下所示
critics=,
'gene seymour': ,
'michael phillips': ,
'claudia puig': ,
'mick lasalle': ,
'jack matthews': ,
'toby': }
第乙個資料的意思是: lisa rose這個人 對於 lady in the water的打分時2.5, 從這寫資料裡如何判定兩個人的喜好是否一致? 書中給出了兩種方法
將資料集中每個人對電影的打分 看作是不同維度上的座標,那麼歐幾里得距離是兩個點間的距離: a(x1, y1), b(x2, y2) 距離為:
兩點距離越近,該值越小。 上面是二維的, 多維的也一樣,比如座標a (a1, a2, ...., an)和 b (b1,b2,...bn)距離 如下:
好 有了這些為基礎, 第乙個我們就可以寫出給定資料集上, 給定的兩個人之間的歐幾里得距離是多少的函式
def sim_distance(prefs, person1, person2):
# get shared_item list
si = {}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] = 1
# if no shared return 0
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))
維基百科解釋
網上解釋
我覺得了解上面內容就可以了, 我也沒有深入研究他為什麼有效, 只知道確實有效,他的推倒公式:
根據這個公式那我們就方便寫**了,也是書中給出的**:
還是先求共同的維度:
si = {}
for item in prefs[p1]:
if item in prefs[p2]:
si[item] = 1
再來求
summul = sum(prefs[p1][item] * prefs[p2][item] for item in si)
整個**列出:
def sim_pearson(prefs, p1, p2):
#get shared item list
si = {}
for item in prefs[p1]:
if item in prefs[p2]:
si[item] = 1
n = len(si)
if n == 0:
return 1
# get sum of points
sum1 = sum([prefs[p1][item] for item in si])
sum2 = sum ([prefs[p2][item] for item in si])
# get pow sum of points
sum1pow = sum([pow(prefs[p1][item], 2) for item in si])
sum2pow = sum([pow(prefs[p2][item], 2) for item in si])
#get sum of multi
summul = sum(prefs[p1][item] * prefs[p2][item] for item in si)
#compute pearson value
num = summul - (sum1 * sum2/n)
den = sqrt((sum1pow - pow(sum1, 2)/n) * (sum2pow - pow(sum2, 2)/n))
if den == 0:
return 0
r = num/den
return r
結合上面的公式能好理解
這裡我有兩個困惑的地方: 為什麼si為空的時候, 返回的係數是1, 後經檢視英文版發現應該是0, 果斷換英文版來看, 不看翻譯的了。 第二點是威爾遜係數和威爾遜距離還是有一定差異的, 哪個好些?
def getrecommendations(prefs, person, sim_func=sim_pearson):
totals={}
simsums={}
for other in prefs:
if other == person:
continue
sim = sim_func(prefs,person, other)
if sim < 0:
continue
for item in prefs[other]:
if item not in prefs[person]:
totals.setdefault(item, 0)
totals[item] += prefs[other][item] * sim
simsums.setdefault(item, 0)
simsums[item] += sim
ranking = [(total/simsums[item], item) for item,total in totals.items()]
ranking.sort()
ranking.reverse()
return ranking
我覺得稍微有點問題,就是資料量大的情況下, 我們可以先求出相近的幾個人, 然後再在縮小的集合裡求電影列表, 也就是說利用上書中的函式 topmatchs.
未完待續。。。。。。
《集體智慧型程式設計》 讀書筆記
恢復內容開始 第二章 提供推薦cf 協同型過濾 允許人們根據自己對文件的感興趣程度新增標註,並利用這一資訊為他人進行文件過濾。蒐集偏好 在python中建立乙個巢狀的字典 尋找相近的使用者 計算不同使用者間的相似度評價值 方法1 歐幾里得距離評價 以經過人們一致評價的物品作為座標軸,然後將參與評價的...
集體智慧型程式設計第7章 讀書筆記
最近在讀 集體智慧型程式設計 這本書,作了一些筆記,好讓自己印象深刻點,不過沒有記錄太多的細節和 第7章主要涉及決策樹分類器。相比於貝葉斯分類器 神經網路分類,決策樹分類器的好處在於模型具有易於理 解的特點,可以將結果轉換成一系列簡單的if else語句。乙個二維表中,行表示使用者,列表示使用者的屬...
《集體智慧型程式設計》讀書筆記 1 聚類簡介
1 聚類演算法的目的是採集資料,然後從中找出不同的群組。2 universal feed parser 3 皮爾遜相關度其實判斷的是兩組資料與某條直線的擬合程度,當兩者完全匹配時,計算結果為1.0,當兩者毫無關係時,計算結果為0.0.4 分級聚類 分級聚類的結果會產生一棵樹 分級聚類雖然會返回一棵形...