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]
一个简单的数学论证就会告诉你这一定是全局最小值。如果你对它感兴趣我可以补充。
我有一个符号方程式的一维 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]
一个简单的数学论证就会告诉你这一定是全局最小值。如果你对它感兴趣我可以补充。