如何解决多项式拟合时“SVD did not converge in Linear Least Squares”报错
报错原因
Excel中的空白单元格会被pandas自动识别为NaN空值,np.polyfit执行最小二乘多项式拟合时要求输入的x、y序列无空值,空值会导致矩阵计算阶段SVD分解失败,触发对应报错。
解决方法
只需要在拟合前对数据做空值清洗即可,有两种常用处理方案:
- 方案1:直接删除
s、c、cm三列中任意一列存在空值的整行数据,适合空值很少、数据量充足的场景 - 方案2:分别提取两组拟合对应的非空配对数据,某一列的空值不会影响另一组拟合的数据量,适合尽量保留有效数据的场景
修改后可运行代码
这里以灵活度更高的方案2为例:
import pandas as pd import numpy as np import matplotlib.pyplot as plt xls = pd.ExcelFile('/UsersAll_My_Files/Projects/output_file/s_energy_lcto.xlsx') name = pd.read_excel(xls, 'energy', skiprows=[0]) newname = name[['s', 'c', 'cm']] # 新增空值清洗逻辑:分别提取两组拟合的有效配对数据 df_c = newname[['s','c']].dropna() p1 = np.polyfit(df_c['s'], df_c['c'], 2) f1 = np.poly1d(p1) df_cm = newname[['s','cm']].dropna() p2 = np.polyfit(df_cm['s'], df_cm['cm'], 2) f2 = np.poly1d(p2) x = np.linspace(-0.055, 0.055, 100) # 绘图也使用清洗后的有效数据 plt.plot(df_c['s'], df_c['c'], 'ro', label="C") plt.plot(df_cm['s'], df_cm['cm'], 'gv', label="Cm") plt.plot(x, f1(x), 'r') plt.plot(x, f2(x), 'g') # 原代码可补充以下两行展示图例和图像 plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Bip
相关产品推荐
相关产品推荐

