manopt-对称矩阵

manopt-例1

例:我们计算对称矩阵 A∈Rn×n 的主要特征向量,设λ1≥⋯≥λn为其特征值,最大的特征值即优化问题的最优值。
max ⁡ x ∈ R n , x ≠ 0   x T A x x T x \underset{x\in {{R}^{n}},x\ne 0}{\mathop{\max }}\,\frac{{{\text{x}}^{T}}Ax}{{{x}^{T}}x} xRn,x=0maxxTxxTAx

1.数学分析

这个问题也可以转换成
min ⁡ x ∈ R n , ∣ ∣ x ∣ ∣ = 1   - x T A x \underset{x\in {{R}^{n}},||x||=1}{\mathop{\min }}\,\text{-}{{\text{x}}^{T}}Ax xRn,x=1min-xTAx
则这个问题的损失函数和梯度为:
f ( x ) = − x T A x f(x)=-{{\text{x}}^{T}}Ax f(x)=xTAx
f ( x ) = − 2 A x f(x)=-2Ax f(x)=2Ax
要求约束向量x为单位二范数,xx 是球体上的一个点(最好的流形之一)
S n-1 = { x ∈ R n : x x T = 1 } {{S}^{\text{n-1}}}=\{x\in {{R}^{n}}:x{{x}^{T}}=1\} Sn-1={xRn:xxT=1}
另外损失函数在 Sn-1 上是平滑的,在 Sn-1上的x点处在的黎曼梯度是在 x处球体的切向量。它可以通过计算梯度∇f(x)到该切线空间的投影得到,即通过正交投影。 Pro j x u=(I-x x T )u \text{Pro}{{\text{j}}_{\text{x}}}\text{u=(I-x}{{\text{x}}^{T}}\text{)u} Projxu=(I-xxT)u
g r a d   f ( x ) = Pro j x ∇ f ( x ) = − 2 ( I − x x T ) A x grad\text{ }f(x)=\text{Pro}{{\text{j}}_{x}}\nabla f(x)=-2(I-x{{x}^{T}})A\text{x} grad f(x)=Projxf(x)=2(IxxT)Ax
计算为使用正交投影仪从通常的梯度∇f(x)到该切线空间的投影

正交投影:Projectors.pdf (cornell.edu)

2.代码

% 生成随机数据
n = 1000;
A = randn(n);%X = randn(n) 返回由正态分布的随机数组成的 n×n 矩阵
A = .5*(A+A.');%生成对称矩阵
 
% 构造问题
%spherefactory:对优化单位范数向量或矩阵的问题返回一个流形结构。
manifold = spherefactory(n);
%获得流形结构
problem.M = manifold;
 
% 得到损失函数和欧式梯度
problem.cost  = @(x) -x'*(A*x);
problem.egrad = @(x) -2*A*x;      % 注意‘egrad'为欧式梯度
 
%数值上检查梯度一致性
checkgradient(problem);
 
% 求解
%x:损失函数的局部最小值 xcost:x对应的损失值
%info:一个结构数组,包含有关求解器连续迭代的执行信息
%options:包含所有使用的选项及其值的结构:看看你可以参数化的内容
[x, xcost, info, options] = trustregions(problem);
 
% 显示数据
figure;
%半对数图(y 轴有对数刻度)
semilogy([info.iter], [info.gradnorm], '.-');
xlabel('Iteration number');
ylabel('Norm of the gradient of f');

参考:Manopt, tutorial

你可能感兴趣的:(manopt,matlab)