如何拟合双定义域分段函数,求解温度与用电量相关参数
分段温度-用电量回归拟合方案
实现逻辑
你提到的这种存在阈值的两段式函数拟合属于带未知断点的分段线性回归,不需要提前预设阈值T0,可以通过专用模型同时拟合得到A、B、C、T0四个参数。
R语言实现(优先推荐)
R中segmented包是专门处理分段回归的工具,实现步骤如下:
- 安装并加载包
install.packages("segmented") library(segmented)
- 拟合模型
假设你的数据集为power_df,温度列名为temp,用电量列名为poweruse:
# 构建基础线性回归模型 base_lm <- lm(poweruse ~ temp, data = power_df) # 拟合带1个断点的分段模型,自动搜索最优T0 seg_fit <- segmented(base_lm, seg.Z = ~ temp, npsi = 1)
- 提取参数
# 查看全量拟合结果,包含各参数的显著性、置信区间 summary(seg_fit) # 提取目标参数 T0 <- seg_fit$psi[1,2] # 温度阈值 C <- seg_fit$coefficients[[1]] # T<T0时的恒定用电量 A <- seg_fit$coefficients[[2]] + seg_fit$coefficients[[3]] # T>T0时的斜率 B <- seg_fit$coefficients[[1]] # T>T0时的截距
- 拟合效果可视化
# 绘制原始散点 plot(power_df$temp, power_df$poweruse, xlab = "室外温度", ylab = "用电量") # 叠加拟合分段线 plot(seg_fit, add = T, col = "red", lwd = 2) # 标注阈值位置 abline(v = T0, lty = 2, col = "blue")
Python实现
可以使用pwlf(Piecewise Linear Fit)库实现:
- 安装依赖
pip install pwlf numpy
- 拟合代码
import pwlf import numpy as np # 输入数据:temp_list为温度序列,power_list为用电量序列 temp_arr = np.array(temp_list) power_arr = np.array(power_list) # 初始化模型并拟合1个断点(两段式) pwlf_model = pwlf.PiecewiseLinFit(temp_arr, power_arr) breaks = pwlf_model.fit(2) # 提取目标参数 T0 = breaks[1] # 温度阈值 C = pwlf_model.intercepts[0] # T<T0时的恒定用电量 A = pwlf_model.slopes[1] # T>T0时的斜率 B = pwlf_model.intercepts[1] # T>T0时的截距
内容的提问来源于stack exchange,提问作者Rob Hanssen
相关产品推荐
相关产品推荐

