我正在使用 scipy.optimize.minimize 将曲线拟合到数据。为此,我定义了一个目标函数,它返回平方误差之和或均方根误差,具体取决于我指定的输出。我的信念是,该指标不应对所定位的最小值产生重大影响,因为 RMSE 应导致与 SSE 相同的最小值的缩放版本,但事实并非如此(请参阅附图)。为了确保最小值的差异不是最小化方法的结果,我手动将最小化方法定义为 BFGS(最小化函数的三个默认值之一)。应该注意的是,当我使用 SSE 作为目标函数指标时,我收到三个运行时警告,粘贴在这里:
C:\Users\Admin\AppData\Local\Temp\ipykernel_33104:201149.py:23:RuntimeWarning:广场遇到溢出 SSE = np.sum(np.abs(y - y_pred)**2)
C:\ Users \ Admin \ AppData \ Roaming \ Python \ Python39 \ site-packages \ scipy \ optimize_numdiff.py:576:RuntimeWarning:减法中遇到无效值 df = fun(x) - f0
C:\Users\Admin\AppData\Local\Temp\ipykernel_33104:201149.py:23:RuntimeWarning:广场遇到溢出 SSE = np.sum(np.abs(y - y_pred)**2)
下面是我的代码示例。
import numpy as np
from scipy.optimize import minimize
# Generate data
A = -6.899 # Parameter 1 (scale)
B = 0.0221 # Parameter 2 (concavity)
C = 9.909 # Parameter 3 (intercept)
x = np.linspace(0, 100, 101) # A bunch of evenly spaced points
y = A*np.exp(B*x) + C
# Function to calculate SSE or RMSE between function and data
def loss_func(parameters, x, y):
A, B, C = parameters
y_pred = A*np.exp(B*x) + C
SSE = np.sum(np.abs(y - y_pred)**2)
RMSE = np.sqrt(SSE / len(y))
return RMSE # Change this to SSE or RMSE as desired
guess = [1, 1, 1]
# Optimize the function
sol = minimize(loss_func, guess, args=(x, y), method = 'BFGS', bounds=None, constraints=None)
print("Optimized parameters:", sol.x)
有谁知道为什么我观察到调整参数的差异,导致我的目标函数根据应用的指标达到最小值?寻找可能解释我可能犯的任何错误的答案、scipy.optimize.minimize 中的细微差别,或者 SSE 和 RMSE 之间可能导致定位最小值差异的差异。
在进一步研究我的最小化解决方案后,当使用 SSE 作为我的目标函数度量时,我观察到以下情况,表明在这种情况下根本没有达到收敛。然而,使用 RMSE 作为我的目标函数指标也会导致“成功:错误”消息。现在我的问题是,为什么我没有达到成功的解决方案,为什么使用 RMSE 仍然提供比使用 SSE 更接近目标的结果?
fun: 54279.23221060659
hess_inv: array([[ 9.99899697e-01, -1.00146569e-02, 2.07889631e-88],
[-1.00146569e-02, 1.00303413e-04, 2.07564554e-86],
[ 2.07889631e-88, 2.07564554e-86, 1.00000000e+00]])
jac: array([ 1668.19189453, 117747.58496094, 3464.14257812])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 34
nit: 1
njev: 6
status: 2
success: False
x: array([ 0.98988469, -0.00994935, 1. ])
您的初始猜测非常糟糕。如果 A=B=C=1,那么对于 x=100,您预测的 y 值为 exp(100)+1。我的计算器根本不喜欢这样。
对于相同的 x 值,您将与数据值 -6.899.exp(2.21)+9.909 进行比较,即 -52.98
然后你就可以计算这个巨大差异的平方。
从初始猜测 [0,0,0] 开始,两种方法都会重现 A、B、C 的原始值。