python - 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]
一个简单的数学论证会告诉你,它必须是全局最小值。如果你对它感兴趣,我可以添加它。
推荐阅读
- javascript - 如何根据javascript中数组中的路径遍历嵌套对象?
- sql - 重复日期计算器 SQL
- pandoc - 将 Markdown 文件的单个页面导出为 pdf
- c# - 循环遍历 C# 文本框
- c - 有没有办法将单个 1 和 0 写入 C 中的 .bin 文件?
- rust - 借用 GameMaster (self) 到 GameState
- laravel - 如何使用 laravel 护照和颤振
- javascript - 如何在每个 ng serve 构建后链接 npm 脚本调用?
- java - 如何在java中将List对象转换为字符串
- excel - 如何优化查询选择器的 Excel VBA 编码在脚本中选择修改后的 URL