UPD:2017.2.26
理解PCA:http://blog.codinglabs.org/articles/pca-tutorial.html
pca是一个借助于matlab的svd函数写起来非常简单,但是理论条条是道的算法。
pca解决的问题常常是将n维数据降至k维,目标是找到向量
u(1),u(2),...,u(k)
使得总的投射误差最小。
这个算法最大的优点是完全无参限制,不需要人为的设定参数或者根据任何经验模型对计算进行干预,最后的结果只与数据相关。同时这也是缺点,如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,可是无法通过参数化的方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
常见的使用错误有:
用pca来进行解决过拟合(减少了特征的数量)。这样做不如尝试归一化来处理。pca只是近似的丢掉一些特征,并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。而归一化处理会考虑到结果变量,不会丢掉重要的数据。
另一个常见的错误是默认地将pca作为学习过程中的一部分。虽然这样做在很多时候有效果,但是还是最好从原有特征开始,只在必要的时候(算法运行过慢,内存占用太多)才考虑采用pca。
Normalization
pca第一步先将特征进行归一化处理。
bsxfun函数可以简化代码。
function [X_norm, mu, sigma] = featureNormalize(X)
mu = mean(X);
X_norm = bsxfun(@minus, X, mu);
sigma = std(X_norm);
X_norm = bsxfun(@rdivide, X_norm, sigma);
end
Singular value decomposition
第二步是计算原特征的协方差矩阵
∑
。
∑=1m∑ni=1(x(i))(x(i))T
第三步时计算协方差矩阵的特征向量,在matlab中,直接调用svd来分解奇异值,[U, S, V] = svd(
∑
)。其中U就是协方差矩阵的特征向量了,是具有与数据之间最小投射误差的方向向量构成的矩阵。我们希望将数据从n维降到k维,只需要从U中选取前k个向量,获得一个n*k的矩阵,表示为
Ureduce
,然后通过如下计算获得新的特征向量:
z(i)=UTreduce∗x(i)
。
function [U, S] = pca(X)
[m, n] = size(X);
U = zeros(n);
S = zeros(n);
sigma = 1 / m * X' * X;
[U, S, V] = svd(sigma);
end
Pca
[X_norm, mu, sigma] = featureNormalize(X);
[U, S] = pca(X_norm);