least_square 不运行,残差小于变量

问题描述 投票:0回答:1

我正在使用

scipy.optimize.least_square
来尝试最小化函数的残差。

这是代码:

def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
    return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time time0) * stiffness2/eta))

def residual(parameters):

    strain0 = parameters[0]
    eta1 = parameters[1]
    time0 = parameters[2]
    stiffness2 = parameters[3]
    eta = parameters[4]
    strain_fitted = solido_3parameters(time, strain0, eta1, time0, stiffness2, eta)

    RSS = np.sum(np.square(strain - strain_fitted))

    return RSS

initial_params = [1.0, 2, 1.5, 1.0, 1.0]

leastsq(residual, x0=initial_params)

但我收到此错误消息:

TypeError: Improper input: func input vector length N=5 must not exceed func output vector length M=1.

问题可能是什么?我尝试阅读源码,但没有找到这个错误的可能原因。

python scipy least-squares
1个回答
0
投票

您共享的代码的某些部分不起作用。 例如,在你的函数中

def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
    return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time time0) * stiffness2/eta))

sigma0
未定义,并且
np.exp(-(time time0)
不是有效的表达式。

但是既然你收到了错误消息

TypeError: Improper input: func input vector length N=5 must not exceed func output vector length M=1.
,你必须有一个可用的代码。

为此,第一个更正是使用 Scipy,您应该导入

scipy.optimize.leastsq
而不是
scipy.optimize.least_square
,因为您想使用该函数
leastsq()

from scipy.optimize import leastsq

而你得到错误的原因是你传递给

leastsq()
的函数必须返回与参数相同数量(或更多)的点。由于您传递了 5 个参数,因此您必须返回一个包含 5 个或更多数字的数组。

例如,这段代码不会抛出错误:

from scipy.optimize import leastsq
import numpy as np


def solido_3parameters(time, strain0, eta1, time0, stiffness2, eta):
    sigma0 = 0
    return strain0 + (sigma0 / eta1) * (time-time0) + sigma0 / stiffness2 * (1 - np.exp(-(time - time0) * stiffness2/eta))

def residual(parameters):

    strain0 = parameters[0]
    eta1 = parameters[1]
    time0 = parameters[2]
    stiffness2 = parameters[3]
    eta = parameters[4]
    time = 0
    strain_fitted = solido_3parameters(time, strain0, eta1, time0, stiffness2, eta)
    strain = 0
    RSS = np.sum(np.square(strain - strain_fitted))
    
    return [RSS, 0, 0, 0, 0]

initial_params = [1.0, 2, 1.5, 1.0, 1.0]

leastsq_result = leastsq(residual, x0=initial_params)
print(leastsq_result)
© www.soinside.com 2019 - 2024. All rights reserved.