【问题标题】:How to demean the data for PCA如何贬低 PCA 的数据
【发布时间】:2014-02-25 17:41:17
【问题描述】:

我在 Matlab 中有一个 75x60 的数组。我正在尝试做 PCA。我试图通过确保 eig(matrix) 返回的最大特征值返回与 [ud v] = svd(matrix) 中的 d(1)*d(1) 相同的东西来检查我的工作。他们疯了。我能看到的唯一可能出错的是贬低。

这是我处理贬低的方式:

 %v is a 75x60 array
 %rowS is 75
 avgVector= mean(v,1);
 muMatrix = repmat(avgVector,rowS,1);
 v = v-muMatrix;

如果我调用 SVD(v),它将返回与 eig(cov(v)) 截然不同的值,无论 v 是否经历了上述贬低。

【问题讨论】:

    标签: matlab vector mean pca


    【解决方案1】:

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

    v = v - repmat(mean(v, 1), size(v, 1), 1);
    

    是正确的。虽然不会将方法分解为全尺寸矩阵,但内存效率会更高:

    v = bsxfun(@minus, v, mean(v, 1));
    

    还有可能使用

    v = detrend(v, 'constant')
    

    在内部使用之前的代码。


    问题出在其他地方:vsingular valuesv'*v 的特征值的平方根。如果v 是无均值的,那么v'*v(在这种情况下称为“散布矩阵”)与(无偏估计)协方差矩阵cov(v) 相同——高达一个因子 @ 987654330@。如果你使用代码

    [V, D] = eig(cov(v));
    [U, S, V] = svd(bsxfun(@minus, v, mean(v, 1)));
    

    你会发现

    sort(diag(D), 'descend')
    

    diag(S) .^ 2 / (size(x, 1) - 1)
    

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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2015-02-10
      • 2019-01-10
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2019-08-11
      相关资源
      最近更新 更多