Python对数曲线拟合曲线弯曲度过大 绘图效果优化方法
问题核心原因
你的拟合参数计算逻辑没有错误,拟合效果看起来差的核心原因是绘图时用了乱序的原始X值绘制拟合线:
原始数据集中的AGE字段是按样本顺序存储的乱序数值,直接传入plt.plot()时,程序会按数组的先后顺序依次连接点,最终得到锯齿状、来回折返的错误连线,而非连续平滑的对数曲线,这和Excel自动排序后绘制的平滑拟合线视觉效果差异极大。
优化调整方案
- 保留原有对数拟合的参数计算逻辑,
np.polyfit(np.log(X), y, 1)得到的斜率、截距结果和Excel计算结果完全一致 - 生成从X最小值到X最大值的升序等间距连续序列作为拟合曲线的X轴输入,保证绘制出的曲线平滑连续
- 补充图表规范元素:坐标轴标签、标题、图例、网格线,调整散点透明度解决点重叠遮挡问题,优化画布尺寸提升清晰度
- 优化文件读取逻辑,仅读取一次Excel文件减少不必要的IO开销
修正后完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据(仅执行一次IO操作) df = pd.read_excel(r'C:\Users\Admin\OneDrive\Desktop\Programming\My Written Codes\Datasets\Boston.xlsx') X = df['AGE'].to_numpy() y = df['TAX'].to_numpy() # 计算对数拟合参数(原有逻辑正确,无需修改) slope, inter = np.polyfit(np.log(X), y, 1) # 核心修正:生成连续升序的X序列用于绘制平滑拟合曲线 x_fit = np.linspace(start=X.min(), stop=X.max(), num=100) y_fit = slope * np.log(x_fit) + inter # 绘制规范图表 plt.figure(figsize=(8, 5), dpi=120) # 散点图加透明度,避免重叠点遮挡 plt.scatter(X, y, c='r', edgecolor='k', alpha=0.6, label='原始样本点') # 绘制平滑拟合线,线宽加粗更清晰 plt.plot(x_fit, y_fit, c='b', linewidth=2, label=f'对数拟合线: y = {slope:.2f}·ln(x) + {inter:.2f}') # 图表标注设置 plt.xlabel('AGE(1940年前建成自有住房占比)', fontsize=10) plt.ylabel('TAX(每万美元房产全值税率)', fontsize=10) plt.title('波士顿房价数据集AGE-TAX维度对数拟合结果', fontsize=12) plt.legend(frameon=True) plt.grid(alpha=0.3, linestyle='--') plt.tight_layout() # 自动调整布局避免标签截断 plt.show()
可选补充校验
如果需要和Excel输出的拟合结果做数值对齐,可以增加以下校验逻辑:
- 提前过滤异常值:如果数据集中存在
AGE<=0的样本,np.log(0)会生成负无穷值干扰拟合,提前用mask = X > 0筛选有效样本即可 - 计算拟合优度R²:新增代码
y_pred = slope * np.log(X) + inter、r_square = 1 - np.sum((y - y_pred)**2) / np.sum((y - y.mean())**2),计算得到的R²值和Excel输出的拟合优度完全一致
内容的提问来源于stack exchange,提问作者Amirreza Soltani
相关产品推荐
相关产品推荐

