多列传感器数据多项式拟合python脚本
以下是更新后的代码,其中电压作为自变量,距离作为因变量:
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt# 定义要拟合的四次多项式函数
def fit_func(x, a, b, c, d, e):return a * x**4 + b * x**3 + c * x**2 + d * x + e# 读取数据
data = pd.read_excel('d:/psd_model/sensor_data.xlsx')# 提取电压列(作为 x 轴)和距离列(作为 y 轴)
voltages = data.iloc[:, :-1].values.flatten()
distances = data.iloc[:, -1].values# 合并电压和距离列
distances = np.repeat(distances, data.shape[1] - 1)# 去除任何 NaN 值
mask = ~np.isnan(voltages) & ~np.isnan(distances)
voltages = voltages[mask]
distances = distances[mask]# 拟合曲线
popt, pcov = curve_fit(fit_func, voltages, distances)# 计算拟合的距离值
fitted_distances = fit_func(voltages, *popt)# 绘制原始数据和拟合曲线
plt.figure()
plt.scatter(voltages, distances, label='Data', s=10)
plt.plot(voltages, fitted_distances, label='Fit: a=%.3f, b=%.3f, c=%.3f, d=%.3f, e=%.3f' % tuple(popt), color='red')
plt.xlabel('Voltage')
plt.ylabel('Distance (mm)')
plt.legend()
plt.show()# 打印拟合参数
print(f'Fitted curve parameters: a={popt[0]:.3f}, b={popt[1]:.3f}, c={popt[2]:.3f}, d={popt[3]:.3f}, e={popt[4]:.3f}')# 计算和绘制残差
residuals = distances - fitted_distances
plt.figure()
plt.scatter(voltages, residuals, label='Residuals', s=10)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('Voltage')
plt.ylabel('Residuals')
plt.legend()
plt.show()
代码解释
- 数据读取和处理:提取电压列(作为 x 轴)和距离列(作为 y 轴),并合并数据。
- 数据归一化:对电压和距离数据进行标准化,以提高拟合精度。归一化的选择可以根据需要调整。
- 拟合曲线:使用四次多项式对电压和距离数据进行拟合。
- 绘制图形:绘制原始数据和拟合曲线,显示电压与距离的关系。
- 计算和绘制残差:计算拟合的残差并绘制残差图,检查拟合的质量。