%ProbS

clear all;
%% 数据读入与预处理

data = load('E:\network_papers\u1.base');
test = load('E:\network_papers\u1.test');

R = preprocess(data.train);
T = preprocess(test.test);

[M,N] = size(R);
[m,n] = size(T);

w = resource_allocate(R,du,di);

for u = 1:M
    index_i_n(u).id = find( R(u,:) == 0 );
end
%% 对每个用户u,对其所有uncollected items预测评分

PR = zeros(M,N);
for u = 1:M
    index_y = find( R(u,:) ~= 0 );
    vec = R(u,index_y);
    for k = 1:length(index_i_n(u).id)
        PR( u, index_i_n(u).id(k) ) = w( index_i_n(u).id(k), index_y ) * vec';
    end
end

value = evaluate('precision',R,PR,T,index_i_n);
hit=hitrate(PR,T,20);
save  predi_matrix PR;

------------------------------------------------------------------------------------------------

%Preprocess

function R = preprocess (A)
[m,n] = size(A);
M = max( A(:,1) );
N = max( A(:,2) );
B(M,N) = 0;
for i = 1:m
        B( A(i,1), A(i,2) ) = A(i,3);
end
B( B < 3 ) = 0;
B( B >= 3 ) = 1;
R = B;

-------------------------------------------------------------------------------------------------------------

%evalate

% evaluate function for multiplied rate for recommendation system
% opt:选择的评价标准,PR:经过预评分的训练集,T:测试集,index_n:所有用户没有评价的物品的索引
function value = evaluate(opt,R,PR,T,index_i_n)
[m,n] = size(T);
[M,N] = size(R);
%% 选择评价方法
switch (opt)

%% 均方根差
    case {'RMSE'}
        RMSE = zeros(1,m);
        for u = 1:m
            index_tmp = index_i_n(u).id;
            index_tmp( index_tmp > n ) = [];
            len = length(index_tmp);
            vec = PR(u,index_tmp) - T(u,index_tmp);
            RMSE(u) = sqrt( sum( vec .* vec ) / len );
            if ~(mod(u,10))
                fprintf('%d\n',u);
            end
        end
        value = sum(RMSE) / length(RMSE);
        fprintf('The RMSE is:\n%d',value);

%%  Pearson积矩相关系数,衡量预测评分和真实评分的线性相关程度
       % pcc在-1到1之间,越靠近1或者-1,线性相关性越好,0表示没有相关性
    case {'pcc'}
        pcc = zeros(1,m);
        for u = 1:m
            index_tmp = index_i_n(u).id;
            index_tmp( index_tmp > n ) = [];
            len = length(index_tmp);
           
            predict = PR(u,index_tmp);
            real = T(u,index_tmp);
            mean_predict = sum(predict) / len;
            mean_real = sum(real) / length(real);
           
            vec1 = predict - mean_predict;
            vec2 = real - mean_real;
            sum1 = vec1 * vec1';
            sum2 = vec2 * vec2';
            if ( sum1 ~= 0 ) && ( sum2 ~= 0 )
                pcc(u) = vec1 * vec2' / sqrt( sum1 * sum2 );
            end
            if ~(mod(u,10))
                fprintf('%d\n',u);
            end
        end
        value = sum(pcc) / m;
        fprintf('The PCC is:\n%d',value);

%% 命中率hitting rate 只适用于二值标准,如“喜欢”、“不喜欢”
    case {'hitrate'}
        [SR,index_sr] = sort(PR,2,'descend');
        rato(m,n) = 0;
        for u = 1:m
            sumu = sum(T(u,:));
            rec = 1;
            while rec <= n
                tmp1 = index_sr(u,1:rec);
                tmp1( tmp1 > n ) = [];
                tmp2 = T(u,tmp1);
                if (sumu ~= 0)
                    rato(u,rec) = sum(tmp2) / sumu;
                end
                    rec = rec + 1;
            end
            if ~(mod(u,10))
                fprintf('%d\n',u);
            end 
        end
        value = sum(rato) / m;
     
        x = 1:length(value);
        plot(x,value,'--r');
        hold on;
        xlabel('length of recommendation list');
        ylabel('hitting rate');
       
        %% 平均排序分
    case {'rankscore'}
        [SR,index_sr] = sort(PR,2,'descend');
        %rato = zeros( 1, m );
        for u = 1:m
            len1 = length( index_i_n(u).id );
            index_i_t = find( T(u,:) == 1 );
            len2 = length( index_i_t );
            index_tmp = zeros( 1, len2 );
            if len2 ~= 0
                for k = 1:len2
                    tmp = index_i_t(k);
                    index_tmp(k) = find( index_sr(u,:) == tmp );
                end
                rato(u) = sum( index_tmp / len1 ) / len2;
            end
        end
        value = sum(rato) / length(rato);
        fprintf('The average rank score is:\n%d\n',value);
       
       %% 准确度及准确度提高比例
    case {'precision'}
        L = 10;
        [SR,index_sr] = sort(PR,2,'descend');
        list = index_sr(:,1:L);
        p = zeros(1,m);
        for u = 1:m
            index_i_t = find( T(u,:) == 1 );
            vec = intersect( index_i_t, list(u,:) );
            p(u) = numel(vec) / L;
        end
        value = sum(p) / m;
        ep = value * M * N / sum( sum(T) );
        fprintf('The precision is:\n%d\n',value);
        fprintf('The precision enhancement is:\n%d\n',ep);
       
        %% recall & recall enhancement
    case {'recall'}
        L = 20;
        [SR,index_sr] = sort(PR,2,'descend');
        list = index_sr(:,1:L);
        for u = 1:m
            index_i_t = find( T(u,:) == 1 );
            vec = ismember( index_i_t, list(u,:) );
            if sum( T(u,:) ) ~= 0
                recall(u) = sum(vec) / sum( T(u,:) );
            end
        end
        value = sum(recall) / length(recall);
        er = value * M / L;
        fprintf('The recall is:\n%d\n',value);
        fprintf('The recall enhancement is:\n%d\n',er);
        %% personalization
    case {'personalization'}
        L = 20;
        [SR,index_sr] = sort(PR,2,'descend');
        list = index_sr(:,1:L);
        flag = 1;
        h = zeros(m,m);
        for u = 1:m
            for k = flag:m
                tmp = intersect( list(u,:), list(k,:) );
                h(u,k) = 1 - length( tmp ) / L;
                h(k,u) = h(u,k);
            end
            flag = flag + 1;
        end
        value = sum( sum(h) ) / ( m^2 - m );
        fprintf('The personalization is:\n%d\n',value);
    case {'novelty'}
        degree_i = sum( R,1 );
        L = 20;
        [SR,index_sr] = sort(PR,2,'descend');
        list = index_sr(:,1:L);
        I = zeros(1,m);
        for u = 1:m
            vec1 = degree_i( 1, list(u,:) );
            vec2 = M ./ vec1;
            mult = 1;
            for k = 1:length(vec2)
                mult = mult * vec2(k);
            end
            I(u) = log2(mult) / L;
        end
        value = sum(I) / m;
        fprintf('The novelty is:\n%d\n',value);         
        
       
end 
    
-------------------------------------------------------------------------------------------------

%CF

%% 数据预处理

clear all;
%data = load('E:\network_papers\datasets\Jester\jeste_train');
%test = load('E:\network_papers\datasets\Jester\jester_test');
data = load('E:\network_papers\u1.base');
test = load('E:\network_papers\u1.test');

R = preprocess(data);
T = preprocess(test);
%{
R=data.train;
R(R<3)=0;
R(R>=3)=1;
T=test.test;
T(T<3)=0;
T(T>=3)=1;
du = sum(R,2);
di = sum(R,1);
ex=find(du==0);
R(ex,:)=[];
T(ex,:)=[];
du(ex,:)=[];
%}

[M,N] = size(R);
[m,n] = size(T);
for u = 1:M
    index_i_n(u).id = find( R(u,:) == 0 );
end
%% 计算出每个用户与其他用户之间的相似度

sim = get_Sim_u(R);
%% 预测评分

PR = zeros(M,N);
for u = 1:M
    index_n = find(  R(u,:) == 0 );
    for k = 1:length( index_n )
        PR( u, index_n(k) ) = predict_Rate( u, index_n(k), sim, R );
    end
end
 value = evaluate('precision',R,PR,T,index_i_n);
 hit=hitrate(PR,T,20);

ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)的更多相关文章

  1. 从零开始安装hue(原创-转载注明出处)

    hue安装需要从github上面下载源码,进行编译安装.github上面给出的安装教程很简单 然而实际上在安装的过程中遇到了无数个坑,下面开始真正意义上的从零开始安装hue. 安装环境: centOS ...

  2. Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)

    Java使用JNA调用DLL 1.准备 1.JDK环境 2.Eclipse 3.JNA包 下载JNA包: (1).JNA的Github:https://github.com/java-native-a ...

  3. paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]

    Haar-like矩形遍历检测窗口演示Matlab源代码 clc; clear; close all; % Haar-like特征矩形计算 board = 24 % 检测窗口宽度 num = 24 % ...

  4. 基于小波变换的数字图像处理(MATLAB源代码)

    基于小波变换的数字图像处理(MATLAB源代码) clear all; close all; clc;M=256;%原图像长度N=64; %水印长度[filename1,pathname]=uiget ...

  5. [原创作品] 对获取多层json值的封装

    今天篇头不废话了,交流加群:164858883 在我们接收后端返回的json数据的时候,在数据缺失的时候,如果直接接收会导致致命错误的发生.可能有些同学会说通常都会有,不用判断直接获取也行.之前我也是 ...

  6. [原创作品] web项目构建(一)

    今天开始,将推出web项目构建教程,与<javascript精髓整理篇>一并更新.敬请关注. 这篇作为这一系列开头,主要讲述web项目的构建技术大全.在众多人看来,web前端开发无非就是写 ...

  7. [原创作品] RequireJs入门进阶教程

    最近我发现RSS采集数据是个很好玩的东西,就是可以直接把别人的数据放在自己的网站上.如果网友们在其他地方发现这篇文章,还是来博客园看吧(http://zhutty.cnblogs.com).这样代码比 ...

  8. [原创作品]web网页中的锚点

    因为近来在从事web前端开发的工作,所以写的文章也都是关于web这一块.以后将分享算法和web高级编程的内容,很多公司的web前端不够重视,以为是很low-level,给的待遇也很一般,其实,这都是很 ...

  9. [原创作品]手把手教你怎么写jQuery插件

    这次随笔,向大家介绍如何编写jQuery插件.啰嗦一下,很希望各位IT界的‘攻城狮’们能和大家一起分享,一起成长.点击左边我头像下边的“加入qq群”,一起分享,一起交流,当然,可以一起吹水.哈,不废话 ...

随机推荐

  1. How do I list all tables/indices contained in an SQLite database

    How do I list all tables/indices contained in an SQLite database If you are running the sqlite3 comm ...

  2. lookupedit清空选择 z

    lookupedit绑定数据,选择以后.怎么点击按钮使lookupedit回到初始位置,即nulltext的值.注意,是点击按钮,不是按默认的CTRL+DELETE. txtKHXX.EditValu ...

  3. MAC OSX 驱动操作

    mac ox系统的驱动安装常规操作:下载到 *.kext 的驱动以后,都可以直接把它拖到 /System/Library/Extensions/ 下替换掉原来的文件.替换了以后,还需要修复权限才能够正 ...

  4. 可进行JavaScript代码测试与调试的12个网站

    概述:JavaScript是网站前端开发最为重要的一门编程语言,本文收集了能够在线测试与调试JavaScript代码的12个网站 1.JS Bin JS bin是一个为JavaScript和CSS爱好 ...

  5. 九度 Online Judge 之《剑指 Offer》一书相关题目解答

    前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...

  6. VMware 命令行下安装以及导入Ubuntu系统

    前提: 鉴于个人PC性能太弱,考虑是否可以将在PC上搭建好的环境移植到高性能服务器上.想到后就干呗. 下载完对应操作系统的安装包后按如下步骤操作: 安装包名称:VMware-Workstation-F ...

  7. 任务(Tasks)

    在Eclipse中用TODO标签管理任务,利用这个功能可以方便地将项目中一些需要处理的任务记录下来.我们可以通过在java注释里添加任务标签来标记一个任务,任务可以通过Tasks(任务)视图来察看. ...

  8. C++11中的右值引用

    原文出处:http://kuring.me/post/cpp11_right_reference May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移 ...

  9. c#中格式化导出Excel数据

    在项目开发过程中经常会遇到数据导出Excel.如果只是导出数据就好办了.但往往用户会有各种格式要求.加粗.边框.合并单元格.汇总等功能. 以下的方法是基于Excel模版方式写入数据导出的功能.可以最大 ...

  10. Python中list的实现

    原文链接这篇文章介绍了Python中list是如何实现的.在Python中list特别有用.让我们来看下list的内部是如何实现的.来看下面简单的程序,在list中添加一些整数并将他们打印出来. &g ...