推薦系統 3 尋找資料集中的相似使用者

2021-08-15 23:48:13 字數 2744 閱讀 3970

# -*- 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實戰中提及到,我和室友們產生了劇荒,萌生出要做乙個個人用的推薦系統,解決劇荒的問題的想法,經過一輪的死纏爛打,這個個人推薦系統終於成型了。今天來分享一下心得,對此感興趣的朋友可以自己對著寫乙個。首先介紹一下傳統的推薦系統方法,之所以叫它傳統,是因為大部分學習資料上都是...