SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2777|回复: 4
打印 上一主题 下一主题

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

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
跳转到指定楼层
楼主
发表于 2014-3-18 23:41:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有关协同过滤的文章有很多,详细请看http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html
本文利用SAS计算出相似的K个邻居,后期的基于邻居的推荐系统就不是SAS所做的了。
关于相似邻居的计算,方法有很多。本文采用的是欧几里得的计算距离的算法,后期会尝试使用其他的算法。  
(一) 欧几里得的计算距离的算法     
  1. %macro cf;
  2.         data cf;
  3.         array a{4} a1-a4;
  4.         do k=1 to 10;
  5.         do j=1 to 4;
  6.         a{j}=ranuni(0);
  7.         end; output;
  8.         end; drop j ;
  9.         run;
  10.         %do i= 1 %to 10;
  11.         data a&i b&i;
  12.         set cf;
  13.         if _n_=&i then output a&i;
  14.         else output b&i;
  15.         run;
  16.         data cf&i;
  17.         array a{4} a1-a4;
  18.         array b{4}b1-b4;
  19.         retain b1-b4;
  20.         if _n_=1 then do ;
  21.         set a&i;
  22.         do i=1 to 4;
  23.         b{i}=a{i};
  24.         end;
  25.         end;
  26.         else do ;
  27.         set b&i;
  28.         do i= 1 to 4;
  29.         a{i}=a{i}-b{i} ;
  30.         end; output;
  31.         end; drop b1-b4 i;
  32.         run;
  33.         data x&i;
  34.         array a{4} a1-a4;
  35.         set cf&i;
  36.         do i=1 to 4;
  37.         x=sum(a(i)**2);
  38.         end;
  39.         output;drop i;
  40.         run;
  41.         proc rank data=x&i out=rank&i ;
  42.         var x ;
  43.         ranks y;
  44.         run;
  45.         data output&i;
  46.         set rank&i;
  47.         where y le 2;
  48.         run;
  49.         proc print data=output&i;
  50.         title "与&i.相似的两个邻居";
  51.         var k;
  52.         run;
  53.         %end;
  54.         %mend;
  55.         %cf;
复制代码
以上为贴出的SAS宏代码。稍作解释一下,本文是利用随机产生的数据计算的,所以第一步随机产生数据。第二部将要求出某个的邻居其本身的数据放到数据集a&i中,其余人的数据放到b&i中。然后计算出b&i中每个与其本身(即a&i中的数据)的距离,方法使用欧几里德距离。最后利用rank过程步对其距离排序,输出前两名的邻居 。

(二)pearson相关系数法计算距离
  1. %macro cf;
  2. data cf;
  3. array a{4} a1-a4;
  4. do i=1 to 10;
  5. do j=1 to 4;
  6. a{j}=ranuni(0);
  7. end;output;
  8. end; drop j ;
  9. run;
  10. proc transpose data=cf out=transpose1 prefix=col;
  11. id i;
  12. var a1-a4;
  13. run;
  14. %do i=1 %to 10;
  15. proc corr data=transpose1
  16. outp=corr&i rank pearson noprint;
  17. var col&i;
  18. with col1-col10;
  19. run;
  20. data corr1&i;
  21. set
  22. corr&i;
  23. col&i=abs(col&i);
  24. where _type_='CORR';
  25. if col&i=1
  26. then delete;
  27. run;
  28. proc sort data=corr1&i out=result&i;
  29. by descending col&i ;
  30. run;
  31. proc print data=result&i (obs=2);
  32. var _NAME_;
  33. title "与&i.相似的两个邻居";
  34. run;
  35. %end;
  36. %mend;
  37. %cf;
复制代码
分享到:  微信微信
收藏收藏
回复

使用道具 举报

6

主题

16

帖子

86

积分

超级版主

Rank: 8Rank: 8

积分
86
沙发
发表于 2014-3-29 09:45:53 | 只看该作者
我的第二篇文章 受到版主大人的优待了!小的诚惶诚恐啊!bxfly
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2014-3-29 19:32:16 来自手机 | 只看该作者
欢迎牛人作者长来指教呀!
回复 支持 反对

使用道具 举报

6

主题

16

帖子

86

积分

超级版主

Rank: 8Rank: 8

积分
86
地板
发表于 2014-3-29 22:08:11 | 只看该作者
shiyiming 发表于 2014-3-29 19:32
欢迎牛人作者长来指教呀!

闭门造车的东西,还希望版主大人多多指教
回复 支持 反对

使用道具 举报

0

主题

3

帖子

12

积分

新手上路

Rank: 1

积分
12
5#
发表于 2014-4-1 02:54:18 | 只看该作者
Mahout对推荐系统的实现已经非常好了。看不出SAS做这个有什么意义。推荐引擎太消耗资源了。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-11-22 14:44 , Processed in 0.113363 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表