【发布时间】:2019-01-11 17:24:09
【问题描述】:
我在为 scipy.optimize.minimize 转换无约束问题时遇到了问题。我想运行 L-BFGS 方法。
基本问题如下所示:
分钟|| A - XY||
s.t. X,Y
而 A 是一个给定的矩阵和 X $\in \R^{nxl}$ 和 Y $\in \R^{lxm} 由于 scipy 只接受向量输入,我试图将 XY 解释为一个更大的变量:Z=(X,Y) 其中我已经将 X 和 Y 的列放在一起。
首先我尝试编写函数来转换我的输入向量。对于一个基本示例,它工作得很好(也许是因为矩阵很密集?idk)
这是我的代码:
import numpy as np
from scipy.optimize import minimize
R=np.array(np.arange(12)).reshape(3, 4)
Z0 = np.array(np.random.random(14))
#X=3x2 = 6
#Y=2x4 = 8
def whatineed (Z):
return np.linalg.norm(R - np.dot(Z[:6].reshape(3,2),Z[6:].reshape(2,4)))
A = minimize(fun=whatineed, x0=Z0, method='L-BFGS-B', options={'disp': 1})
#print A
上面只是一个(看似?)工作的虚拟代码。它给了我/一个结果:
x: array([ 1.55308851, -0.50000733, 1.89812395, 1.44382572, 2.24315938, 3.38765876, 0.62668062, 1.23575295, 1.8448253 , 2.45389762, 1.94655245, 1.83844053, 1.73032859, 1.62221667])
如果我用一个大的运行它,它根本不起作用。
RUNNING THE L-BFGS-B CODE
* * *
Machine precision = 2.220D-16
N = 377400 M = 10
This problem is unconstrained.
At X0 0 variables are exactly at the bounds
没有进一步移动。 R 实际上是一个或多或少的稀疏矩阵。但我真的不知道从哪里开始。是我的功能码吗?是R的稀疏性吗?两个都?解决方法是什么?
更新:求解器适用于非常小的尺寸。如果我再大一点,就会出现这个错误:
ABNORMAL_TERMINATION_IN_LNSRCH
Line search cannot locate an adequate point after 20 function
and gradient evaluations. Previous x, f and g restored.
Possible causes: 1 error in function or gradient evaluation;
2 rounding error dominate computation.
Cauchy time 0.000E+00 seconds.
Subspace minimization time 0.000E+00 seconds.
Line search time 0.000E+00 seconds.
Total User time 0.000E+00 seconds.
正如您在用户时间看到的,问题非常小并且停止工作。 以手写方式运行 (L-BFGS) 导致根本不执行任何步骤/下降。
【问题讨论】:
-
第一个问题(没有进展)看起来像进展缓慢/内存问题,因为没有利用黑盒目标中的稀疏性。第二个是由于数值问题,有一个简单的方法:提供符号(或者比方说:不使用数值微分)梯度。**编辑**可以是,尺寸也不起作用吗?你的数字看起来像那样,但通常我希望 scipy 早点打破。
-
我也会先从更合适的 scipy 算法开始,例如optimize.least_squares。
-
XY 只是一个任意的 n x m 矩阵,秩
-
@sascha 也许但是因为我使用排列好的 np.array 作为我的 A,所以这个至少充满了条目。我想稀疏问题稍后会出现,但我还没有那么远。我还问了另一个(非常相似的)问题link 我是否包括了提到的梯度函数。类似的问题更详细。我希望你检查一下。我的问题不是求解器本身。我为自己编写了 L-BFGS,但它也没有运行(它运行得和这个求解器一样好)。它只是停止工作
-
@tch 好的,我进去了。我知道什么是截断的 SVD,但你能更具体地说明一下如何在这里实现它吗? :)
标签: python scipy sparse-matrix