楼主: ada89k
2628 0

数据降维:特征值分解和奇异值分解的实战分析 [推广有奖]

  • 3关注
  • 72粉丝

已卖:341份资源

学术权威

0%

还不是VIP/贵宾

-

威望
2
论坛币
2836 个
通用积分
23.7009
学术水平
123 点
热心指数
149 点
信用等级
82 点
经验
46259 点
帖子
1664
精华
3
在线时间
2498 小时
注册时间
2017-2-7
最后登录
2025-10-18

楼主
ada89k 在职认证  发表于 2017-12-10 15:14:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

数据降维:特征值分解和奇异值分解的实战分析



现在我们再回顾下这些问题,首先,提取主成分的必要性,从数字信号的角度分析,主成分时方差较大,称为信号,而噪声是方差较小的;极限讲,如果100个样本点都汇集成一个点,也就是方差为0,那么不就相当于我们手上有1个点吗,因为其他99个对我们的最终的目标不会有任何作用了,相对的,我们更喜欢来一个与之散的比较开的点,这样会对我们的模型起到一个实质的作用。

不管是特征值分解法,还是奇异值分解法,需要理解以下基本知识点:
向量在某个正交基空间上的投影,等于点乘这个主轴;
通过一次正交变换,可以实现一次向量的旋转;
正交方阵能使一个正交基变换为另一个正交基

已经分析了如何利用特征值分解完成数据的降维和提取主成分,下面看下如何利用奇异值分解完成数据降维,要知道它可以实现两个方向的降维,而特征值分解是做不到的。然后总结下它们的实际应用。

SVD分解过程

我们的原始数据样本:
A = np.array([[2, 4], [1, 3],[0,0]])
A
array([[2, 4],
      [1, 3],
      [0, 0]])
#转化为我们想要的A,将特征定为axis=0
A = A.T
A
array([[2, 1, 0],
      [4, 3, 0]])
调用 Numpy中的奇异值分解API:
#奇异值分解
np.linalg.svd(A)
得到的结果为三个数组U*Sigma*V转置
(array([[-0.40455358, -0.9145143 ],
       [-0.9145143 ,  0.40455358]]),
array([ 5.4649857 ,  0.36596619]) ,
array([[-0.81741556, -0.57604844,  0.       ],
       [-0.57604844,  0.81741556,  0.       ],
       [ 0.        ,  0.       ,  1.        ]]))

现在看下数据A是如何奇异值分解的:
#U矩阵是通过A.dot(A.T)的特征值求得的(按照特征值由大到小排序)
np.linalg.eig( A.dot(A.T) )
(array([ 0.13393125,  29.86606875]),array([[-0.9145143 , -0.40455358],
       [ 0.40455358, -0.9145143 ]]))
#奇异值(特征值的开根号)
np.sqrt(29.86606875),np.sqrt(0.13393125)
#V的转置是通过A.T.dot(A)的特征值求得的(按照特征值由大到小排序)
np.linalg.eig(A.T.dot(A))
(array([ 29.86606875,   0.13393125,  0.        ]),
array([[ 0.81741556, -0.57604844,  0.       ],
       [ 0.57604844,  0.81741556,  0.       ],
       [ 0.        ,  0.       ,  1.        ]]))

SVD降维实例

对于SVD的奇异值也是按照从大到小排列,而且奇异值梯度很大。在昨天,我们介绍过:在很多情况下,前10%,甚至有的1%的奇异值的和就占了全部的奇异值之和的99%,这是什么意思呢,这就表示原矩阵可以被压缩为一个很小的矩阵,并且还能保证其主要成分信息不会丢失。

也就是说,我们也可以用最大的 k 个的奇异值和对应的左右奇异向量来近似描述原始矩阵数据,如下图表达的含义:

QQ截图20171210151042.jpg



接下来,我们实际演练下这个过程,利用 numpy库随机生成一个5*9的二维数组(也可以称为矩阵吧)A:
array([[6, 4, 9, 4, 2, 7, 6, 2, 6],
      [6, 3, 0, 5, 6, 2, 5, 4, 8],
      [6, 0, 4, 2, 3, 5, 4, 9, 7],
      [6, 1, 3, 6, 5, 1, 3, 7, 1],
      [4, 1, 6, 4, 2, 4, 1, 3, 6]])
那么如何先进行特征降维呢? 比如降维成 5* r 列,只要降维后的 r列能近似表达原矩阵就行吧,已知奇异值分解的公式:

QQ截图20171210151047.jpg


因此如果想要把A降维成特征r个,那么只需要上个近似等式两边同乘以 Vr*n ,如下:

QQ截图20171210151052.jpg


因为Vr*n是正交矩阵,所以V的转置等于V的逆,所以,上式进一步化简为:

QQ截图20171210151055.jpg


这样,近似等号的右侧就是一个m*r的矩阵,它是将A矩阵压缩后的近似矩阵,V就是中间的变换矩阵。
借助numpy的API,我们发现取取3个奇异值,就已经表达了84%的奇异值的和,所以取前3个奇异值,因此,求出 U * Singular等于如下:(取小数点后1位显示)
array([[-15.3,   6.3, -0.8],
      [-13.2,  -3.9,  -4.9],
      [-14.5,  -1.4,   2.9],
      [-11.2,  -4.6,   2.5],
      [-10.9,   2.6,   0.6]])
这就完成了对特征的压缩,将含有9个特征的数据,最后压缩为3个特征。那么如何来按照行对数据压缩呢,和上面的原理差不多,在奇异值分解的等式两侧乘以U的转置,就可以推导出下式,等号右边不就是 r*n的按行压缩后的矩阵吗!

QQ截图20171210151101.jpg



至此,SVD按照特征压缩,和数据样本压缩,两个方向的压缩方法和例子就说完了,接下来看看它的实际应用吧。

数据压缩的实际应用

例如sklearn的 iris 经典数据集中,iris的4个特征,被PCA后,只提取了其中2个特征,便表达了其中的主要方差,这是一个数据降维的典型demo 。

QQ截图20171210151106.jpg



另外,PCA的特征值分解和奇异值分解在图像处理,压缩方面也有很广的应用,可以将图像的数据做奇异值分解,然后降维处理,例如下面的图片,经过奇异值分解法获得的主成分提取后压缩后的图像,可以看到基本保留了原来的图像主要信息。

QQ截图20171210151111.jpg



简单总结下,重点介绍了奇异值分解法压缩矩阵的原理,和一个实际的例子,最后实战介绍了PCA的实际应用。前面介绍了决策树的原理和例子解析,明天,基于次,再介绍一种经典的机器学习集成算法,XGBoost,它可是中国的科学家发明的。

二维码

扫码加我 拉你入群

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

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

关键词:奇异值 特征值 singular array Numpy 数据降维 机器学习 机器学习技术 机器学习运用 特征值分解

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

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-12 11:36