我想通过求解最优问题min || X-XBB'||找到Matlab中数据矩阵X的主成分,其中范数是Frobenius范数,B是标准正交矩阵。我想知道是否有人能告诉我该怎么做。理想情况下,我希望能够使用优化工具箱执行此操作。我知道如何使用其他方法找到主要组件。我的目标是了解如何设置和解决以矩阵为答案的优化问题。我非常感谢任何建议或意见。
谢谢! MJ
答案 0 :(得分:2)
统计工具箱有一个内置函数“princomp”来执行PCA。如果您想学习(通常没有优化工具箱)如何创建自己的代码来执行PCA,this site是一个很好的资源。
由于您特别提到要使用优化工具箱并将其设置为优化问题,因此斯坦福大学有一个非常受信任的第三方软件包CVX可以解决您指的是at this site的优化问题。
答案 1 :(得分: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
所以在使用这些方法时要小心,并尝试选择一个好的起点
答案 2 :(得分: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