全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3373 10
2012-11-06
悬赏 50 个论坛币 未解决
想求出数据集observations的每个点(一个点对应一条记录)最近的5个点组成的数据集。老板只允许用SAS BASE实习,求高手帮助实现 ,以下是找一个给定点的5个最近点的程序,可供参考,谢谢!
data observations;
  do ID=1 TO 100000;
    x1 = RAND('NORMAL',0,1);
    x2 = RAND('NORMAL',0,1);
    x3 = RAND('NORMAL',0,1);
    output;
  end;
run;
%macro listOfKNN (obser , target, K, nameOutput);
%Let dim = %eval(%SYSFUNC(count(&target,%NRSTR( )))+1) ;
%let ttt =;
%DO ii = 1 %TO &dim;
  %let ttt = &ttt.(x&ii.-%scan(&target,&ii," "))**2;
  %IF &ii NE &dim %THEN
   %let ttt = &ttt.+;
%END;
proc sql noprint ;
    create table &nameOutput as
     select distinct *, sqrt(&ttt)as distance
     from &obser
     order by distance;
quit;
data &nameOutput;
    set &nameOutput (obs=&K);
  drop distance;
run;
%mend listOfKNN;


/*make a test*/
%listOfKNN( obser   = observations,
   target  = 0.5 1 1,
   K   =  5,
   nameOutput = out
);

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-11-6 22:37:39
data observations;
  do ID=1 TO 20;
    x1 = RAND('NORMAL',0,1);
    x2 = RAND('NORMAL',0,1);
    x3 = RAND('NORMAL',0,1);
    output;
  end;
run;
%macro listOfKNN (obser , target, K, nameOutput);
%Let dim = %eval(%SYSFUNC(count(&target,%NRSTR( )))+1) ;
%let ttt =;
%DO ii = 1 %TO &dim;
  %let ttt = &ttt.(x&ii.-%scan(&target,&ii," "))**2;
  %IF &ii NE &dim %THEN
   %let ttt = &ttt.+;
%END;
proc sql noprint ;
    create table temp as
     select distinct *, sqrt(&ttt)as distance
     from &obser
     order by distance;
quit;
data &nameOutput;
    set &nameOutput temp(obs=&K drop=distance);
run;
%mend listOfKNN;

data out;
set Observations;
if _n_=0;
run;
data _null_;
set Observations;
call execute('%listofknn(obser=observations,target='||compress(x1)||' '||compress(x2)||' '||compress(x3)||',k=5,nameoutput=out)');
run;
我用20个数据试验了一下,100000个数据程序估计要运行很长时间


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-7 14:20:08
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不知道为什么?有其他方法吗?多谢多谢啊
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-7 14:20:42
ziyenano 发表于 2012-11-6 22:37
data observations;
  do ID=1 TO 20;
    x1 = RAND('NORMAL',0,1);
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不知道为什么?有其他方法吗?多谢多谢啊
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-7 14:28:17
semenljw 发表于 2012-11-7 14:20
谢谢ZIYENANO,现在的问题是如果变量很多的话,后面就不能用连接符,但今天早上我试着用catx一直都不对,不 ...
宏中设定分隔符是空格,
catx连接的时候,设定连接符为空格;而且要用compress函数将x1...xn中的空格去掉;
catx(' ',compress(x1),compress(x2),....compress(xn));
或者将宏中分隔符改为@等其他字符,就不会与字段x1...xn中的空格冲突了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-7 21:55:57
ziyenano 发表于 2012-11-7 14:28
宏中设定分隔符是空格,
catx连接的时候,设定连接符为空格;而且要用compress函数将x1...xn中的空格去掉 ...
您好!ziyenano.下面的代码是目前做smote的初始想法,找出每条记录的临近5条记录,但上面的代码最后一个宏,还是有些问题,调了很久,感觉没问题,所以不知道问题出现在什么地方?可以麻烦您能帮我看看吗?真的很感谢您的帮忙!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群