python 数组中的线性回归

Linear regression in an array in python

我有一个符号方程式的一维 numpy 数组和一个值的一维 numpy 数组,如下所示:

import numpy as np
import sympy as sp
E = sp.Symbol('E')

values = np.array([0.0, 0.0001, 0.0001, 0.0002, 0.0003, 0.0004, 0.0006, 0.0007, 0.0009, 0.0011, 0.0013, 0.0015, 0.0017, 0.0019, 0.0021, 0.0024, 0.0026, 0.0028, 0.0031, 0.0033, 0.0036, 0.0038, 0.0041, 0.0043, 0.0046])
equations = np.array([27405854.8989427/E, 106962058.905272/E, 234787976.631598/E, 407151513.555005/E, 620469116.017057/E, 871305771.223787/E, 1156375007.24571/E, 1472538893.01782/E, 1816808038.33958/E, 2186341593.87493/E, 2578447251.15228/E, 2990581242.5645/E, 3420348341.36898/E, 3865501861.68755/E, 4323943658.50655/E, 4793724127.67675/E, 5273042205.91346/E, 5760245370.79641/E, 6253829640.76983/E, 6752439575.14242/E, 7254868274.08736/E, 7760057378.64231/E, 8267097070.70941/E, 8775226073.05526/E, 9283831649.31095/E])

我试图找到一个单一的 E 值,当在方程组中替换时,该值将使我对第二个值数组中的每个元素的误差最小。

有人可以帮忙吗?

谢谢。

Scipy 提供了一种最小化标量函数的方法。所以我们只写一个错误函数,让它完成剩下的工作。

values = np.array([0.0, 0.0001, 0.0001, 0.0002, 0.0003, 0.0004, 0.0006, 0.0007, 0.0009, 0.0011, 0.0013, 0.0015, 0.0017, 0.0019, 0.0021, 0.0024, 0.0026, 0.0028, 0.0031, 0.0033, 0.0036, 0.0038, 0.0041, 0.0043, 0.0046])
equations = np.array([2.74058549e+07, 1.06962059e+08, 2.34787977e+08, 4.07151514e+08,
       6.20469116e+08, 8.71305771e+08, 1.15637501e+09, 1.47253889e+09,
       1.81680804e+09, 2.18634159e+09, 2.57844725e+09, 2.99058124e+09,
       3.42034834e+09, 3.86550186e+09, 4.32394366e+09, 4.79372413e+09,
       5.27304221e+09, 5.76024537e+09, 6.25382964e+09, 6.75243958e+09,
       7.25486827e+09, 7.76005738e+09, 8.26709707e+09, 8.77522607e+09,
       9.28383165e+09])

def error(E):
    return np.mean(np.abs(equations/(np.abs(E)+10**(-20))-values))

minimize_scalar(error)

请注意,我编写的函数是为了避免被零除。相关值应该非常大,因此 10**-20 不会产生影响。

它给你 x: 2018224283062.8733

顺便说一句。如果您对均方误差而不是平均绝对误差感到满意。 (除了绝对值平方保持可微分之外。)你也可以用 sympy 来做。

import numpy as np
import sympy as sp
E = sp.Symbol('E')

values = np.array([0.0, 0.0001, 0.0001, 0.0002, 0.0003, 0.0004, 0.0006, 0.0007, 0.0009, 0.0011, 0.0013, 0.0015, 0.0017, 0.0019, 0.0021, 0.0024, 0.0026, 0.0028, 0.0031, 0.0033, 0.0036, 0.0038, 0.0041, 0.0043, 0.0046])
equations = np.array([27405854.8989427/E, 106962058.905272/E, 234787976.631598/E, 407151513.555005/E, 620469116.017057/E, 871305771.223787/E, 1156375007.24571/E, 1472538893.01782/E, 1816808038.33958/E, 2186341593.87493/E, 2578447251.15228/E, 2990581242.5645/E, 3420348341.36898/E, 3865501861.68755/E, 4323943658.50655/E, 4793724127.67675/E, 5273042205.91346/E, 5760245370.79641/E, 6253829640.76983/E, 6752439575.14242/E, 7254868274.08736/E, 7760057378.64231/E, 8267097070.70941/E, 8775226073.05526/E, 9283831649.31095/E])

error = np.mean((equations-values)**2)
sp.solve(error.diff(E))

给你

[2027858708334.55]

一个简单的数学论证就会告诉你这一定是全局最小值。如果你对它感兴趣我可以补充。