大資料學習筆記(一) 提供推薦

2021-07-25 07:33:09 字數 4626 閱讀 4998

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...