學習日誌 5月22日

2021-10-23 08:10:21 字數 4492 閱讀 6017

今天看了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 此時樣式...