今天看了itemcf的**
有很多看不懂的地方,改天留著請教其他人
`# coding = utf-8
import random
import time
import math
from operator import itemgetter
class itembasedcf():
# 初始化引數
definit(self,k):
# 找到相似的20部電影,為目標使用者推薦10部電影
self.n_sim_movie = k
self.n_rec_movie = 10
# 將資料集劃分為訓練集和測試集
self.trainset = {}
self.testset = {}
# 使用者相似度矩陣
self.movie_sim_matrix = {}
self.movie_popular = {}
self.movie_count = 0
print('similar movie number = %d' % self.n_sim_movie)
print('recommneded movie number = %d' % self.n_rec_movie)
# 讀檔案得到「使用者-電影」資料
def get_dataset(self, filename, pivot=0.8):
trainset_len = 0
testset_len = 0
for line in self.load_file(filename):
user, movie, rating, timestamp = line.split(',')
if(random.random() < pivot):
self.trainset.setdefault(user, {})
self.trainset[user][movie] = rating
trainset_len += 1
else:
self.testset.setdefault(user, {})
self.testset[user][movie] = rating
testset_len += 1
print('split trainingset and testset success!')
print('trainset = %s' % trainset_len)
print('testset = %s' % testset_len)
# 讀檔案,返回檔案的每一行
def load_file(self, filename):
with open(filename, 'r') as f:
for i, line in enumerate(f):
# if i == 0: # 去掉檔案第一行的title
# continue
yield line.strip('\r\n')
print('load %s success!' % filename)
# 計算電影之間的相似度
def calc_movie_sim(self):
for user, movies in self.trainset.items():
for movie in movies:
if movie not in self.movie_popular:
self.movie_popular[movie] = 0
self.movie_popular[movie] += 1
self.movie_count = len(self.movie_popular)
print("total movie number = %d" % self.movie_count)
for user, movies in self.trainset.items():
for m1 in movies:
for m2 in movies:
if m1 == m2:
continue
self.movie_sim_matrix.setdefault(m1, {})
self.movie_sim_matrix[m1].setdefault(m2, 0)
self.movie_sim_matrix[m1][m2] += 1
print("build co-rated users matrix success!")
# 計算電影之間的相似性
print("calculating movie similarity matrix ...")
for m1, related_movies in self.movie_sim_matrix.items():
for m2, count in related_movies.items():
# 注意0向量的處理,即某電影的使用者數為0
if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:
self.movie_sim_matrix[m1][m2] = 0
else:
self.movie_sim_matrix[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])
print('calculate movie similarity matrix success!')
# 針對目標使用者u,找到k部相似的電影,並推薦其n部電影
def recommend(self, user):
k = self.n_sim_movie
n = self.n_rec_movie
rank = {}
watched_movies = self.trainset[user]
for movie, rating in watched_movies.items():
for related_movie, w in sorted(self.movie_sim_matrix[movie].items(), key=itemgetter(1), reverse=true)[:k]:
if related_movie in watched_movies:
continue
rank.setdefault(related_movie, 0)
rank[related_movie] += w * float(rating)
return sorted(rank.items(), key=itemgetter(1), reverse=true)[:n]
# 產生推薦並通過準確率、召回率和覆蓋率進行評估
def evaluate(self):
print('evaluating start ...')
n = self.n_rec_movie
# 準確率和召回率
hit = 0
rec_count = 0
test_count = 0
# 覆蓋率
all_rec_movies = set()
for i, user in enumerate(self.trainset):
test_moives = self.testset.get(user, {})
rec_movies = self.recommend(user)
for movie, w in rec_movies:
if movie in test_moives:
hit += 1
all_rec_movies.add(movie)
rec_count += n
test_count += len(test_moives)
precision = hit / (1.0 * rec_count)
recall = hit / (1.0 * test_count)
coverage = len(all_rec_movies) / (1.0 * self.movie_count)
print('precisioin=%.4f\trecall=%.4f\tcoverage=%.4f' % (precision, recall, coverage))
ifname== 『main』:
starttime = time.time()
ml_1m=『d:\datas\ml-latest-small\ratings.csv』
k=20
itemcf = itembasedcf(k)
itemcf.get_dataset(ml_1m)
itemcf.calc_movie_sim()
itemcf.evaluate()
endtime = time.time()
print(『use time:%s s』 % (endtime - starttime))`
日誌11月22日
今天學習客戶端網路程式設計 usr bin python coding utf 8 檔名 client.py import socket 匯入 socket 模組 s socket.socket 建立 socket 物件 host socket.gethostname 獲取本地主機名 port 12...
5月22日 勉強
今日 adobe creative cloud 一篇 漫畫 読 全然使 擔當 頼 女性 女性 自分 勉強 先輩 相談 初心者向 本 積極的 活用 難 仕事 終 短 漫畫 読 感心 生活 仕事 中 様 挑戦 出會 時 時 失敗 自分自身 技術的 精神的 成長 時 習 単語 課外勉強 移行 損 切 開 ...
2月5日學習日誌
css的選擇器與優先順序 一 選擇器 1.萬用字元選擇器 選擇所有的內容 2.標籤選擇器 p,div,span,h1等均為標籤選擇器.3.id,class選擇器 id 唯一身份標誌 開頭 class 類 開頭 class可以有多個 中間要以空格隔開.如 class text section 此時樣式...