我正在尝试使用scipy.optimize.newton_krylov()来解决最小二乘优化问题,即找到x使得(Ax-b)** 2 = 0.我的理解是A必须是mxn m> n,b必须是mx1,x将是nx1。当我尝试运行优化时,出现错误:
ValueError: expected square matrix, but got shape=(40, 6)
据推测,这个错误涉及雅可比的计算而不是我的输入矩阵A?但如果是这样,我如何更改我提供给函数的值以解决此问题?任何建议将不胜感激。
以下代码重现错误:
import numpy as np
from scipy.optimize import newton_krylov
A = np.random.uniform(0, 1, (40,6))
b = np.arange(40)
x0 = np.ones(6)
def F(x):
return (A.dot(x) - b)**2
x = newton_krylov(F, np.ones(6))
答案 0 :(得分:1)
正如docstring of newton_krylov
所解释的,它找到了函数F(x)
的根。函数F
必须接受一维数组,并返回与输入大小相同的一维数组。例如,如果x
的长度为3,则F(x)
必须返回长度为3的数组。在这种情况下,newton_krylov
会尝试解析F(x) = [0, 0, 0]
。
您得到的错误是newton_krylov
尝试使用数值计算F
F
的函数的结果,该函数期望矩阵为方形。您的函数newton_krylov
具有形状为(40,6)的雅可比矩阵,因为输入的长度为6,输出的长度为40。
本身,newton_krylov
不是用于解决最小二乘问题的正确函数。最小二乘问题是最小化问题,而不是根发现问题。 (诸如x
之类的解算器可能用于实现最小化算法,但我假设您对使用现有解决方案感兴趣而不是编写自己的解决方案。)
你说你想解决最小二乘问题,但是你说“即找到x使得(Ax-b)** 2 = 0”。我认为这只是你的描述中的一点点,因为这不是最小二乘问题。最小二乘问题是找到sum((Ax - b)**2)
以使x
最小化。 (一般情况下,不会有x
使平方和等于为零。)
因此,假设您确实希望找到sum((Ax - b)**2)
以使In [54]: from scipy.linalg import lstsq
In [55]: A = np.random.uniform(0, 1, (40,6))
In [56]: b = np.arange(40)
In [57]: x, res, rank, s = lstsq(A, b)
In [58]: x
Out[58]:
array([ 5.07513787, 1.83858547, 18.07818853, 9.28805475,
6.13019155, -0.7045539 ])
最小化,则可以使用Jacobian matrix。
例如:
DataFrame:
IntNames values1 values2
clin1 100 10
clin2|clin3|clin4 200 4
clin6|clin7|clin8|clin9|clin10 240 5
This is what I have written:
newIntNames <- ifelse(myFrame$IntNames=="|",myFrame$IntNames[0],myFrame$IntNames)
答案 1 :(得分:0)
Krylov方法需要第一个参数(在您的情况下为函数F(x))为方阵。
这似乎是一个功课问题,但答案是调整矩阵A使其成为正方形。示例:https://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/optimize.html#kk