Numpy之于线性代数
我看过最好的线性代数教程,莫过于:3Blue1Brown,吐血推荐。
想要认真吃透线性代数,刷完《线性代数及其应用》所有练习题就够了。
正片开始!
矩阵和向量积
一直以来矩阵相乘我用的都是np.matmul(x, y)
,今天才发现居然x.dot(y)
也能做这件事,开心。
另外,在一维情况下和矩阵情况下的乘法是不一样的:
用matrix.A
可以快速将mat转为ndarray类型
矩阵特征值与特征向量
对于一个 N ∗ N N*N N∗N满秩方阵,总能有 N N N 个值 λ \lambda λ 和向量 x x x 对,满足:
A x = λ x Ax = \lambda x Ax=λx
这里的 λ \lambda λ 和 x x x 就是特征向量和特征值。如何求?
A x = λ x Ax = \lambda x Ax=λx
( A x − λ x ) = 0 (Ax - \lambda x) = 0 (Ax−λx)=0
由于矩阵满足线性关系,所以这里的 x x x 可以提出来:
( A − λ I ) x = 0 (A - \lambda I)x = 0 (A−λI)x=0
上式表示该方程组仅有 0 解、满秩,换句话说:
d e t ∣ A − λ I ∣ = 0 det|A - \lambda I| = 0 det∣A−λI∣=0
由此可得一个一元 N 次的方程组,并可解得 N 个 λ \lambda λ 实数解。
将其代入 ( A − λ I ) x = 0 (A - \lambda I)x = 0 (A−λI)x=0,可求得最终的特征向量。
其实怎么求特征向量和特征值这些都是小case,问题在于:
- 为什么 N ∗ N N * N N∗N 的满秩方阵,总有特征值 / 特征向量对?
- 什么条件下存在两个相同的特征向量?他们为什么存在?
- 特征值 / 特征向量的意义是什么?
- 非满秩矩阵的特征向量 / 特征值有什么特点?
建议先思考一会(估计也思考不出来啥,这个需要做题 + 总结),解释将在下文给出。
numpy中已经给出了实现:
这里不再进行过多阐述。
矩阵SVD分解
对任意一个 m ∗ n m*n m∗n的矩阵 A A A,都有:
A = ∑ i = 0 r σ i u i v i T A = \sum_{i=0}^{r} \sigma_i u_i v_i^T A=i=0∑r