楼主: nkwilling
3465 6

[原创博文] 原创:如何用SAS的SVD [推广有奖]

  • 0关注
  • 65粉丝

副教授

23%

还不是VIP/贵宾

-

威望
1
论坛币
3349 个
通用积分
0.0001
学术水平
109 点
热心指数
93 点
信用等级
47 点
经验
10032 点
帖子
322
精华
0
在线时间
596 小时
注册时间
2008-1-9
最后登录
2013-9-4

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近做项目刚刚开发的测试代码。
%let n=5;
%let cutoff=0.7;
proc iml;
reset deflib=work;
a={22  10   2   3   7,
      14   7  10   0   8,
      -1  13  -1 -11   3,
      -3  -2  13  -2   4,
       9   8   1  -2   4,
       9   1  -7   5  -1,
       2  -6   6   5   1,
       4   5   0  -2   2};
create tb from a;
append from a ;
quit;
PROC STDIZE data=tb out=tb_std;run;
proc princomp data=tb_std out=ww;run;
proc iml;
reset deflib=work;
use tb_std;
read all into tb_std;
print tb_std;
call svd(u,q,v,tb_std);
reset fuzz;
print  u q v ;
xx=tb_std*v;
print xx;/*the result xx matrix is consistent with data set ww**/
xxx=u*diag(q);/*the result xx matrix is consistent with data set ww**/
print xxx;
call svd(tu,tq,tv,t(tb_std));
reset fuzz;
print  tu tq tv ; /*tu with rank is equal to v with rank; so are tq and tv(u)*/
sq=sum(q);
print sq;
retain_eig={0};
idx={0};
do i=1 to &n.;
eig=q;
retain_eig=retain_eig+eig;
rate_eig=retain_eig/sq;
if rate_eig >= &cutoff. then do;idx=i; new_eig=q[1:idx];stop;end;
end;
print retain_eig;print idx;print new_eig;
v1=v[,1:idx];print v1;
u1=u[,1:idx];print u1;
q1=diag(q[1:idx]);print q1;
create u_matrix  from u1 ;
append from u1;
create v_matrix  from v1 ;
append from v1;
/***valid eigvalue and single value***/
call eigen(eig_value,eig_vect,t(tb_std)*tb_std);
print eig_value;
single=sqrt(abs(eig_value));
print single;
quit;
二维码

扫码加我 拉你入群

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

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

关键词:sas的 SVD 如何用 consistent princomp

已有 1 人评分威望 收起 理由
admin + 1 对论坛有贡献

总评分: 威望 + 1   查看全部评分

本帖被以下文库推荐

沙发
zhukovasky 发表于 2013-12-25 22:33:17 |只看作者 |坛友微信交流群
这么好的博文没人看?
za rujina!

使用道具

藤椅
爱萌 发表于 2013-12-26 08:59:56 |只看作者 |坛友微信交流群
nkwilling,这应该sas自带的svd,与你何敢,这不算你开发吧。
最恨对我说谎或欺骗我的人

使用道具

板凳
dxystata 发表于 2013-12-27 17:37:22 |只看作者 |坛友微信交流群
保存一下。
最近做项目刚刚开发的测试代码。
%let n=5;
%let cutoff=0.7;
proc iml;
reset deflib=work;
a={22  10   2   3   7,
      14   7  10   0   8,
      -1  13  -1 -11   3,
      -3  -2  13  -2   4,
       9   8   1  -2   4,
       9   1  -7   5  -1,
       2  -6   6   5   1,
       4   5   0  -2   2};
create tb from a;
append from a ;
quit;
PROC STDIZE data=tb out=tb_std;run;
proc princomp data=tb_std out=ww;run;
proc iml;
reset deflib=work;
use tb_std;
read all into tb_std;
print tb_std;
call svd(u,q,v,tb_std);
reset fuzz;
print  u q v ;
xx=tb_std*v;
print xx;/*the result xx matrix is consistent with data set ww**/
xxx=u*diag(q);/*the result xx matrix is consistent with data set ww**/
print xxx;
call svd(tu,tq,tv,t(tb_std));
reset fuzz;
print  tu tq tv ; /*tu with rank is equal to v with rank; so are tq and tv(u)*/
sq=sum(q);
print sq;
retain_eig={0};
idx={0};
do i=1 to &n.;
eig=q;
retain_eig=retain_eig+eig;
rate_eig=retain_eig/sq;
if rate_eig >= &cutoff. then do;idx=i; new_eig=q[1:idx];stop;end;
end;
print retain_eig;print idx;print new_eig;
v1=v[,1:idx];print v1;
u1=u[,1:idx];print u1;
q1=diag(q[1:idx]);print q1;
create u_matrix  from u1 ;
append from u1;
create v_matrix  from v1 ;
append from v1;
/***valid eigvalue and single value***/
call eigen(eig_value,eig_vect,t(tb_std)*tb_std);
print eig_value;
single=sqrt(abs(eig_value));
print single;
quit;

使用道具

报纸
dxystata 发表于 2013-12-27 17:41:08 |只看作者 |坛友微信交流群
爱萌 发表于 2013-12-26 08:59
nkwilling,这应该sas自带的svd,与你何敢,这不算你开发吧。
版主为什么编辑别人的帖子呢?

使用道具

地板
dxystata 发表于 2013-12-27 17:42:22 |只看作者 |坛友微信交流群
程序运行后出现warning和error!

使用道具

7
爱萌 发表于 2013-12-30 09:02:49 |只看作者 |坛友微信交流群
dxystata 发表于 2013-12-27 17:41
版主为什么编辑别人的帖子呢?
你自己没有看到吗,有error,而且SVD是sas自身携带的,和当时标题不符合,这是不道德的一种表现,
我只是做了我该做的
最恨对我说谎或欺骗我的人

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 17:56