目標輸出:我想得到乙個長串,裡面既有與這個人評分較高(即相似度較高)的人的名字,也有他的得分,應該用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.偽指令 翻譯規則 告訴彙編器這兒怎麼翻譯那兒怎...