故事起因是我需要安装CVX,因此来记录一下安装过程中遇到的一些困难和总结。
非必要的学术licence的申请
首先是学术licence的申请,但没想到这一步就遇到了很大的问题,申请网站如下https://cvxr.com/cvx/academic/。
没错,bug在于Invalid host ID,这让我非常恼火,我搜索了论坛相关讨论,得出结论这个所谓的 licenses 早就 obsolete了,但是目前很多安装指南的第一步还是让人去申请许可证,误人子弟。
CVX入门:“Hello, World” 程序的学习
好,我们现在已经成功下载了CVX工具包,现在我们来看第一个程序吧。
我们展示传统的Matlab代码和CVX规范如何混合以形成和解决多个优化问题。下面的代码解决了最小化 ∥ A x − b ∥ 2 + γ ∥ x ∥ 1 \|Ax-b\|_2 +\gamma \|x\|_1 ∥Ax−b∥2+γ∥x∥1 的问题,对于对数间隔的(正)值的向量 γ \gamma γ 。这为我们提供了 ∥ A x − b ∥ 2 \|Ax-b\|_2 ∥Ax−b∥2 和 ∥ x ∥ 1 \|x\|_1 ∥x∥1 之间的最佳权衡曲线上的点。下图给出了这条曲线的一个例子。
cvx_quiet(true);
gamma = logspace( -2, 2, 20 );
l2norm = zeros(size(gamma));
l1norm = zeros(size(gamma));
fprintf( 1, ' gamma norm(x,1) norm(A*x-b)\n' );
fprintf( 1, '---------------------------------------\n' );
for k = 1:length(gamma),
fprintf( 1, '%8.4e', gamma(k) );
cvx_begin
variable x(n);
minimize( norm(A*x-b)+gamma(k)*norm(x,1) );
cvx_end
l1norm(k) = norm(x,1);
l2norm(k) = norm(A*x-b);
fprintf( 1, ' %8.4e %8.4e\n', l1norm(k), l2norm(k) );
end
plot( l1norm, l2norm );
xlabel( 'norm(x,1)' );
ylabel( 'norm(A*x-b)' );
grid on
注意这个 A A A 和 b b b 的值我没有明确生成,自己可以定义一个合适的矩阵和向量即可。
丰富的入门学习资料可以参考CVX的 documentation,网址为https://web.cvxr.com/cvx/doc/quickstart.html#least-squares。