首页 > 编程问答 >如何在for循环中使用curve_fit函数在python中一次性创建多个回归?

如何在for循环中使用curve_fit函数在python中一次性创建多个回归?

时间:2024-07-31 07:48:44浏览次数:17  
标签:python pandas numpy matplotlib curve-fitting

简而言之,我有两个矩阵,一个称为 t,另一个称为 y。每个都有 7 列。假设它们被称为 a、b、c、d、e、f 和 g。我想要的是从 a 对 a、b 对 b、...、g 对 g 这两个矩阵进行回归。

我已经设法使我的算法使用 curve_fit 对一列进行回归一次。但我真正希望的是它能够一次性完成 7 个回归。我想我应该使用 for 循环,但我不知道如何使用。

最后,我想将 k 值保存在一个数组中并绘制该数组以查看趋势。不幸的是,我仍然陷入必须同时创建多个回归的部分。

我认为我的问题与此类似 一次性对 scipy 的 `curve_fit` 进行多次迭代|| |,但我未能适用于我的案例。 , but I am failing to apply to my case.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd

file = ('y.xls')
xl = pd.ExcelFile(file)
t = xl.parse('t')
y = xl.parse('y')

y=y.dropna()
t=t.dropna()

def func(x, A, k, C):
    return A * np.exp(-k * x) + C

for i in np.arange(0,6):
    plt.figure()
    plt.plot(t.iloc[:,[i]], y.iloc[:,[i]])

    popt[i], pcov[i] = curve_fit(func, t.iloc[:,[i]], y.iloc[:,[i]], p0=([0,1,0]))
    plt.plot(t, func(t, *popt), 'r-',
        label='fit: A=%5.2f, k=%5.4f, C=%5.2f' % tuple(popt))

print(popt)

plt.xlabel('t (h)')
plt.ylabel('y')
plt.legend()
plt.show()

几乎完成了!在使用 curve_fit 和循环方面的主要问题是尝试访问 popt pcov 的方式,就好像它们是数组一样,但没有将它们定义为数组。可以通过为的拟合参数和协方差矩阵创建空列表,然后将每次迭代的结果附加到这些列表来解决此问题。

这是如何使用 for 循环对每对列执行此操作的更正代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd

# 从 Excel 文件加载数据
file = ('y.xls')
xl = pd.ExcelFile(file)
t = xl.parse('t')
y = xl.parse('y')

# 删除缺少的值
y = y.dropna()
t = t.dropna()

# 定义拟合函数
def func(x, A, k, C):
    return A * np.exp(-k * x) + C

# 创建空列表来存储拟合参数和协方差矩阵
popt_list = []
pcov_list = []

# 循环遍历每对列
for i in range(t.shape[1]):
    # 从数据框中提取当前列
    t_data = t.iloc[:, i]
    y_data = y.iloc[:, i]

    # 执行曲线拟合
    popt, pcov = curve_fit(func, t_data, y_data, p0=[0, 1, 0])

    # 将拟合参数和协方差矩阵附加到列表中
    popt_list.append(popt)
    pcov_list.append(pcov)

    # 绘制数据和拟合曲线
    plt.figure()
    plt.plot(t_data, y_data, 'b-', label='data')
    plt.plot(t_data, func(t_data, *popt), 'r-', label='fit: A=%.2f, k=%.4f, C=%.2f' % tuple(popt))
    plt.xlabel('t (h)')
    plt.ylabel('y')
    plt.legend()
    plt.title('Column ' + str(i+1))
    plt.show()

# 将拟合参数列表转换为数组
popt_array = np.array(popt_list)

# 打印所有拟合参数
print("Fitted parameters (A, k, C) for each column:")
print(popt_array)

# 访问并绘制 k 值(例如)
k_values = popt_array[:, 1]
plt.figure()
plt.plot(k_values)
plt.xlabel('Column Index')
plt.ylabel('k value')
plt.title('Trend of k values')
plt.show()

此代码将首先循环遍历的数据中的每一列。然后,它将对每对列执行 curve_fit 操作,并将结果 popt pcov 值分别存储在 popt_list pcov_list 中。最后,它将显示包含数据的每个拟合的绘图,并打印所有拟合参数的 popt 数组。然后,可以根据需要访问和使用这些参数,例如,通过绘制 k 值以查看趋势。

标签:python,pandas,numpy,matplotlib,curve-fitting
From: 49594370

相关文章

  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......