zoukankan      html  css  js  c++  java
  • matlab简单实现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

  • 相关阅读:
    微信被动回复用户消息
    微信接收普通消息接口
    THINKPHP nginx设置路由为PATHINFO模式
    php安装扩展步骤(redis)
    设计模式之单例模式
    设计模式之六大原则
    几个最常用的Mysql命令
    几个最常用的git命令
    VS使用WinRAR软件以命令行方式打包软件至一个exe
    智能指针unique_ptr的用法
  • 原文地址:https://www.cnblogs.com/yangxiao99/p/4753388.html
Copyright © 2011-2022 走看看