CH02 提供推薦

2021-07-10 04:51:10 字數 3648 閱讀 1154

目標輸出:我想得到乙個長串,裡面既有與這個人評分較高(即相似度較高)的人的名字,也有他的得分,應該用python裡的什麼結構?

q:乙個列表也好,乙個字典也好,不定義可以直接用嗎?

a:不可以。乙個字元在不定義的時候可以直接用(for item in ...)並沒有定義item,直接拿來用就好 item可以是數字,可以是名稱字元,方便直接

但是,在用列表和字典的時候,一定要先定義乙個 比如 score=【】 或者score={}

q:如果用乙個列表list ,我想新增元素 怎麼加?

q:如果用乙個字典dict{},我想新增元素,怎麼辦?

a:先寫乙個空的字典score={},然後直接寫鍵和鍵值就可以,新增key的時候記得用中括號,score【'liza rose'】=3.95 即可,它會自動給你乙個乙個新增(對麼)。但是,當輸出list的時候,一般情況下只能輸出value,如果想把key和value同時輸出,需要把它們變成乙個元組tuple,然後輸出(沒試,待檢驗)

1.我是乙個人,o是另外乙個人

這個人和我很像,我們都給電影a打高分,都給電影b打低分。

這個人還看過【我沒看過的】cdef電影,那麼,我根據這個人的口味 給我推薦電影cdef

2.我是乙個電影,△是另外乙個電影

我們兩部電影很像,有許多人,給我打高分的同時都給△打高分。

那麼,看過△的(沒看過本電影)的人有xyz,我根據電影的相似度,給xyz推薦本電影。

給乙個人推薦1w個電影,和把乙個商品推薦給1w個人,哪個更有商業意義?顯然是第二個。也就是第二個方法。

#coding=utf-8

from math import sqrt

# 定義distance,輸入兩個人 算出他們「共有」的某幾項之間的距離

def sim_distance(prefs,person1,person2):

si={}

a=0for item in prefs[person1]:

if item in prefs[person2]:

si[item]=1

if len(si)==0:

print'no simulation'

for item in prefs[person1]:

if item in prefs[person2]:

a =a + pow(prefs[person1][item]-prefs[person2][item],2)

print 1/(1+sqrt(a))

# 定義pearson相關係數的求法 輸入兩個人 算出他們倆「共有」的某幾項的相關係數

# 輸入:資料集,第乙個人(list型,電影名,打分),第二個人

def sim_pearson(prefs,person1,person2):

si = {}

for item in prefs[person1]:

if item in prefs[person2]:

si[item] =1

l=len(si)

sum1 = sum([prefs[person1][item] for item in si]) # 求xi求和

sum2 = sum([prefs[person2][item] for item in si])

sum1sq = sum([pow(prefs[person1][item],2) for item in si]) # 求xi平方的和

sum2sq = sum([pow(prefs[person2][item],2) for item in si])

psum = sum([prefs[person1][item]*prefs[person2][item] for item in si]) #求xiyi乘積的和

a = psum - (sum1*sum2/l) #這三行是pearson相關係數的公式

b = sqrt((sum1sq-pow(sum1,2)/l)*(sum2sq-pow(sum2,2)/l))

r = a/b

return r

def topmatches(prefs,person):

scores = #我覺得這裡變成乙個字典會更好。待嘗試

for other in prefs:

if other!=person: #除了我要比較之外的所有人,都計算一下pearson

scores.sort() #不太理解,scores是按啥排的啊?我的scores是乙個二維的列表啊,按哪個維度排的

scores.reverse()

return scores[0:5]

#輸出:乙個評分list:rankings,裡面有電影名和電影的綜合評分()

def getrecommendations(prefs,person):

totals={} #需要建立乙個

simsums={}

for other in prefs: #第一步,在資料集的人裡面找其他人

if other != person: #找到之後,找其他人裡有a沒看過的電影

for item in prefs[other]:

if item not in prefs[person] or prefs[person][item]==0: #這地方很重要!找a沒看過的電影,我最開始的想法是c語言一樣寫乙個迴圈查詢,殊不知python的好處就是可以直接查詢

totals.setdefault(item,0) #找到了這部電影,先加入total裡,鍵是電影名,鍵值先設定為0

totals[item]+= sim_pearson(prefs,person,other)*prefs[other][item] #相關係數乘以打分

simsums.setdefault(item,0)

simsums[item]+=sim_pearson(prefs,person,other)

rankings=

for item in totals:

rankings.sort()

rankings.reverse()

return rankings

#輸入:乙個資料集

#輸出:把裡面的人換為電影

def transformprefs(prefs):

result={}

for person in prefs:

for item in prefs[person]:

result.setdefault(item,{}) #此時定義了result字典裡的外層:key是項也就是電影,value是又乙個字典

result[item][person]=prefs[person][item]#在這裡定義第二個字典,即result[item]裡的鍵是person,value是prefs裡兩層字典的值【也就是打分】

return result

def calculatesimilaritems(prefs):

result={}

itemprefs = transformprefs(prefs)

for item in itemprefs:

scores=topmatches(itemprefs,item)

result[item]=scores

return result

程式設計珠璣ch02

1.給定乙個包含32位整數的順序檔案,它至多只能包含40億個這樣的整數,並且整數的次序是隨機的。請查詢乙個此檔案中不存在的32位整數。在有足夠主存的情況下,你會如何解決這個問題?如果你可以使用若干外部臨時檔案但可用主存卻只有上百位元組,你會如何解決這個問題呢?情形一 32位整數,從0到23 2 1 ...

CH02 資源 04 資源限制

資源限制的目的 kubernetes對資源的限制實際上是通過cgroup來控制的,cgroup是容器的一組用來控制核心如何執行程序的相關屬性集合。針對記憶體 cpu和各種裝置都有對應的cgroup 預設情況下,pod執行不受cpu和記憶體限額的限制,意味著可以消耗所在節點的所有cpu和記憶體,所以一...

雲課堂 組合語言筆記ch02

章節2 基礎知識 14.乙個工具給win7 or win10 15.二進位制 機器指令 彙編指令的關係 自答 機器指令用二進位制來表示。彙編指令通過彙編器可以翻譯成機器指令,而且是一一對應的.組合語言由以下三部分組成 a.彙編指令 彙編器 機器指令 b.偽指令 翻譯規則 告訴彙編器這兒怎麼翻譯那兒怎...