简而言之,我有两个矩阵,一个称为 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 值以查看趋势。