首页 > 解决方案 > 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 的单个值,当在方程数组中替换时,它会给我相对于第二个值数组中的每个元素的最小量的错误。

有人可以帮忙吗?

谢谢你。

标签: pythonnumpyregressionlinear-regressionsympy

解决方案


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]

一个简单的数学论证会告诉你,它必须是全局最小值。如果你对它感兴趣,我可以添加它。


推荐阅读