import pandas as pd
import numpy as np
import os
def difference(left,right,on): #求兩個dataframe的差集
df = pd.merge(left,right,how='left',on=on) #引數on指的是用於連線的列索引名稱
left_columns = left.columns
col_y = df.columns[-1] # 得到最後一列
df = df[df[col_y].isnull()]#得到boolean的list
df = df.iloc[:,0:left_columns.size]#得到的資料裡面還有其他同列名的column
df.columns = left_columns # 重新定義columns
return df
def readfile(filepath): #讀取檔案,同時得到訓練集和測試集
pwd = os.getcwd()#返回當前工程的工作目錄
os.chdir(os.path.dirname(filepath))
#os.path.dirname()獲得filepath檔案的目錄;chdir()切換到filepath目錄下
initialdata = pd.read_csv(os.path.basename(filepath))
#basename()獲取指定目錄的相對路徑
os.chdir(pwd)#回到先前工作目錄下
preddata = initialdata.iloc[:,0:3] #將最後一列資料去掉
newindexdata = preddata.drop_duplicates()
traindata = newindexdata.sample(axis=0,frac = 0.1) #90%的資料作為訓練集
testdata = difference(newindexdata,traindata,['userid','movieid']).sample(axis=0,frac=0.1)
return traindata,testdata
def getmodel(train):
slowrate = 0.99
prermse = 10000000.0
max_iter = 100
features = 3
lamda = 0.2
gama = 0.01 #隨機梯度下降中加入,防止更新過度
user = pd.dataframe(train.userid.drop_duplicates(),columns=['userid']).reset_index(drop=true) #把在原來dataframe中的索引重新設定,drop=true並拋棄
movie = pd.dataframe(train.movieid.drop_duplicates(),columns=['movieid']).reset_index(drop=true)
usernum = user.count().loc['userid'] #671
movienum = movie.count().loc['movieid']
userfeatures = np.random.rand(usernum,features) #構造user和movie的特徵向量集合
moviefeatures = np.random.rand(movienum,features)
#假設每個user和每個movie有3個feature
userfeaturesframe =user.join(pd.dataframe(userfeatures,columns = ['f1','f2','f3']))
moviefeaturesframe =movie.join(pd.dataframe(moviefeatures,columns= ['f1','f2','f3']))
userfeaturesframe = userfeaturesframe.set_index('userid')
moviefeaturesframe = moviefeaturesframe.set_index('movieid') #重新設定index
for i in range(max_iter):
rmse = 0
n = 0
for index,row in user.iterrows():
uid = row.userid
userfeature = userfeaturesframe.loc[uid] #得到userfeatureframe中對應uid的feature
u_m = train[train['userid'] == uid] #找到在train中userid點評過的movieid的data
for index,row in u_m.iterrows():
u_mid = int(row.movieid)
#realrating = row.sort_values(by=u'rating',ascending = false)
realrating = row.userid
moviefeature = moviefeaturesframe.loc[u_mid]
eui = realrating-np.dot(userfeature,moviefeature)
rmse += pow(eui,2)
n += 1
userfeaturesframe.loc[uid] += gama * (eui*moviefeature-lamda*userfeature)
moviefeaturesframe.loc[u_mid] += gama*(eui*userfeature-lamda*moviefeature)
nowrmse = np.sqrt(rmse*1.0/n)
print('step:%f,rmse:%f'%((i+1),nowrmse))
if nowrmse測試資料表
執行結果
梯度下降(批量 隨機)和非負矩陣分解
原文 一 梯度下降 批量 隨機 梯度下降 gd 是最小化風險函式 損失函式的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路,下面從公式和實現的角度對兩者進行分析,如有哪個方面寫的不對,希望糾正。下面的h x 是要擬合的函式,j theta 損失函式,theta是引數,要迭代求解的值,th...
隨機梯度下降演算法
bp神經網路是神經網路的基礎,其中可用隨機梯度下降演算法來加快更新權值和偏置,但是隨機梯度下降演算法總是忘記,下面來好好複習一下 們已經研究出很多梯度下降的變化形式,包括 些更接近真實模擬球體物理運動的變化形 式。這些模擬球體的變化形式有很多優點,但是也有 個主要的缺點 它最終必需去計算代價函式c的...
隨機梯度下降演算法
每次從從訓練樣本集上隨機抽取乙個小樣本集,求其 值和真實值誤差的平均值,作為目標函式,將引數沿著梯度的方向移動,從而使當前的目標函式減少得最多。小樣本集的個數為batch size,通常為2的冪次方,有利gpu加速 代價函式的總和為1m i 1m l x i y i dfrac sum ml x y...