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}
x∈Rn,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
x∈Rn,∣∣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={x∈Rn: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)=Projx∇f(x)=−2(I−xxT)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');