矩阵的特征值和特征向量包含了矩阵重要的信息,其中,最大的特征值对应的特征向量包含就矩阵最多的信息,这也是很多数据降维算法的核心思想.矩阵特征值的详细解释可见马同学专栏如何理解矩阵特征值和特征向量.专栏中比较详细地解释了一个事实:现有方阵
H
∈
R
n
×
n
H \in R^{n \times n}
H∈Rn×n,且随机取一个列向量
v
∈
R
n
×
1
v \in R^{n \times 1}
v∈Rn×1,在多次使用
H
H
H左乘
v
v
v之后,得到的结果位于
H
H
H的最大特征值对应的特征向量张成的特征空间内.
power iterations算法也正是基于该思想:若每次使用
H
H
H左乘
v
v
v之后单位化得到的向量
v
′
v'
v′,那么迭代若干次之后可以认为
v
′
v'
v′就是矩阵
H
H
H的最大特征值对应的特征向量.同样,该思想也曾被用于page rank算法中(俗称佩奇排序),详情可见统计学习方法第二版第21章,这里就不过多展开了.下图给出了power iterations算法的伪代码:
该算法实现起来十分简单,而且计算量很小,对比其他降维算法动不动就SVD的步骤,简直是神来之笔,而且该算法只有乘法,完全可微,嵌入神经网络中反向传播简直不要太轻松!最后是算法的python实现,用到了numpy库:
import numpy as np
dim = 5
np.random.seed(0)
data = np.random.rand(dim, dim)
eigenvalue, featurevector = np.linalg.eig(data)
v = np.random.rand(dim, 1)
for i in range(15):
v = np.matmul(data, v)
v = v / np.sqrt(np.sum(v * v))
print((np.expand_dims(featurevector[:, 0], -1) - v).T)