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 ...