python - 在图形上打印拟合详细信息并绘制多项式拟合
问题描述
2部分问题:通过一堆拼凑在一起的谷歌搜索,我设法将Python中的代码粘合在一起,以获取列表的日志并将其与原始列表进行对比,并应用最佳拟合的线性线(下面的代码,合成数据) .
我将如何在图形本身上打印此线性拟合的详细信息(例如渐变、y 截距、卡方)?
我将如何修改代码以对多项式拟合(例如 x^2 线)执行相同的操作?
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy import exp, loadtxt, pi, sqrt, random, linspace
from lmfit import Model
import glob, os
x=[2,3,5,7,11,13,17,19,23,29,31]
y=np.log10(x)
print(y)
plt.scatter(x, y, label="prime-logs", color="red",
marker="1", s=50)
plt.xlabel('Primes')
plt.ylabel('Log10 Primes')
plt.title('Non-Log Plot of Log Prime v Prime')
plt.legend()
plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)))
plt.show()
解决方案
这是一个解决方案。此处仅显示卡方(作为平方和残差)。请注意,没有梯度下降np.polyfit
之类的问题,因为问题是最小二乘问题,可以直接使用 SVD 伪逆矩阵计算来解决。
使用允许您提取反演的每个步骤的算法(使用梯度下降或任何其他优化器),将允许您在同一图形上显示拟合的每个步骤。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy import exp, loadtxt, pi, sqrt, random, linspace
# from lmfit import Model
import glob, os
x = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
y = np.log10(x)
print(y)
plt.plot(x, y, "1", ms=8, label="prime-logs")
y1, r, *_ = np.polyfit(x, y, 1, full=True)
f1 = np.poly1d(y1)
plt.plot(x, f1(x), label=f"linear ($\chi^2$ = {r[0]:0.2f})")
y2, r, *_ = np.polyfit(x, y, 2, full=True)
f2 = np.poly1d(y2)
plt.plot(x, f2(x), label=f"quadratic ($\chi^2$ = {r[0]:0.2f})")
plt.xlabel("Primes")
plt.ylabel("Log10 Primes")
plt.title("Non-Log Plot of Log Prime v Prime")
plt.legend()
推荐阅读
- python - 如何复制/复制熊猫数据框行
- java - 支持范围和多值的数据结构
- python - 排序以获取第一名的元素列表,第二名的元素列表等
- python - 使用 unicode 升序对列表进行排序,没有循环,没有 sort(),使用递归
- c# - 具有多个类的递归树视图
- python - 如何检测数据集中的相同性或重复数据模式(python)
- angular - Angular - 升级到 v12 后无法访问 Material 主题功能
- android - 我正在创建一个食品订购应用程序。当我切换到暗模式时,应用程序崩溃了
- c - struct数组调用引用迭代问题
- sql - 尝试从 AD 检索描述字段时出错