shiyiming 发表于 2014-3-18 23:41:02

SAS实现协同过滤中求出K个邻居

有关协同过滤的文章有很多,详细请看http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html;
本文利用SAS计算出相似的K个邻居,后期的基于邻居的推荐系统就不是SAS所做的了。
关于相似邻居的计算,方法有很多。本文采用的是欧几里得的计算距离的算法,后期会尝试使用其他的算法。
(一) 欧几里得的计算距离的算法      %macro cf;
      data cf;
      array a{4} a1-a4;
      do k=1 to 10;
      do j=1 to 4;
      a{j}=ranuni(0);
      end; output;
      end; drop j ;
      run;
      %do i= 1 %to 10;
      data a&i b&i;
      set cf;
      if _n_=&i then output a&i;
      else output b&i;
      run;
      data cf&i;
      array a{4} a1-a4;
      array b{4}b1-b4;
      retain b1-b4;
      if _n_=1 then do ;
      set a&i;
      do i=1 to 4;
      b{i}=a{i};
      end;
      end;
      else do ;
      set b&i;
      do i= 1 to 4;
      a{i}=a{i}-b{i} ;
      end; output;
      end; drop b1-b4 i;
      run;
      data x&i;
      array a{4} a1-a4;
      set cf&i;
      do i=1 to 4;
      x=sum(a(i)**2);
      end;
      output;drop i;
      run;
      proc rank data=x&i out=rank&i ;
      var x ;
      ranks y;
      run;
      data output&i;
      set rank&i;
      where y le 2;
      run;
      proc print data=output&i;
      title "与&i.相似的两个邻居";
      var k;
      run;
      %end;
      %mend;
      %cf;以上为贴出的SAS宏代码。稍作解释一下,本文是利用随机产生的数据计算的,所以第一步随机产生数据。第二部将要求出某个的邻居其本身的数据放到数据集a&i中,其余人的数据放到b&i中。然后计算出b&i中每个与其本身(即a&i中的数据)的距离,方法使用欧几里德距离。最后利用rank过程步对其距离排序,输出前两名的邻居 。

(二)pearson相关系数法计算距离
%macro cf;
data cf;
array a{4} a1-a4;
do i=1 to 10;
do j=1 to 4;
a{j}=ranuni(0);
end;output;
end; drop j ;
run;
proc transpose data=cf out=transpose1 prefix=col;
id i;
var a1-a4;
run;
%do i=1 %to 10;
proc corr data=transpose1
outp=corr&i rank pearson noprint;
var col&i;
with col1-col10;
run;
data corr1&i;
set
corr&i;
col&i=abs(col&i);
where _type_='CORR';
if col&i=1
then delete;
run;
proc sort data=corr1&i out=result&i;
by descending col&i ;
run;
proc print data=result&i (obs=2);
var _NAME_;
title "与&i.相似的两个邻居";
run;
%end;
%mend;
%cf;

bxfly 发表于 2014-3-29 09:45:53

我的第二篇文章 受到版主大人的优待了!小的诚惶诚恐啊!bxfly

shiyiming 发表于 2014-3-29 19:32:16

欢迎牛人作者长来指教呀!

bxfly 发表于 2014-3-29 22:08:11

shiyiming 发表于 2014-3-29 19:32
欢迎牛人作者长来指教呀!

闭门造车的东西,还希望版主大人多多指教

zhaizhongping 发表于 2014-4-1 02:54:18

Mahout对推荐系统的实现已经非常好了。看不出SAS做这个有什么意义。推荐引擎太消耗资源了。。
页: [1]
查看完整版本: SAS实现协同过滤中求出K个邻居