分段线性回归

5. 分段线性回归 (Piecewise Linear Regression)

分段线性回归是一种简单的方式,尤其当数据的弧度变化不大但有多个不同趋势段时。可以将数据分为多个区间,每个区间内拟合一条直线。最终的模型是这些直线的组合。

  • 优点:模型简单、易解释,可以很好地拟合具有轻微弯曲的数据。
  • 缺点:选择分段点可能需要试验,并且需要手动设定,适合趋势变化较明确的情况。

分段线性回归是一种分段拟合的方法,用于捕捉数据中不同区段的线性变化趋势。我们可以使用 pwlf(Piecewise Linear Fit)库实现分段线性回归,并绘制数据散点、回归线以及置信区间。

前置安装

首先,需要安装 pwlf 库:

pip install pwlf

代码示例

import numpy as np
import matplotlib.pyplot as plt
import pwlf
from sklearn.utils import resample# 生成带有分段线性趋势的样本数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.piecewise(x, [x < 4, (x >= 4) & (x < 7), x >= 7], [lambda x: 2*x + 1, lambda x: -1.5*x + 14, lambda x: 0.5*x + 3]) + np.random.normal(0, 1, x.shape)# 初始化分段线性回归模型,假设 3 个分段
model = pwlf.PiecewiseLinFit(x, y)
breakpoints = model.fit(3)# 获取预测值
x_hat = np.linspace(0, 10, 100)
y_hat = model.predict(x_hat)# 使用 Bootstrap 方法计算置信区间
n_bootstraps = 200
y_hat_bootstrap = []for _ in range(n_bootstraps):# 随机采样数据,生成新的拟合模型并预测x_sample, y_sample = resample(x, y)model_bootstrap = pwlf.PiecewiseLinFit(x_sample, y_sample)model_bootstrap.fit(3)y_hat_sample = model_bootstrap.predict(x_hat)y_hat_bootstrap.append(y_hat_sample)# 将预测结果转换为数组
y_hat_bootstrap = np.array(y_hat_bootstrap)# 计算 95% 置信区间
lower_bound = np.percentile(y_hat_bootstrap, 2.5, axis=0)
upper_bound = np.percentile(y_hat_bootstrap, 97.5, axis=0)# 绘制散点图、分段线性回归曲线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='gray', label='Data Points')
plt.plot(x_hat, y_hat, color='blue', label='Piecewise Linear Fit')
plt.fill_between(x_hat, lower_bound, upper_bound, color='lightblue', alpha=0.5, label='95% Confidence Interval')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Piecewise Linear Regression with 95% Confidence Interval')
plt.legend()
plt.show()

代码说明

  1. 数据生成:创建具有分段线性趋势的数据。这里我们假设数据在不同区间内具有不同的线性关系,并在数据中加入噪声。
  2. 分段线性回归模型
    • 使用 pwlf.PiecewiseLinFit 来拟合分段线性回归。
    • 指定分段数为 3,模型将自动找到最佳分段点。
  3. 预测和置信区间
    • 生成预测值 y_hat
    • 使用 Bootstrap 方法生成 200 个不同的采样集,并对每个采样集进行拟合和预测。得到 2.5% 和 97.5% 百分位数作为 95% 的置信区间。
  4. 绘图:绘制数据散点、分段线性回归曲线和置信区间。

输出图形

在这里插入图片描述

运行此代码后会生成以下内容:

  • 灰色散点图:展示原始数据点。
  • 蓝色的分段线性回归线:拟合的分段线性回归结果,显示了不同区间的线性趋势。
  • 淡蓝色的置信区间:通过 Bootstrap 方法生成的 95% 置信区间,反映了模型的置信范围。

更复的情况是,在1-4之间能拟合,在7以上也能拟合另一个线性,但是在4-7之间不存在线性关系,不需要拟合

在这种情况下,可以通过在 pwlf 中设置不同的区间来拟合特定区段的数据,并忽略不需要拟合的区间。我们可以手动筛选出所需区间的数据,例如在区间 x ∈ [ 1 , 4 ] x \in [1, 4] x[1,4] x ∈ [ 7 , 10 ] x \in [7, 10] x[7,10] 进行线性拟合,而对区间 x ∈ [ 4 , 7 ] x \in [4, 7] x[4,7] 不进行拟合。以下代码实现了该思路,并绘制数据、分段线性回归线和置信区间。

代码示例

import numpy as np
import matplotlib.pyplot as plt
import pwlf
from sklearn.utils import resample# 生成带有分段线性趋势的样本数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.piecewise(x, [x < 4, (x >= 4) & (x < 7), x >= 7], [lambda x: 2 * x + 1, lambda x: 0.2 * x**2, lambda x: -0.5 * x + 10]) + np.random.normal(0, 1, x.shape)# 分别提取需要拟合的两个区间的数据
mask1 = (x >= 1) & (x <= 4)
mask2 = (x >= 7) & (x <= 10)
x_segmented = np.concatenate([x[mask1], x[mask2]])
y_segmented = np.concatenate([y[mask1], y[mask2]])# 使用 pwlf 进行分段线性拟合
model = pwlf.PiecewiseLinFit(x_segmented, y_segmented)
breakpoints = model.fit(2)  # 设置两个分段# 预测拟合的 y 值
x_hat1 = np.linspace(1, 4, 50)
x_hat2 = np.linspace(7, 10, 50)
y_hat1 = model.predict(x_hat1)
y_hat2 = model.predict(x_hat2)# 使用 Bootstrap 方法计算置信区间
n_bootstraps = 200
y_hat1_bootstrap = []
y_hat2_bootstrap = []for _ in range(n_bootstraps):# 随机采样数据集x_sample, y_sample = resample(x_segmented, y_segmented)model_bootstrap = pwlf.PiecewiseLinFit(x_sample, y_sample)model_bootstrap.fit(2)y_hat1_sample = model_bootstrap.predict(x_hat1)y_hat2_sample = model_bootstrap.predict(x_hat2)y_hat1_bootstrap.append(y_hat1_sample)y_hat2_bootstrap.append(y_hat2_sample)# 转换为数组并计算 95% 置信区间
y_hat1_bootstrap = np.array(y_hat1_bootstrap)
y_hat2_bootstrap = np.array(y_hat2_bootstrap)
lower_bound1 = np.percentile(y_hat1_bootstrap, 2.5, axis=0)
upper_bound1 = np.percentile(y_hat1_bootstrap, 97.5, axis=0)
lower_bound2 = np.percentile(y_hat2_bootstrap, 2.5, axis=0)
upper_bound2 = np.percentile(y_hat2_bootstrap, 97.5, axis=0)# 绘制散点图、分段线性回归线和置信区间
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='gray', label='Data Points')
plt.plot(x_hat1, y_hat1, color='blue', label='Segmented Linear Fit (1-4)')
plt.plot(x_hat2, y_hat2, color='red', label='Segmented Linear Fit (7-10)')
plt.fill_between(x_hat1, lower_bound1, upper_bound1, color='lightblue', alpha=0.5)
plt.fill_between(x_hat2, lower_bound2, upper_bound2, color='lightcoral', alpha=0.5)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Piecewise Linear Regression with Non-linear Segment Omission')
plt.legend()
plt.show()

代码说明

  1. 数据生成:生成包含不同区间的分段数据,其中区间 x ∈ [ 1 , 4 ] x \in [1, 4] x[1,4] x ∈ [ 7 , 10 ] x \in [7, 10] x[7,10] 为线性趋势,而在 x ∈ [ 4 , 7 ] x \in [4, 7] x[4,7] 之间存在非线性关系。
  2. 筛选区间:使用布尔掩码 (mask1mask2) 筛选出需要拟合的线性区间的数据,忽略不需要拟合的中间区间。
  3. 分段线性拟合:使用 pwlf 库对所选区间的数据进行分段线性回归。
  4. 置信区间计算:对两个拟合区间分别使用 Bootstrap 方法,生成 200 组不同的采样集,计算每个区间的 95% 置信区间。
  5. 绘图:绘制原始数据散点、两个区间的分段线性回归线及其置信区间。

输出图形

在这里插入图片描述

运行代码后将得到以下内容:

  • 灰色散点图:展示了所有原始数据点。
  • 蓝色和红色的分段线性回归线:分别显示在区间 x ∈ [ 1 , 4 ] x \in [1, 4] x[1,4] x ∈ [ 7 , 10 ] x \in [7, 10] x[7,10] 处的线性拟合。
  • 置信区间:通过 Bootstrap 方法生成的 95% 置信区间,分别用淡蓝色和淡红色填充。

更复的情况是,4-7之间存在一种线性关系,但完全和1-4的曲线和7以后的曲线连接不起来,这样就是3段完全分开的情况

在这种情况下,我们可以使用分段线性回归来处理三段独立的线性关系,并在每一段之间没有连接。这里是如何实现的:

  1. 分段设置:我们需要在 x ∈ [ 1 , 4 ] x \in [1, 4] x[1,4] x ∈ [ 4 , 7 ] x \in [4, 7] x[4,7] x ∈ [ 7 , 10 ] x \in [7, 10] x[7,10] 三个区间内分别进行线性拟合。
  2. 数据生成:我们将创建三段数据,确保每段的线性关系不连接。

下面是一个完整的代码示例,展示如何实现这个分段线性回归并绘制结果:

代码示例

import numpy as np
import matplotlib.pyplot as plt
import pwlf
from sklearn.utils import resample# 生成带有完全独立的三段线性趋势的样本数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.piecewise(x, [x < 4, (x >= 4) & (x < 7), x >= 7], [lambda x: 2*x + 1 + np.random.normal(0, 0.5, x.shape),   # 第一段lambda x: 3*x - 12 + np.random.normal(0, 0.5, x.shape),  # 第二段lambda x: -1.5*x + 20 + np.random.normal(0, 0.5, x.shape)  # 第三段])# 选取需要拟合的区间的数据
mask1 = (x >= 1) & (x <= 4)
mask2 = (x > 4) & (x < 7)
mask3 = (x >= 7) & (x <= 10)
x_segmented = np.concatenate([x[mask1], x[mask2], x[mask3]])
y_segmented = np.concatenate([y[mask1], y[mask2], y[mask3]])# 使用 pwlf 进行分段线性拟合,假设 3 个分段
model = pwlf.PiecewiseLinFit(x_segmented, y_segmented)
breakpoints = model.fit(3)  # 设置三个分段# 预测拟合的 y 值
x_hat1 = np.linspace(1, 4, 50)
x_hat2 = np.linspace(4, 7, 50)
x_hat3 = np.linspace(7, 10, 50)
y_hat1 = model.predict(x_hat1)
y_hat2 = model.predict(x_hat2)
y_hat3 = model.predict(x_hat3)# 使用 Bootstrap 方法计算置信区间
n_bootstraps = 200
y_hat1_bootstrap = []
y_hat2_bootstrap = []
y_hat3_bootstrap = []for _ in range(n_bootstraps):# 随机采样数据集x_sample, y_sample = resample(x_segmented, y_segmented)model_bootstrap = pwlf.PiecewiseLinFit(x_sample, y_sample)model_bootstrap.fit(3)y_hat1_sample = model_bootstrap.predict(x_hat1)y_hat2_sample = model_bootstrap.predict(x_hat2)y_hat3_sample = model_bootstrap.predict(x_hat3)y_hat1_bootstrap.append(y_hat1_sample)y_hat2_bootstrap.append(y_hat2_sample)y_hat3_bootstrap.append(y_hat3_sample)# 转换为数组并计算 95% 置信区间
y_hat1_bootstrap = np.array(y_hat1_bootstrap)
y_hat2_bootstrap = np.array(y_hat2_bootstrap)
y_hat3_bootstrap = np.array(y_hat3_bootstrap)
lower_bound1 = np.percentile(y_hat1_bootstrap, 2.5, axis=0)
upper_bound1 = np.percentile(y_hat1_bootstrap, 97.5, axis=0)
lower_bound2 = np.percentile(y_hat2_bootstrap, 2.5, axis=0)
upper_bound2 = np.percentile(y_hat2_bootstrap, 97.5, axis=0)
lower_bound3 = np.percentile(y_hat3_bootstrap, 2.5, axis=0)
upper_bound3 = np.percentile(y_hat3_bootstrap, 97.5, axis=0)# 绘制散点图、分段线性回归线和置信区间
plt.figure(figsize=(12, 8))
plt.scatter(x, y, color='gray', label='Data Points', alpha=0.5)
plt.plot(x_hat1, y_hat1, color='blue', label='Segmented Linear Fit (1-4)')
plt.plot(x_hat2, y_hat2, color='green', label='Segmented Linear Fit (4-7)')
plt.plot(x_hat3, y_hat3, color='red', label='Segmented Linear Fit (7-10)')
plt.fill_between(x_hat1, lower_bound1, upper_bound1, color='lightblue', alpha=0.5, label='95% CI (1-4)')
plt.fill_between(x_hat2, lower_bound2, upper_bound2, color='lightgreen', alpha=0.5, label='95% CI (4-7)')
plt.fill_between(x_hat3, lower_bound3, upper_bound3, color='lightcoral', alpha=0.5, label='95% CI (7-10)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Piecewise Linear Regression with Independent Segments')
plt.legend()
plt.grid()
plt.show()

代码说明

  1. 数据生成:使用 np.piecewise 生成具有三段线性关系的数据。每一段的线性关系都包含一定的随机噪声,确保数据的真实性。
    • 第一段 ( x < 4 x < 4 x<4):线性方程 y = 2 x + 1 y = 2x + 1 y=2x+1
    • 第二段 ( 4 ≤ x < 7 4 \leq x < 7 4x<7):线性方程 y = 3 x − 12 y = 3x - 12 y=3x12
    • 第三段 ( x ≥ 7 x \geq 7 x7):线性方程 y = − 1.5 x + 20 y = -1.5x + 20 y=1.5x+20
  2. 数据筛选:将每个线性区间的数据提取出来以进行分段线性拟合。
  3. 分段线性拟合:使用 pwlf 库进行三段线性拟合。
  4. 预测和置信区间计算:分别为每段的预测值计算 Bootstrap 方法下的置信区间。
  5. 绘图:绘制散点、每段的拟合线和对应的置信区间。

输出图形

在这里插入图片描述

运行代码后将生成以下内容:

  • 灰色散点图:展示所有原始数据点。
  • 蓝色、绿色和红色的分段线性回归线:分别显示 x ∈ [ 1 , 4 ] x \in [1, 4] x[1,4] x ∈ [ 4 , 7 ] x \in [4, 7] x[4,7] x ∈ [ 7 , 10 ] x \in [7, 10] x[7,10] 的线性拟合。
  • 置信区间:通过 Bootstrap 方法生成的 95% 置信区间,分别用不同颜色的填充区域显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git下载-连接码云-保姆级教学(连接Gitee失败的解决)

Git介绍 码云连接 一、Git介绍 二、Git的工作机制 下载链接&#xff1a;Git - 下载软件包 三、使用步骤 创建一个wss的文件夹&#xff0c;作为‘工作空间’ 四、连接码云账号 五、连接Gitee失败的解决方法 一、Git介绍 Git是一个免费的、开源的分布式版本控制…

网络工程师的瑞士军刀:深度解析20+常用工具

文章目录 网络工程师的瑞士军刀&#xff1a;深度解析20常用工具一、网络诊断与分析工具1.1 Wireshark1.2 Tcpdump1.3 Ping工具1.4 Tracert&#xff08;Windows&#xff09;/Traceroute&#xff08;Linux&#xff09;1.5 Nslookup 二、网络管理工具2.1 SNMP&#xff08;Simple N…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30目录1. Step Guided Reasoning: Improving Mathematical Reasoning using Guidance Generation and Step Reasoning摘要研究背…

【再谈设计模式】原型模式~复制的魔法师

一、引言 在软件工程、软件开发中&#xff0c;创建对象的过程常常涉及复杂的初始化和配置。在某些情况下&#xff0c;直接复制现有对象比从头开始创建新对象更为高效。原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;允许我们通过复制现有…

【运动的&足球】足球运动员球守门员裁判检测系统源码&数据集全套:改进yolo11-DBBNCSPELAN

改进yolo11-FocalModulation等200全套创新点大全&#xff1a;足球运动员球守门员裁判检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示…

yocto中一些主要可被改写的函数

以下是 Yocto 中一些主要的可被改写的函数&#xff1a; 1. 源代码获取与准备阶段 do_fetch&#xff1a;从指定位置获取源代码。可用于自定义获取源代码的方式、处理认证或对获取的源进行预处理。do_unpack&#xff1a;解压获取到的源代码包。如果解压格式特殊或解压后需额外处…

React 组件生命周期与 Hooks 简明指南

文章目录 一、类组件的生命周期方法1. 挂载阶段2. 更新阶段3. 卸载阶段 二、函数组件中的 Hooks1. useState2. useEffect3. useContext4. useReducer 结论 好的&#xff0c;我们来详细讲解一下 React 类组件的生命周期方法和函数组件中的钩子&#xff08;hooks&#xff09;。 …

数据库连接池实现

目录 前提&#xff1a;如果我要操作多个表&#xff0c;那么就会产生冗余的JDBC步骤&#xff0c;另一个弊端就是每次都需要数据库连接对象&#xff08;Connection&#xff09;&#xff0c;获取效率低下&#xff0c;每次使用时都需要先进行连接 数据库连接池的特点&#xff1a; …

软件测试基础三(前端知识)

前端基础 1. HTML&#xff08;超文本标记语言&#xff09; 1.1. 基本概念 定义&#xff1a;HTML 是用来描述网页的一种语言&#xff0c;指的是超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;。它不是编程语言&#xff0c;而是一种标记语言&#xff0c;由…

优化用于传感应用的衬底集成波导技术

ANSYS HFSS 是一款功能强大的电磁仿真软件&#xff0c;支持为微流体生物传感器应用设计和分析衬底集成波导 &#xff08;SIW&#xff09; 技术。它为快速设计优化、材料选择、系统集成和虚拟原型制作提供了一个强大的平台。借助 ANSYS HFSS&#xff0c;研究人员和工程师可以高效…

Linux 开机自动挂载硬盘

在日常使用 Linux 系统的过程中&#xff0c;我们可能需要挂载一些机械硬盘或者移动硬盘来存储数据。手动挂载虽然简单&#xff0c;但每次重启后都需要重新操作&#xff0c;未免有些繁琐。那么&#xff0c;如何让硬盘在开机时自动挂载呢&#xff1f;本篇博客将详细介绍如何通过配…

[项目] C++基于多设计模式下的同步异步日志系统

[项目] C基于多设计模式下的同步&异步日志系统 文章目录 [项目] C基于多设计模式下的同步&异步日志系统日志系统1、项目介绍2、开发环境3、核心技术4、日志系统介绍4.1 日志系统的价值4.2 日志系统技术实现4.2.1 同步写日志4.2.2 异步写日志 5、相关技术知识5.1 不定参…

[论文阅读] | 智能体长期记忆

更新记录&#xff1a; 2024.11.2 人大高瓴长期记忆综述 文章目录 人大高瓴长期记忆综述智能体与环境交互记忆的来源/形式/操作来源&#xff1a;(1)当前任务历史信息 (2)其他任务的信息 (3)外部知识形式&#xff1a;如何表达记忆的内容&#xff0c;通过(1)文本 (2)参数(训练到模…

Rust 力扣 - 59. 螺旋矩阵 II

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 使用一个全局变量current记录当前遍历到的元素的值 我们只需要一圈一圈的从外向内遍历矩阵&#xff0c;每一圈遍历顺序为上边、右边、下边、左边&#xff0c;每遍历完一个元素后current 我们需要注意的是如果上…

AppInventor2能否用网络摄像头画面作为屏幕的背景?

// 视频是否可以作为背景&#xff1f; // 有会员提问&#xff1a;能否用网络摄像头的实时画面作为屏幕的背景&#xff1f;就跟这个一样背景全覆盖&#xff1a; 摄像头画面是一个在线的网站链接视频流。 // 原先思路 // 1、目前原生组件无法直接实现这个功能&#xff0c;屏幕…

国产操作系统卖疯了!最营收7.84亿,最低1.5亿

最近看各种报道&#xff0c;似乎国产化有提速的绩效&#xff0c;那么既然如此&#xff0c;各个国产操作系统厂商是不是都起飞了呢&#xff1f; 周末闲暇之余&#xff0c;我们来看看各家的营收表现。 银河麒麟2024年1-9月一共卖了多少钱&#xff1f; 前几天中国软件发布了202…

CDN加速实战:使用七牛云CDN加速阿里云OSS资源访问

今天是双11搞活动,在阿里云1元注册了个域名,想着在学CDN,想使用CDN做个加速项目,但是阿里的要收费,上网查了下七牛云的不收费,想着将七牛云的CDN结合阿里的DNS做个访问加速,刚好看到了阿里的一个文章,照着改了改,实践成功了。 阿里文章:使用CDN加速OSS资源访问_对象…

嵌入式学习——IIC协议

IIC&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信协议&#xff0c;由飞利浦公司于1980年代提出。它允许多个从设备通过两条线&#xff08;SDA和SCL&#xff09;与一个或多个主设备进行通信。IIC协议是多主、多从的&#xff0c;适合在短距离内的设备间通信。…

qt QStatusBar详解

1、概述 QStatusBar是Qt框架提供的一个小部件&#xff0c;用于在应用程序窗口底部显示状态信息。它可以显示一些固定的文本和图标&#xff0c;并且可以通过API动态更新显示内容。QStatusBar通常是一个水平的窗口部件&#xff0c;能够显示多行文本内容&#xff0c;非常适合用于…

大型语言模型的运行成本分析

大型语言模型 (LLM) 一直处于生成式 AI 革命的前沿&#xff0c;尤其是自 ChatGPT 出现以来。然而&#xff0c;它们的全部潜力尚未得到释放&#xff0c;而一个重大障碍是成本。将 LLM 纳入应用程序的费用范围从按需用例的几美分到在云环境中托管单个 LLM 实例的每月 20,000 美元…