You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现数据对数回归与外推绘图问题求助

解决对数趋势线拟合与外推绘图问题

问题核心

基于数据集 x = [1,2,3]、y1 = [802, 1126, 1364]、y2 = [246, 368, 388] 绘制对数趋势线,并完成x范围[4:25]的外推绘图,替代Excel的对数拟合功能。

原代码的问题

  1. 错误引入x=0数据点,导致np.log(x)计算出现无穷大值,直接破坏拟合过程
  2. 使用样条插值(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:05:21