基於隨機梯度下降的矩陣分解演算法

2021-08-28 21:56:30 字數 3145 閱讀 6517

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