【问题标题】:Linear regression in an array in pythonpython中数组中的线性回归
【发布时间】:2021-11-24 09:32:57
【问题描述】:

我有一个符号方程的一维 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 的单个值,当在方程式数组中替换时,该值对于第二个值数组中的每个元素的误差最小。

有人可以帮忙吗?

谢谢。

【问题讨论】:

  • 是的,如果您以我可以复制的方式发布您的号码,那应该很容易。
  • 感谢@user2640045
  • 既然你基本上有a / E = b,和E = a / b一样,numpy.linalg.lstsq()可能有用。 (它也在 Scipy 中。)网上有很多关于如何使用它的示例。

标签: python numpy regression linear-regression sympy


【解决方案1】:

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]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 2020-04-17
    • 2017-11-16
    • 2021-07-19
    • 2016-04-14
    • 2012-04-26
    • 2021-10-28
    • 2018-03-11
    相关资源
    最近更新 更多