SAS中文论坛
标题:
SAS实现协同过滤中求出K个邻居
[打印本页]
作者:
shiyiming
时间:
2014-3-18 23:41
标题:
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
我的第二篇文章 受到版主大人的优待了!小的诚惶诚恐啊!
bxfly
作者:
shiyiming
时间:
2014-3-29 19:32
欢迎牛人作者长来指教呀!
作者:
bxfly
时间:
2014-3-29 22:08
shiyiming 发表于 2014-3-29 19:32
欢迎牛人作者长来指教呀!
闭门造车的东西,还希望版主大人多多指教
作者:
zhaizhongping
时间:
2014-4-1 02:54
Mahout对推荐系统的实现已经非常好了。看不出SAS做这个有什么意义。推荐引擎太消耗资源了。。
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2