【问题标题】:Doing a PCA using an optimization in Matlab在 Matlab 中使用优化进行 PCA
【发布时间】:2012-05-09 02:12:49
【问题描述】:

我想通过求解优化问题 min||X-XBB'|| 在 Matlab 中找到数据矩阵 X 的主成分,其中范数是 Frobenius 范数,B 是正交矩阵。我想知道是否有人可以告诉我该怎么做。理想情况下,我希望能够使用优化工具箱来做到这一点。我知道如何使用其他方法找到主成分。我的目标是了解如何设置和解决以矩阵为答案的优化问题。我非常感谢任何建议或 cmets。

谢谢! 乔丹

【问题讨论】:

    标签: matlab pca


    【解决方案1】:

    关于优化的问题在于解决问题有不同的方法,其中一些可能需要大量计算。

    鉴于 B 的约束,您的解决方案是使用 fmincon。首先为非线性约束创建一个文件:

    function [c,ceq] = nonLinCon(x)
    c = 0;
    ceq = norm((x'*x - eye (size(x))),'fro'); %this checks to see if B is orthonormal.
    

    然后调用例程:

    B = fmincon(@(B) norm(X - X*B*B','fro'),B0,[],[],[],[],[],[],@nonLinCon)
    

    B0 可以很好地猜测答案。

    此外,您需要了解该算法试图找到一个局部最小值,这可能不是您最终想要的解决方案。例如:

    X = randn(1,2)
    fmincon(@(B) norm(X - X*B*B','fro'),rand(2),[],[],[],[],[],[],@nonLinCon)
    ans =
        0.4904    0.8719
        0.8708   -0.4909
    fmincon(@(B) norm(X - X*B*B','fro'),rand(2),[],[],[],[],[],[],@nonLinCon)
    ans =
        0.9864   -0.1646
        0.1646    0.9864
    

    所以在使用这些方法的时候要小心,尽量选择好的起点

    【讨论】:

    • 谢谢@Rasman。我对这个问题的表述有些草率。未知数是矩阵 B,约束条件 B'B = I,要最小化的函数是 f(B) = ||X - XBB'||。所以,它实际上是一个受约束的优化,具有非线性约束。我想知道如何在 Matlab 中设置它。此外,查看最小化例程的文档,我找不到任何关于矩阵响应的提及。哪里是我阅读相关内容的最佳地点?再次感谢!
    • @user765195 好的,那么你需要使用 fmincon。我将编辑我的帖子以反映这一点。
    【解决方案2】:

    统计工具箱有一个内置函数“princomp”,它执行 PCA。如果你想学习(一般来说,没有优化工具箱)如何创建自己的代码来做 PCA,this site 是一个很好的资源。

    由于您特别提到要使用优化工具箱并将其设置为优化问题,因此斯坦福大学有一个非常受信任的第三方软件包 CVX 可以解决优化问题你指的是at this site

    【讨论】:

    • 谢谢@kitchenette。这是非常有用的信息。正如我在问题中提到的,我非常熟悉 princomp 和其他查找 PCA 的标准方法。事实上,我的问题并不是关于 PCA,而是关于如何在 Matlab 中设置和解决某些类型的优化问题。 CVX 包看起来很有前途,但我希望有一些技术含量更低或在优化工具箱中的东西。
    【解决方案3】:

    你有优化工具箱吗?文档非常好,只需尝试其中一个示例:http://www.mathworks.com/help/toolbox/optim/ug/brg0p3g-1.html

    但总的来说优化函数是这样的:

    [OptimizedMatrix, OptimizedObjectiveFunction] = optimize( (@MatrixToOptimize) MyObjectiveFunction(MatrixToOptimize), InitialConditionsMatrix, ...optional constraints and options... );
    

    您必须自己创建 MyObjectiveFunction(),它必须将要优化的矩阵作为输入,并输出一个标量值,指示当前输入矩阵的成本。大多数优化器会尽量减少这个成本。请注意,成本必须是标量。

    fmincon() 是一个很好的起点,一旦你习惯了工具箱,如果可以的话,你应该为你的问题选择更具体的优化算法。

    要优化矩阵而不是向量,请将矩阵重新整形为向量,将此向量传递给您的目标函数,然后将其重新整形为目标函数内的矩阵。

    例如,假设您正在尝试优化 3 x 3 矩阵 M。您已经定义了目标函数MyObjectiveFunction(InputVector)。将 M 作为向量传递:

    MyObjectiveFunction(M(:));
    

    在 MyObjectiveFunction 中,您必须将 M(如有必要)重新整形为矩阵:

      function cost = MyObjectiveFunction(InputVector)
          InputMatrix = reshape(InputVector, [3 3]);
    
          %Code that performs matrix operations on InputMatrix to produce a scalar cost
    
          cost = %some scalar value
      end
    

    【讨论】:

    • 感谢@Dan 的回复。我在文档中的任何地方都找不到对要优化的矩阵的任何引用。它始终是向量或标量。我在哪里可以找到一些很好的参考?再次感谢!
    • 更有可能的是,您可以将矩阵重塑为向量,将其传递给您的目标函数,然后将其重塑为目标函数内的矩阵。那应该对你有用。我将编辑并添加一个示例。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多