【发布时间】:2012-05-09 02:12:49
【问题描述】:
我想通过求解优化问题 min||X-XBB'|| 在 Matlab 中找到数据矩阵 X 的主成分,其中范数是 Frobenius 范数,B 是正交矩阵。我想知道是否有人可以告诉我该怎么做。理想情况下,我希望能够使用优化工具箱来做到这一点。我知道如何使用其他方法找到主成分。我的目标是了解如何设置和解决以矩阵为答案的优化问题。我非常感谢任何建议或 cmets。
谢谢! 乔丹
【问题讨论】:
我想通过求解优化问题 min||X-XBB'|| 在 Matlab 中找到数据矩阵 X 的主成分,其中范数是 Frobenius 范数,B 是正交矩阵。我想知道是否有人可以告诉我该怎么做。理想情况下,我希望能够使用优化工具箱来做到这一点。我知道如何使用其他方法找到主成分。我的目标是了解如何设置和解决以矩阵为答案的优化问题。我非常感谢任何建议或 cmets。
谢谢! 乔丹
【问题讨论】:
关于优化的问题在于解决问题有不同的方法,其中一些可能需要大量计算。
鉴于 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
所以在使用这些方法的时候要小心,尽量选择好的起点
【讨论】:
统计工具箱有一个内置函数“princomp”,它执行 PCA。如果你想学习(一般来说,没有优化工具箱)如何创建自己的代码来做 PCA,this site 是一个很好的资源。
由于您特别提到要使用优化工具箱并将其设置为优化问题,因此斯坦福大学有一个非常受信任的第三方软件包 CVX 可以解决优化问题你指的是at this site。
【讨论】:
你有优化工具箱吗?文档非常好,只需尝试其中一个示例: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
【讨论】: