使用tensorflow構建電影推薦系統

2021-08-22 11:49:01 字數 4786 閱讀 3748

1、蒐集資料集

2、準備資料

import pandas as pd

import numpy as np

import tensorflow as tf

ratings_df = pd.read_csv('c:/users/administrator/pycharmprojects/myproject/ml-latest-small/ratings.csv')

#print(ratings_df.tail()) #載入ratings.csv檔案

movies_df = pd.read_csv('ml-latest-small/movies.csv')

#print(movies_df.tail())# 載入movies.csv檔案

movies_df['movierow'] = movies_df.index

#print(movies_df.tail())

# # 篩選movies_df中的特徵

movies_df = movies_df[['movierow', 'movieid', 'title']]

movies_df.to_csv('moviesprocessed.csv', index = false, header=true, encoding='utf-8')

#print(movies_df.tail())#篩選好之後的movies_df檔案

#將rating_df中的movieid替換為行號

ratings_df = pd.merge(ratings_df, movies_df, on='movieid')

#print(ratings_df.head()) #檢視處理好的ratings_df檔案

ratings_df = ratings_df[['userid', 'movierow', 'rating']]

ratings_df.to_csv('ratingsprocessed.csv', index=false, header=true, encoding='utf-8')

#檢視篩選好之後的電影評分資訊,只包含userid,movierow,rating 三個

print(ratings_df.head())

# 建立電影評分矩陣rating 和評分記錄矩陣record

userno = ratings_df['userid'].max()+1

movieno = ratings_df['movierow'].max()+1

print(userno)#最大使用者編號

print(movieno)#最大電影編號

rating = np.zeros((movieno, userno))

flag = 0

ratings_df_length = np.shape(ratings_df)[0]

for index, row in ratings_df.iterrows(): #將rating_df中的資料填寫到rating當中

rating[int(row['movierow']), int(row['userid'])] = row['rating']

flag += 1

# print('processed %d, %d left' % (flag, ratings_df_length-flag))

record = rating > 0

print(record)

record = np.array(record, dtype=int) #將record的布林型轉化為0和1,0:使用者沒有對此電影評分;1:使用者對此電影進行了評分

print(record)

3、構建模型

def

normalizeratings

(rating, record):

m, n = rating.shape #m:電影數量;n:使用者數量

rating_mean = np.zeros((m,1))

rating_norm = np.zeros((m,n))

# 計算每個電影的原始評分-平均評分,平均評分

for i in range(m):

idx = record[i, :] != 0

rating_mean[i] = np.mean(rating[i, idx])#計算使用者評過分的電影的平均值

rating_norm[i, idx] -= rating_mean[i]

return rating_norm, rating_mean

rating_norm, rating_mean = normalizeratings(rating, record)

#print(rating_norm, rating_mean)#會報錯,因為rating_norm,rating_mean中含有nan

rating_norm = np.nan_to_num(rating_norm)#將rating_norm 中的nan變成數字0

print(rating_norm)

rating_mean = np.nan_to_num(rating_mean)#將rating_mean 中的nan變成數字0

print(rating_mean)

num_features = 10

#假設有10種型別的電影

#初始化電影內容矩陣x和使用者喜好矩陣theta, 標準正態分佈

x_parameters = tf.variable(tf.random_normal([movieno, num_features], stddev=0.35))

theta_parameters = tf.variable(tf.random.normal([userno, num_features], stddev=0.35))

#計算損失函式:loss = (x*theta'-rating_norm)^2 +1/2(x^2 + theta^2)

loss = 1/2 * tf.reduce_sum(((tf.matmul(x_parameters, theta_parameters, transpose_b=true)-rating_norm) * record)**2)\

+ 1/2 * ((tf.reduce_sum(x_parameters**2) + tf.reduce_sum(theta_parameters**2)))

4、優化目標

optimizer = tf.train

.adamoptimizer(1e-4)

train = optimizer.minimize(loss)

5、模型訓練

tf.summary.scalar('loss', loss)

summarymerged = tf.summary.merge_all()

filename = './movie_tensorboard'

writer = tf.summary.filewriter(filename)

sess = tf.session()

init = tf.global_variables_initializer()

sess.run(init)

for i in range(5000): #訓練次數

_, movie_summary = sess.run([train, summarymerged])

writer.add_summary(movie_summary, i) #代價值隨著迭代次數增加的變化情況

6、檢視訓練結果

開啟cmd,切換到儲存資料的路徑當中,

cd d:\users\administrator\pycharmprojects\myproject\movie_tensorboard

執行命令:tensorboard –logdir=./

在瀏覽器位址列輸入:127.0.0.1:6006,就可以在tensorboard中看到代價值隨著迭代次數增加的變化情況。

7、模型評估

#將當前x與theta儲存

current_x_parameters, current_theta_parameters = sess.run([x_parameters, theta_parameters])

predicts = np.dot(current_x_parameters, current_theta_parameters.t) + rating_mean

errors = np.sqrt(np.sum((predicts - rating)**2))

print(errors)

8、構建完整的電影推薦系統

user_id = input('您要向哪位使用者進行電影推薦?請輸入使用者編號:')

sortedresult = predicts[:, int(user_id)].argsort()[::-1] #按降序排列

idx = 0

#用來表示為使用者推薦的電影數量

print('為使用者推薦的評分最高的20部電影是:'.center(80, '='))

for i in sortedresult:

print('評分:%2f,電影名:%s' % (predicts[i, int(user_id)], movies_df.iloc[i]['title']))

idx += 1

if idx == 20: break

tensorflow 網路構建和使用筆記

比如 0 9如果不用杜熱編碼,在歐氏距離上,1和3比8和3更接近,但實際上並不是這樣,因此用獨熱編碼就能很好的打破這種聯絡。如何讀取呢 argmaxnp.argmax x data 0 返回最大數的索引 或在tensorflow中 tf,argmax x data,0 按行取值,即同列的每一行取最大...

Tensorflow專案構建流程

參考部落格 整理 一。訓練階段 1.tensorflow打包資料 2 採用tfrecoder進行高效資料讀取 2.網路架構與訓練 經過上面的資料格式處理,接著我們只要寫一寫網路結構,網路優化方法,把資料搞進網路中就可以 3.視覺化顯示 二。測試階段 直接通重載入圖模型,讀取引數等,然後直接通過ten...

用tensorflow構建動態RNN

直接看 def create cell cell rnn.lstmcell num units rnn cell rnn.multirnncell create cell for in range 2 output,states tf.nn.dynamic rnn rnn cell,x,dtype ...