python中如何实现基于随机梯度下降的矩阵分解推荐算法
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍python中如何实现基于随机梯度下降的矩阵分解推荐算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A
千家信息网最后更新 2026年11月04日python中如何实现基于随机梯度下降的矩阵分解推荐算法
这篇文章主要介绍python中如何实现基于随机梯度下降的矩阵分解推荐算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A、B与C相乘得到,而B可以与A或者C合并,就变成了两个元素M1与M2的矩阵相乘可以得到M。
矩阵分解推荐的思想就是基于此,将每个user和item的内在feature构成的矩阵分别表示为M1与M2,则内在feature的乘积得到M;因此我们可以利用已有数据(user对item的打分)通过随机梯度下降的方法计算出现有user和item最可能的feature对应到的M1与M2(相当于得到每个user和每个item的内在属性),这样就可以得到通过feature之间的内积得到user没有打过分的item的分数。
本文所采用的数据是movielens中的数据,且自行切割成了train和test,但是由于数据量较大,没有用到全部数据。
代码如下:
# -*- coding: utf-8 -*-"""Created on Mon Oct 9 19:33:00 2017@author: wjw"""import pandas as pdimport numpy as npimport 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.rating 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在test中得到的结果为:
NAN则是训练集中没有的数据
以上是"python中如何实现基于随机梯度下降的矩阵分解推荐算法"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
数据
矩阵
目录
梯度
推荐
内在
训练
算法
两个
内容
文件
方法
篇文章
工作
较大
之间
乘积
代码
价值
元素
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技股
中关村互联网科技集团
互联网科技活动banner
互联网为科技
善班互联网科技
互联网科技革命
小马过河互联网科技
互联网科技的未来发展
互联网高科技股票
新华互联网科技校企合作
互联网科技革命什么开始
沐思想互联网科技有限公司
南通创西澳互联网科技有限公司
广州富喜互联网络科技
互联网公司属于科技吗
银川新华互联网科技学校是国营吗
易租星互联网科技有限公司
科技和互联网行业的特点
安徽零酒互联网科技有限公司
深圳互联网科技园地址
互联网和科技技术
互联网金融公司科技
艾特科技互联网
互联网校园科技培训
互联网科技有哪些公司
互联网保险科技创业
互联网行业科技股
互联网时代科技型公司的机会
科技互联网专业务虚会材料
前海云享互联网科技