关闭

pca matlab

标签: matlabpca
385人阅读 评论(0) 收藏 举报
分类:

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

第二步是计算原特征的协方差矩阵
=1mni=1(x(i))(x(i))T
第三步时计算协方差矩阵的特征向量,在matlab中,直接调用svd来分解奇异值,[U, S, V] = svd()。其中U就是协方差矩阵的特征向量了,是具有与数据之间最小投射误差的方向向量构成的矩阵。我们希望将数据从n维降到k维,只需要从U中选取前k个向量,获得一个n*k的矩阵,表示为Ureduce,然后通过如下计算获得新的特征向量:z(i)=UTreducex(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);
0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:164562次
    • 积分:6146
    • 等级:
    • 排名:第4571名
    • 原创:463篇
    • 转载:2篇
    • 译文:0篇
    • 评论:25条