# -*- coding:utf-8 -*-
''' 尋找資料集中的相似使用者
'''import json
import numpy as np
# 計算user1 和 user2的相關係數
defpearson_score
(dataset,user1,user2):
if user1 not
in dataset:
raise typeerror('user'+user1+'not present in the dataset')
if user2 not
in dataset:
raise typeerror('user'+user2+'not present in the dataset')
# 提取兩個使用者都評過分的電影
rated_by_both = {}
for item in dataset[user1]:
if item in dataset[user2]:
rated_by_both[item]=1
num_ratings=len(rated_by_both)
# 如果兩個使用者都沒有評分 則說明兩個使用者之間沒有相似度 返回值為0
if num_ratings==0:
return
0# 計算相同評分電影的平方值之和
user1_sum=np.sum([dataset[user1][item] for item in rated_by_both])
user2_sum=np.sum([dataset[user2][item] for item in rated_by_both])
# 計算相同電影的評分的平方和
user1_squared_sum=np.sum([np.square(dataset[user1][item]) for item in rated_by_both])
user2_squared_sum=np.sum([np.square(dataset[user2][item]) for item in rated_by_both])
# 計算資料集的乘積之和
product_sum=np.sum([dataset[user1][item]*dataset[user2][item] for item in rated_by_both])
# 計算皮爾遜相關係數
sxy=product_sum-(user1_sum*user2_sum/num_ratings)
sxx=user1_squared_sum-np.square(user1_sum)/num_ratings
syy=user2_squared_sum-np.square(user2_sum)/num_ratings
# 考慮分母為0的情況
if sxx*syy==0:
return
0# 如果上述正常 返回皮爾遜相關係數
return sxy/np.sqrt(sxx*syy)
# 尋找特定數量的與輸入使用者相似的使用者
# dataset:代表資料庫 user: 輸入使用者 num_users:相似的使用者個數
deffind_similar_users
(dataset,user,num_users):
if user not
in dataset:
raise typeerror('user '+user+' not present in the dataset')
# 計算所有使用者的皮爾遜相關度
scores = np.array([[x,pearson_score(dataset,user,x)] for x in dataset if user!=x])
# 評分按照第二列進行排列
scores_sorted =np.argsort(scores[:,1])
# 評分按照降序排列
scores_sorted_dec=scores_sorted[::-1]
# 提取多個高分並返回
top_k=scores_sorted_dec[0:num_users]
return scores[top_k]
if __name__ == '__main__':
data_file='movie_ratings.json'
with open(data_file,'r') as f:
data=json.loads(f.read())
user='john carson'
print
"\n user similar to "+user+":\n"
# 查詢三個相似使用者
similar_users=find_similar_users(data,user,3)
print
"user\t\t\t similarity score\n"
for item in similar_users:
print item[0],'\t\t',round(float(item[1]),2)
輸出結果如下:
user similar to john carson:
user similarity score
michael henry 0.99
alex roberts 0.75
melissa jones 0.59
推薦系統系列3 基於決策樹做推薦系統的方法
1 決策樹概念 決策樹是基於樹的結構來進行決策的,這與人類的認知方法類似,例如 今天會下雨麼?針對此問題我們首先會進行一系列的判斷或者決策 今天陰天麼,如果陰天,大概率 會下雨 如果晴天,大概率不下雨。如圖1。圖12 文字分類 所謂文字分類,就是基於文字的特徵將其劃分到具體的類別當中,與決策樹類似。...
用python3尋找1000以內的完數
題目 乙個數恰好等於它的因子之和,這個數就稱之為完數例如 6 1 2 3請找出1000以內的所有完數,可以參照尋找因式分解的程式。結果 6,28,496 方法一 import math for i in range 2 1001 1 factor num 0for l in range 1 int ...
用python寫乙個簡單的推薦系統
在上篇文章豆瓣電影,電視劇集dm實戰中提及到,我和室友們產生了劇荒,萌生出要做乙個個人用的推薦系統,解決劇荒的問題的想法,經過一輪的死纏爛打,這個個人推薦系統終於成型了。今天來分享一下心得,對此感興趣的朋友可以自己對著寫乙個。首先介紹一下傳統的推薦系統方法,之所以叫它傳統,是因為大部分學習資料上都是...