SVD在推荐系统中的应用

%svd chengxu 

A = [5 5 0 5;5 0 3 4; 3 4 0 3; 0 0 5 3; 5 4 4 5; 5 4 5 5];
A = A';

[U S V] = svd(A);

U = U(:,1:4);
S = S(1:4,1:4);
V = V(:,1:4);

reA = U*S*V';

%give one new user

bob = [5 5 0 0 0 5];

uservector = bob*V*S;

for i = 1:1:size(A,1)
    temp = U(i,:);
    similarity = temp*uservector'/(sqrt(temp*temp')*sqrt(uservector*uservector'));
    userlist(i) = similarity;
end

rank = sort(userlist);
l = size(rank,2);
t = zeros(1,size(A,2));
for i=l:-1:l-1
    indx = find(rank(i)==userlist);
    sim = rank(i);
    t = t + A(indx,:)*sim;
end

index = find(bob==0);
rank = t(index);
rank


matlab的代码很简单,因为有现场的svd函数可以使用

首先进行svd分解,之后我们会得到U,S,V三个矩阵

个人是这么理解的

如果在最初的矩阵中:列代表item而行代表了user

那么u则代表了user和中间量的关系,V代表了item与中间量的关系

S代表了不同中间量在期中所占的比重,或者是贡献。

这个中间量,我们可以理解为是item和类别,例如电影我们可以分为喜剧或者等等。

这就产生了一个附带产品

我们可以根据U和V对user和item进行聚类。这个以后再说


下面我们来了一个新的用户,我们知道它的一些信息,

那么,我们可以通过V和S把用户的信息映射到U相同的平面

然后计算新用户和Old user的相似度

通过老用户对item的兴趣,计算新用户对没有见过的item的兴趣程度

对这个结果rank后,即使最终推荐的顺序。


参看:

http://blog.csdn.net/abcjennifer/article/details/8131087

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值