1.獲取資料:
這兒有乙個開源的資料集grouplens
以及集體智慧型程式設計上的資料集。以下是集體智慧型程式設計上的乙個關於電影評價的資料集
critices=,
'gene seymour':,
'michael phillips':,
'claudia puig':,
'mick lasalle':,
'jack matthews':,
'toby':,
}
2.尋找相似度的演算法:
①.歐幾里得距離評價
#歐幾里得距離
#prefs->資料集
#person1,person2->兩個不同的使用者,
defsim_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))
②.皮爾遜相似度演算法:
def sim_person(prefs,p1,p2):
si={}
foritem
in prefs[p1]:
ifitem
in prefs[p2]:
si[item]=1
n=len(si)
if n==0 :
return
1#求所有偏好和
sum1=sum([prefs[p1][it] for
itin si])
sum2=sum([prefs[p2][it] for
itin si])
#求平方和
sum1sq=sum([pow(prefs[p1][it],2) for
itin si])
sum2sq = sum([pow(prefs[p2][it], 2) for
itin si])
#求乘積之和
psum=sum([prefs[p1][it]*prefs[p2][it] for
itin 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
③.tanimoto相關度評價值
def
sim_tanimoto
(prefs,person1,person2):
sim_and=
for item in prefs[person1]:
if item in prefs[person2]:
return (len(sim_and)*1.0/(len(prefs[person1])+len(prefs[person2])-len(sim_and)))
關於這三個演算法的分析:
tanimoto只針對於結果是二值(0,1)的相關評價,如對電影評價只有覺得好看和不好看兩種,這樣的情況可以用tanimoto演算法。
對於歐幾里得距離演算法和皮爾遜演算法,在對於資料集不是很規範的時候,(如影評者的評價相對於平均水平偏離大的時候)使用皮爾遜演算法會得到更好的結果。
3.以上演算法都是針對兩個人的相關度演算法,可以使用求出與某一使用者相似度相近的前幾個使用者的函式:
#返回與person的最佳匹配者集合
#prefs->資料集,person->某一使用者,n->求出前n個相似使用者,similarity->通過哪種求相似度的演算法
deftopmatches
(prefs,person,n=5,similarity=sim_person):
scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person]
scores.sort()
scores.reverse()
return scores[0:n]
#利用所有他人的評價值得加權平均,為某人提供建議(具體不理解演算法的,參考集體智慧型程式設計)
defgeetrecommendations
(prefs,person,similarity=sim_person):
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]+=sim*prefs[other][item]
simsums.setdefault(item,0)
simsums[item]+=sim
#建立乙個歸一化的列表
ranking=[(total/simsums[item],item) for item,total in totals.items()]
ranking.sort()
ranking.reverse()
return ranking
5.物品之間的相似:
與人與人之間相似類似,這兒只需要將資料集中的人和物品轉換一下位置即可。
#轉換人和物
deftransformprefs
(prefs):
result={}
for person in prefs:
for item in prefs[person]:
result.setdefault(item,{})
result[item][person]=prefs[person][item]
return result
轉換之後類似這樣的
'lady in the water':
6.以上的演算法都是基於使用者的協作型過濾,接下來就是基於物品的協作型過濾,對於稀疏資料集基於物品的方法優於基於使用者,對於密集資料集,兩者效果一樣。
#生成與每個物品相似度的資料集
defcalculatesimlaritems
(prefs,n=10):
result={}
itemprefs=transformprefs(prefs)
c=0for item in itemprefs:
c+=1
if c%100==0:
print
'%d / %d '%(c,len(itemprefs))
score=topmatches(itemprefs,item,n=n,similarity=sim_distance)
result[item]=score
return result
#通過物品對某個人獲取推薦
#因為預先處理了物品相似度,所以這兒的推薦過程效率很快,預先處理的過程可以在空閒的時候做。
#這兒的itemmatch是每個物品相似度的資料集,user是推薦使用者
defgetrecommendeditems
(prefs,itemmatch,user):
userratings=prefs[user]
scores={}
totalsim={}
for (item,rating) in userratings.items():
for (similarity,item2) in itemmatch[item]:
if item2 in userratings:
continue
scores.setdefault(item2,0)
scores[item2]+=rating*similarity
totalsim.setdefault(item2,0)
totalsim[item2]+=similarity
rankings=[(score/totalsim[item],item) for item,score in scores.items()]
rankings.sort()
rankings.reverse()
return rankings
大資料學習筆記
大資料處理是雲計算中非常重要的領域,自google公司提出mapreduce分布式處理框架以來,以hadoop為代表的開源軟體受到越來越多公司的重視和青睞。本文將講述hadoop系統中的乙個新成員 impala。impala架構分析 impala是cloudera公司主導開發的新型查詢系統,它提供s...
大資料筆記(一)
現在的社會發展相當迅速,科技發達,資訊流通,使得人們之間的交流越來越密切,生活也越來越方便,在智慧型手機 智慧型穿戴裝置基本普及的高科技時代的背景下,大資料應運而生。未來的時代將不再是it時代,而是dt data technology 時代。各個行業和領域都已經被資料滲透了,資料已然成為非常重要的生...
大資料學習筆記 1 1 了解大資料
三 bigtable 大表 nosql資料庫 hbase 首先引入兩個個大資料應用場景 從以上兩個例子可以引出大資料的兩個核心問題 資料的儲存 分布式的檔案系統 hdfs hadoop distributed file system 資料的計算 資料的計算 不是演算法 分布式的計算 mapreduc...