Scipy Newton Krylov期待方形矩阵

时间:2017-06-07 13:57:45

标签: python numpy optimization scipy

我正在尝试使用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))

2 个答案:

答案 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