摘要: 特征分解,奇异值分解,Moore-Penrose广义逆网络
特征向量和特征值
咱们在《线性代数》课学过方阵的特征向量和特征值。机器学习
定义:设A∈Fn×n是n阶方阵。若是存在非零向量X∈Fn×1使AX=λX对某个常数λ∈F成立,则称λ是A的特征值(eigenvalue),X是属于特征值λ的特征向量。
设σ是数域F上向量空间V上的线性变换,若是某个非零向量u∈V被σ映射到本身的常数倍σ(u)=λu,则称常数λ∈F是σ的特征值,向量u是属于特征值λ的特征向量。函数
又找λ又找A确实不是一件容易事。好在,咱们能够把这事儿交给Tensorflow去解决。咱们能够用tf.self_adjoint_eigvals来求特征值,至关于MATLAB的eig函数,只不过名字长了点。工具
例:学习
>>> A1 = tf.constant([[3,2,1],[0,-1,-2],[0,0,3]],dtype=tf.float64) >>> sess.run(A1) array([[ 3., 2., 1.], [ 0., -1., -2.], [ 0., 0., 3.]]) >>> sess.run(tf.self_adjoint_eigvals(A1)) array([-1., 3., 3.])
附:MATLAB例:code
> A1 = [3,2,1;0,-1,-2;0,0,3] A1 = 3 2 1 0 -1 -2 0 0 3 > eig(A1) ans = 3 -1 3
也就是说,A1矩阵有3个特征值-1,3,3。get
特征分解
咱们把用self_adjoint_eigvals求出来的向量转换成对角矩阵:数学
>>> sess.run(tf.diag(tf.self_adjoint_eigvals(A1))) array([[-1., 0., 0.], [ 0., 3., 0.], [ 0., 0., 3.]])
一样,咱们把每一个特征向量组成一个矩阵,假设为V.
这样,咱们能够获得一个公式:A=Vdiag(λ)V−1
按照上面公式方法对矩阵A所作的操做叫作A的特征分解(eigen decomposition)it
不是每个矩阵均可以分解成特征值和特征向量。在某些状况下,特征分解存在,可是值是复数而不是实数。幸运的是,机器学习中遇到的方阵基本均可以分解成A=QΛQT,其中Q是特征向量构成的正交矩阵,Λ是对角矩阵。io
对于多数方阵,咱们能够进行特征值分解。若是对于非方阵该怎么办呢?答案是咱们有相似的奇异向量(Singular vector)和奇异值(singular value). 经过奇异向量和奇异值,咱们能够把非方阵进行奇异值分解(singular value decomposition),简称svd.
SVD将矩阵分解为三个矩阵的乘积:A=UDVT。其中,U和V都定义为正交矩阵。D是对角矩阵,虽然不必定是方阵。
若是A是一个mn的矩阵,那么U是一个mm的矩阵,V是一个nn的矩阵,D与A同样是mn的矩阵。
咱们能够经过tf.svd函数来作奇异值分解,例:
>>> As =tf.constant( [[1,2,3],[4,5,6]], dtype=tf.float64) >>> sess.run(As) array([[1., 2., 3.], [4., 5., 6.]]) >>> sess.run(tf.svd(As, full_matrices=True)) (array([9.508032 , 0.77286964]), array([[-0.3863177 , -0.92236578], [-0.92236578, 0.3863177 ]]), array([[-0.42866713, 0.80596391, 0.40824829], [-0.56630692, 0.11238241, -0.81649658], [-0.7039467 , -0.58119908, 0.40824829]]))
As矩阵是23的矩阵。因此U是22的,而V是3*3的。第1个值是奇异值,[9.508032 , 0.77286964],它是D的对角线上值,其它位置为0.
D的完整值为:
array([[9.508032 , 0. , 0. ], [0. , 0.77286964, 0. ]])
三个矩阵的完整值为:
#U array([[-0.3863177 , -0.92236578], [-0.92236578, 0.3863177 ]]) #D array([[9.508032 , 0. , 0. ], [0. , 0.77286964, 0. ]]) #V array([[-0.42866713, 0.80596391, 0.40824829], [-0.56630692, 0.11238241, -0.81649658], [-0.7039467 , -0.58119908, 0.40824829]])
咱们来验算一下这个奇异值分解是否是正确的,别忘了V是要转置的:
>>> sess.run(U @ D @ tf.transpose(V)) array([[0.99999997, 1.99999999, 2.99999997], [3.99999997, 5.00000001, 5.99999996]])
虽然是有点浮点计算偏差,可是结果还确实是咱们分解前的那个。关于计算偏差的问题,在机器学习中也天然是重要问题,后面会讨论。
铺垫了这么多,其实咱们是在为解线性方程组奋斗。咱们在第一节Tensorflow的线性回归例子,还有神经网络的例子都看到,求解线性方程组是重要的运算。
形如Ax=b的线性方程组,若是A有逆矩阵就好办了,两边分别右乘A逆就能够解出方程组。
可是问题是,机器学习中有不少方程是欠定的(underdetermined)。
这时候咱们就须要一种相似于逆矩阵的工具 - Moore-Penrose广义逆(pseudoinverse)。
Moore-Penrose广义逆定义以下:
A+=limα→0(ATA+αI)−1AT
这个定义在计算时是无法使用的,咱们使用另外一个公式来算
A+=VD+UT
这个公式一看太熟悉了,就是刚才咱们学习的奇异值分解嘛。
其中D+,D的广义逆的计算方法是全部非0值取倒数,而后矩阵转置。
对于一个AX=B方程组的最小二乘法解,通常来说不是惟一的。一般把它们中2-范数最小的一个称为极小最小二乘解,也叫最佳逼近解。
能够证实,AX=B必有惟一的极小最小二乘解,这个解就是X=A+B
广义逆简史
首先复习一下逆阵的概念,若是一个矩阵有逆阵,条件为:
美国数学家Moore于1920年逆矩阵的概念推广到任意矩阵上,使用的方法是正交投影算子来定义的。
1955年,英国数学家Penrose用下面的方程组来定义广义逆:
AGA=A,GAG=G,(AG)H=AG(GA)H=GA
其中,H这个符号表明矩阵共轭的转置,对于实数就至关于T。
不久以后,瑞典大地测量学家Arne Bjerhammer证实了Moore广义逆与Penrose广义逆的等价性。因此把它定义为Moore-Penrose广义逆。除了A+以外,还有A−广义逆等。
做者:lusing
本文为云栖社区原创内容,未经容许不得转载。