Matlab梯度下降解决评分矩阵分解

for iter = 1:num_iters

    %梯度下降 用户向量
    for i = 1:m
        %返回有0有1 是逻辑值
       ratedIndex1 = R_training(i,:)~=0 ;
       %U(i,:) * V'  第i个用户分别对每个电影的评分

       %sumVec1  第i个用户分别对每个电影的评分 减去真实值
       sumVec1 = ratedIndex1 .* (U(i,:) * V' - R_training(i,:));
       product1 = sumVec1 * V;
       derivative1 = product1 + lambda_u * U(i,:);
       old_U(i,:) = U(i,:) - theta * derivative1;
    end

    %梯度下降 电影向量
    for j = 1:n
       ratedIndex2 = R_training(:,j)~=0;
       sumVec2 = ratedIndex2 .* (U * V(j,:)' - R_training(:,j));
       product2 = sumVec2' * U;
       derivative2 = product2 + lambda_v * V(j,:);
       old_V(j,:) = V(j,:) - theta * derivative2;
    end

    U = old_U;
    V = old_V;
    RMSE(i,1) = CompRMSE(train_vec,U,V);
    RMSE(i,2) = CompRMSE(probe_vec,U,V);

end

  ......................................................................

SGD解决

function [ recItems ] = mf_gd( trainMatrix, featureNumber, maxEpoch, learnRate, lambdaU, lambdaV, k)

%get the size the train matrix
[userNumber,itemNumber] = size(trainMatrix);

%init user factors and item factors
Ut = 0.01 * randn(userNumber, featureNumber);
Vt = 0.01 * randn(itemNumber, featureNumber);
%逻辑1和0
logitMatrix = trainMatrix > 0;

%calculate the gradient of user factors and item factors
%and user sgd to optimize the risk function
%alternative update user factors and item factors alternative
for round = 1:maxEpoch,
   dU = -(logitMatrix  .* trainMatrix)  * Vt + (Ut * Vt' .* logitMatrix ) * Vt + lambdaU * Ut;
   dV = -(logitMatrix' .* trainMatrix') * Ut + (Vt * Ut' .* logitMatrix') * Ut + lambdaV * Vt;
   Ut = Ut - learnRate * dU * 2;
   Vt = Vt - learnRate * dV * 2;
end

%predict the rating of each item given by each user
predictMatrix = Ut * Vt';

%sort the score of items for each user
[sortedMatrix, sortedItems] = sort(predictMatrix, 2, 'descend');

%get the top-k items for each suer
recItems = sortedItems(:, 1:k);
end

  

时间: 2024-09-19 10:17:38

Matlab梯度下降解决评分矩阵分解的相关文章

Matlab梯度下降及正规方程实现多变量的线性回归

如果需要代做算法,可以联系我...博客右侧有联系方式. 一.相关概念   1.梯度下降 由于Z= X*theta - y是列向量,所以Z'*Z就是平方和连加,就是2范数:如果Z是矩阵呢,那么Z'*Z的对角线就是Z矩阵每列的2范数.   2.正规方程(Normal Equation)   θ = (XTX)-1XTY. 二.代码实现 2104,3,399900 1600,3,329900 2400,3,369000 1416,2,232000 3000,4,539900 1985,4,299900

推荐系统-基于矩阵分解的LFM模型

这里我想给大家介绍另外一种推荐系统,这种算法叫做潜在因子(Latent Factor)算法.这种算法是在NetFlix(没错,就是用大数据捧火<纸牌屋>的那家公司)的推荐算法竞赛中获奖的算法,最早被应用于电影推荐中.这种算法在实际应用中比现在排名第一的 @邰原朗 所介绍的算法误差(RMSE)会小不少,效率更高.我下面仅利用基础的矩阵知识来介绍下这种算法. 这种算法的思想是这样:每个用户(user)都有自己的偏好,比如A喜欢带有小清新的.吉他伴奏的.王菲等元素(latent factor),如果

再谈矩阵分解在推荐系统中的应用

本文将简单介绍下最近学习到的矩阵分解方法. (1)PureSvd 矩阵分解的核心是将一个非常稀疏的评分矩阵分解为两个矩阵,一个表示user的特性,一个表示item的特性,将两个矩阵中各取一行和一列向量做内积就可以得到对应评分. 那么如何将一个矩阵分解为两个矩阵就是唯一的问题了.说到这里大家就可能想起了在线代和数值分析中学到的各种矩阵分解方法,QR,Jordan,三角分解,SVD... 这里说说svd分解. svd是将一个任意实矩阵分解为三个矩阵U,S,V,其中,U,V是两个正交矩阵,称为左右奇异

浅谈矩阵分解在推荐系统中的应用

推荐系统是当下越来越热的一个研究问题,无论在学术界还是在工业界都有很多优秀的人才参与其中.近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮,比如几年前的Neflix百万大奖赛,KDD CUP 2011的音乐推荐比赛,去年的百度电影推荐竞赛,还有最近的阿里巴巴大数据竞赛.这些比赛对推荐系统的发展都起到了很大的推动作用,使我们有机会接触到真实的工业界数据.我们利用这些数据可以更好地学习掌握推荐系统,这些数据网上很多,大家可以到网上下载. 推荐系统在工业领域中取得了巨大的成功,尤其是

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵: 其中k为分解成低维的维数,一般远比m和n小.如果大家对FunkSVD算法不熟悉,可以复习对应的原理篇. 2. Spark推荐算法类库介绍 在Spar

梯度下降与矩阵分解实例解析

一.SGD的一个例子说明 下图是我目前得到的一个评分文件,3列的含义分别是UID:User ID,IID:Item ID,score:用户评分.可以看到一共有3个用户,4个物品. 他们可以构成一个3 * 4的评分矩阵矩阵.我现在取k=2,要把它们分解成为一个32的P矩阵和一个24的Q矩阵. 首先初始化P和Q矩阵,一般都用符合正态分布的随机数X~N(0,1)来填充矩阵. 现在我计算u=1时的∂L/∂Pu,取λ的值为1 首先计算u=1,i=1这个评分记录带来的梯度分量,即u=1,i=1时的的值,这时

梯度下降的矩阵分解公式推导

目标函数是要最小化C: 求其梯度: 梯度下降求最小值:

【干货】AI 实践者需要掌握的10大深度学习方法:反向传播、迁移学习、梯度下降……

过去10年,人们对机器学习的兴趣激增.几乎每天,你都可以在各种各样的计算机科学课程.行业会议.华尔街日报等等看到有关机器学习的讨论.在所有关于机器学习的讨论中,许多人把机器学习能做的事情和他们希望机器学习做的事情混为一谈.从根本上讲,机器学习是使用算法从原始数据中提取信息,并在某种类型的模型中表示这些信息.我们使用这个模型来推断还没有建模的其他数据. 神经网络是机器学习的一种模型,它们至少有50年历史了.神经网络的基本单元是节点(node),基本上是受哺乳动物大脑中的生物神经元启发.神经元之间的

进阶隐式矩阵分解——探讨如何实现更快的算法

本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译. 以下为译文: 阶隐式矩阵分解   前不久我发布了一个Python版本的隐式交替最小二乘矩阵分解算法(代码),虽然其速度不慢:但是本着精益求精的精神,本文将围绕Conjugate Gradient(共轭梯度)方法来探讨更快的算法.  在隐式反馈数据集协作过滤(Collaborative Filtering for Implicit Feedback Datasets)中描述的算法由于极强的扩展性,因此十分流行.不但Spark mllib中的隐