這本書豆瓣上得分很高, 可以當作機器學習, 資料探勘在當前web應用的入門書,我也是乙個門外漢加初學者, 正在讀這本書
*****第二章****
1. 相似度, 偏好
首先看例子, 現在有乙個資料集(書中給出的),記錄每個人對不同電影的打分, 如下所示
第乙個資料的意思是: lisa rose這個人 對於 lady in the water的打分時2.5, 從這寫資料裡如何判定兩個人的喜好是否一致? 書中給出了兩種方法critics=,
'gene seymour': ,
'michael phillips': ,
'claudia puig': ,
'mick lasalle': ,
'jack matthews': ,
'toby': }
將資料集中每個人對電影的打分 看作是不同維度上的座標,那麼歐幾里得距離是兩個點間的距離: 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, 果斷換英文版來看, 不看翻譯的了。 第二點是威爾遜係數和威爾遜距離還是有一定差異的, 哪個好些?
我覺得稍微有點問題,就是資料量大的情況下, 我們可以先求出相近的幾個人, 然後再在縮小的集合裡求電影列表, 也就是說利用上書中的函式 topmatchs.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
未完待續。。。。。。
《集體智慧型程式設計》 讀書筆記
恢復內容開始 第二章 提供推薦cf 協同型過濾 允許人們根據自己對文件的感興趣程度新增標註,並利用這一資訊為他人進行文件過濾。蒐集偏好 在python中建立乙個巢狀的字典 尋找相近的使用者 計算不同使用者間的相似度評價值 方法1 歐幾里得距離評價 以經過人們一致評價的物品作為座標軸,然後將參與評價的...
集體智慧型程式設計第7章 讀書筆記
最近在讀 集體智慧型程式設計 這本書,作了一些筆記,好讓自己印象深刻點,不過沒有記錄太多的細節和 第7章主要涉及決策樹分類器。相比於貝葉斯分類器 神經網路分類,決策樹分類器的好處在於模型具有易於理 解的特點,可以將結果轉換成一系列簡單的if else語句。乙個二維表中,行表示使用者,列表示使用者的屬...
《集體智慧型程式設計》讀書筆記 1 聚類簡介
1 聚類演算法的目的是採集資料,然後從中找出不同的群組。2 universal feed parser 3 皮爾遜相關度其實判斷的是兩組資料與某條直線的擬合程度,當兩者完全匹配時,計算結果為1.0,當兩者毫無關係時,計算結果為0.0.4 分級聚類 分級聚類的結果會產生一棵樹 分級聚類雖然會返回一棵形...