Python实现数据对数回归与外推绘图问题求助
解决对数趋势线拟合与外推绘图问题
问题核心
基于数据集 x = [1,2,3]、y1 = [802, 1126, 1364]、y2 = [246, 368, 388] 绘制对数趋势线,并完成x范围[4:25]的外推绘图,替代Excel的对数拟合功能。
原代码的问题
- 错误引入
x=0数据点,导致np.log(x)计算出现无穷大值,直接破坏拟合过程 - 使用样条插值(
splrep/splev)而非对数回归模型,不符合对数趋势线的需求逻辑
解决方案代码
import matplotlib.pyplot as plt import numpy as np # 原始数据集(移除错误的0点) x = [1, 2, 3] y1 = [802, 1126, 1364] y2 = [246, 368, 388] # 对数趋势线拟合:模型为 y = a·ln(x) + b,对ln(x)做线性拟合 ln_x = np.log(x) # 拟合y1的对数趋势线系数 coeffs_y1 = np.polyfit(ln_x, y1, 1) # 返回[斜率a, 截距b] def log_trend_y1(x_val): return coeffs_y1[0] * np.log(x_val) + coeffs_y1[1] # 拟合y2的对数趋势线系数 coeffs_y2 = np.polyfit(ln_x, y2, 1) def log_trend_y2(x_val): return coeffs_y2[0] * np.log(x_val) + coeffs_y2[1] # 生成包含原数据点和外推范围的x序列(1到25,细化采样) x_extrap = np.linspace(1, 25, 100) # 绘图 plt.figure(figsize=(8, 6), dpi=100) # 绘制y1的原始数据与对数趋势线 plt.plot(x, y1, 'ro', label='y1 原始数据', markersize=5) plt.plot(x_extrap, log_trend_y1(x_extrap), 'r-', label='y1 对数趋势线(外推至25)', linewidth=1) # 绘制y2的原始数据与对数趋势线 plt.plot(x, y2, 'bx', label='y2 原始数据', markersize=5) plt.plot(x_extrap, log_trend_y2(x_extrap), 'b--', label='y2 对数趋势线(外推至25)', linewidth=1) # 图表配置 plt.xlabel('X') plt.ylabel('Y') plt.title('对数趋势线拟合与外推') plt.legend() plt.grid(alpha=0.3) plt.xlim(0, 26) plt.show()
关键说明
- 对数趋势线采用数学模型
y = a·ln(x) + b,通过对x取自然对数后做线性拟合得到系数a和b - 若需使用以10为底的常用对数(对应Excel默认对数拟合),只需将代码中
np.log替换为np.log10即可 - 生成的
x_extrap覆盖了1到25的范围,既包含原始数据点,也完成了4到25的外推需求
内容的提问来源于stack exchange,提问作者user12726582
相关产品推荐
相关产品推荐

