为什么 SciPy 最小化在最小化误差平方和与均方根误差时返回不同的解?

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

我正在使用 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 之间可能导致定位最小值差异的差异。

Left: Plot of fitted curve using RMSE in objective function. Right: Plot of fitted curve using SSE in objective function.

编辑:

在进一步研究我的最小化解决方案后,当使用 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.        ])
python optimization curve-fitting data-fitting scipy-optimize-minimize
1个回答
0
投票

您的初始猜测非常糟糕。如果 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 的原始值。

© www.soinside.com 2019 - 2024. All rights reserved.