SVD:Singular Value Decomposition
这里是对 X X X进行分解,最终能够得到 X = U S V T X=USV^T X=USVT这样三个矩阵
接下来我们将讨论数据的降维和将数据反向推回之后在几何上具有什么意义
使用matlab在三维空间上生成一条不太平整的线
x = linspace(1,20,20);
y = 2*x + 3;
for i = 1:20
if(rand()>=0.5)
y(i) = y(i) + rand()*3;
else
y(i) = y(i) - rand()*3;
end
end
z = 2*y + x;
for i = 1:20
if(rand()>=0.5)
z(i) = z(i) + rand()*3;
else
z(i) = z(i) - rand()*3;
end
end
然后使用svd降维
a = [x;y;z];
[u,s,v] = svd(a);
u u u 为 ( 3 , 3 ) (3,3) (3,3) 的矩阵, s s s 为 ( 3 , 20 ) (3,20) (3,20) 的矩阵, s s s 为 ( 20 , 20 ) (20,20) (20,20) 的矩阵
有着关系: a = u ∗ s ∗ v T a=u*s*v^T a=u∗s∗vT
当然也可以使用精简分解 svd(a,‘econ’)
当降维到 2 2 2维的时候:
v = v(:,1:2);
s = s(:,1:2);
Ans = u*s*v';
X = Ans(1,:);
Y = Ans(2,:);
Z = Ans(3,:);
变化之后 u u u 为 ( 3 , 3 ) (3,3) (3,3) 的矩阵, s s s 为 ( 3 , 2 ) (3,2) (3,2) 的矩阵, s s s 为 ( 20 , 2 ) (20,2) (20,2) 的矩阵,当然,直接让第三个特征值为0也可以也就是 s ( 3 , 3 ) = 0 s(3,3)=0 s(3,3)=0,结果是一样的,降维的方法有两种,第一个就是取他的特征向量,取前几个特征向量,第二个就是让特征值为0
假设取了前 k k k个向量,所占信息多少计算方式为 ∑ i = 1 k s i i ∑ i = 1 n s i i \frac{\sum_{i=1}^{k}s_{ii}}{\sum_{i=1}^{n}s_{ii}} ∑i=1nsii∑i=1ksii,也就是选中特征向量的特征值占所有特征值的百分之多少
这是压缩前和压缩之后的变化,在数据相关性很强的情况下,可见压缩一维影响并不是特别的大
压缩之后成为了一个平面