pca 与 spca 在数据压缩方面的对比

来源:互联网 发布:大鼠血数据 编辑:程序博客网 时间:2024/06/05 22:50

spca即sparse pca,详见Sparse Principal Component Analysis,这篇文章。实现这篇文章的工具箱有 DSPCA 但是这个作者好像现在不继续了,主页上找不到下载链接,现在可以用的是SpaSM 这个toolbox,主页是:http://www2.imm.dtu.dk/projects/spasm/
可以免费下载,matlab的。
里面有一个对比pca,spca表现的测试例子。

n = 1500; p = 500;   t = linspace(0, 1, p);   pc1 = max(0, (t - 0.5)> 0);   pc2 = 0.8*exp(-(t - 0.5).^2/5e-3);   pc3 = 0.4*exp(-(t - 0.15).^2/1e-3) + 0.4*exp(-(t - 0.85).^2/1e-3);   X = [ones(n/3,1)*pc1 + randn(n/3,p); ones(n/3,1)*pc2 + ...     randn(n/3,p); ones(n/3,1)*pc3 + randn(n/3,p)];   % PCA and SPCA   [U D V] = svd(X, 'econ');   d = sqrt(diag(D).^2/n);   [B SD] = spca(X, [], 3, inf, -[250 125 100], 3000, 1e-3, true);   figure(1)   plot(t, [pc1; pc2; pc3]); axis([0 1 -1.2 1.2]);   title('Noiseless data');   figure(2);   plot(t, X);  axis([0 1 -6 6]);   title('Data + noise');   figure(3);   plot(t, d(1:3)*ones(1,p).*(V(:,1:3)'));  axis([0 1 -1.2 1.2]);   title('PCA');   figure(4)   plot(t, sqrt(SD)*ones(1,p).*(B'));  axis([0 1 -1.2 1.2]);   title('SPCA');

下面套用一个实际的例子说明一下,t 可以看成是一系列时间点,pc1,pc2,pc3 可以看成是一个人在t不同时刻时,的x,y,z坐标值,实际位置是唯一的,就是pc1, 1*500,pc2 pc3一样,500个时刻的坐标值,但是进行测量时,使用了500个观测者,n/3的含义,X中前500行是500个观测测对x坐标值的测量,然后是500个y值的测量,500个z值的测量,这些测量必然是有误差的,randn就表示这些误差,即noise, pca和spca在降维的同时,也是降噪,出现的结果分别是:
spca pca data data noise
这里用pca和spca 不是降维的,而且从很多数据中,选出一行最具代表性的一行,是从数据紧致性表达出发的,水平有限,解释的不是很清楚,如果是降维的话,得到的数据应该是,列数变小,行数不变,因为降维就是减小变量的个数,而每列代表一个变量,而行数是观测的个数,这个不降,而现在是列数没有变,行数变了。说明,很多观测都是相关的,取最具代表的几个就可可以表示,原来那么多的观测,这个不能说是降维,可以说是压缩?不确定啊,哪位大牛说明一下就好了。在这篇文章里有讲到数据压缩,太厉害了!
spca 尤其其稀疏性,效果更好一点!

0 0
原创粉丝点击