1

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

谢谢!乔丹

4

3 回答 3

2

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

由于您特别提到要使用优化工具箱并将其设置为优化问题,因此斯坦福大学有一个非常值得信赖的 3rd-party 软件包,称为CVX,可以解决您所指的优化问题这个网站

于 2012-05-09T03:10:46.237 回答
2

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

鉴于 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

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

于 2012-05-09T16:26:30.420 回答
1

你有优化工具箱吗?文档非常好,只需尝试其中一个示例: 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
于 2012-05-09T06:32:07.080 回答