首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何降低PCA的数据质量

如何降低PCA的数据质量
EN

Stack Overflow用户
提问于 2014-02-02 04:19:53
回答 1查看 4.4K关注 0票数 0

我在Matlab中有一个75x60数组。我在试着做PCA。我试图通过确保eig(矩阵)返回的最大特征值与u v=svd(矩阵)中的d(1)*d(1)返回相同的内容来检查我的工作。他们太离谱了。我能看到的唯一可能出错的就是贬低。

下面是我如何处理这种贬低的方法:

代码语言:javascript
运行
复制
 %v is a 75x60 array
 %rowS is 75
 avgVector= mean(v,1);
 muMatrix = repmat(avgVector,rowS,1);
 v = v-muMatrix;

如果我称SVD(v)为SVD(V),它将返回与eig(cov(v))极不相同的值,无论v是否经历了上述的贬低。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-03 19:48:19

如果您的矩阵遵循标准的Matlab惯例,即变量是列,样本是行,那么基本上您的方法,

代码语言:javascript
运行
复制
v = v - repmat(mean(v, 1), size(v, 1), 1);

是对的。不过,如果不将方法放大到一个全尺寸的矩阵,那么内存效率就会更高:

代码语言:javascript
运行
复制
v = bsxfun(@minus, v, mean(v, 1));

也有可能使用

代码语言:javascript
运行
复制
v = detrend(v, 'constant')

在内部使用前面的代码。

问题就在别的地方:奇异值 of vv'*v特征值的平方根。如果v是无均值的,那么v'*v (在本例中称为“散射矩阵”)与(无偏-估计)协方差矩阵cov(v) -直到一个因子size(v, 1) - 1是完全相同的。如果您使用代码

代码语言:javascript
运行
复制
[V, D] = eig(cov(v));
[U, S, V] = svd(bsxfun(@minus, v, mean(v, 1)));

你会发现

代码语言:javascript
运行
复制
sort(diag(D), 'descend')

代码语言:javascript
运行
复制
diag(S) .^ 2 / (size(x, 1) - 1)

与四舍五入的误差相同。额外的sort是必要的,因为eig不能保证有序的特征值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21506994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档