Loess 局部权重回归

Loess 局部权重回归

复制代码
写在前面:
?我有个问题,STL是什么...
想知道STL是什么东东,我们不妨先把它拆开看(解剖):
复制代码
关于非参数(补充)
(1)非参数方法通常是通过对数据进行分组或平滑处理来构建模型,依据数据的实际分布和特征进行估计,
而不是基于预设的方程;
(2)常见的非参数回归方法包括核回归(Kernel Regression)、局部加权回归(LOESS)等,
这些方法在处理复杂数据时尤其有用,例如当数据中存在噪音或者未知的非线性关系时;

拆开后,我们对STL的每个地方尝试进行逐步理解,(这篇文章)首先先看"L"(Loess)

1 基本概念

loess(locally weighted regression)是一种用于局部回归分析的非参数方法,它主要是把样本划分成一个个小区间,对区间中的样本进行多项式拟合,不断重复这个过程得到在不同区间的加权回归曲线,最后再把这些回归曲线的中心连在一起合成完整的回归曲线

具体过程如下:

· 决定拟合点的数量和位置

· 以拟合点为中心,确定k个最接近的点

· 通过权重函数计算这k个点的权重

· 通过加权线性回归进行多项式拟合(一次或者二次)

· 对所有拟合点重复以上步骤

2 关于权重的确定

复制代码
确定距离,将距离归一化处理 ---> 降速平滑 ---> 对区间内的散点进行加权线性回归进行拟合

2.1 归一化处理

为了计算某个点 x 0 x_0 x0 的加权值 w i ( x 0 ) w_i(x_0) wi(x0),需要对区间内的所有点到 x 0 x_0 x0 的距离进行标准化处理

w i ( x 0 ) = W ( ∣ x 0 − x i ∣ Δ ( x 0 ) ) w_i(x_0)=W(\frac{∣x_0−x_i∣}{Δ(x_0)}) wi(x0)=W(Δ(x0)∣x0−xi∣)

**W(⋅):是权重函数(例如 tricube 权重函数)。这里的输入是经过标准化的距离,即将绝对距离除以最大距离 Δ( x 0 x_0 x0)Δ( x 0 x_0 x0​)。这样做的目的是使得权重函数的输入范围限制在 [0, 1] 之间,以便能够使用权重函数进行权重计算。

2.2 权重函数 Tricube

权重通常是根据距离来分配的,距离拟合点越近的数据点,其权重就越大,反之则越小。

三次立方权重函数(tricube weight function)是一种常用的权重分配方式,用来在LOESS中为邻近数据点分配权重。其形式为:

W ( u ) = { ( 1 − ∣ u ∣ 3 ) 3 i f ∣ u ∣ ≤ 1 0 o t h e r w i s e W(u)=\left\{ \begin{array}{l l} {{\left(1-|u|^{3}\right)^{3}}} & {{\mathrm{if~}}|u|\leq1} \\ {{\bf0}} & {{\mathrm{otherwise}}} \end{array}\right. W(u)={(1−∣u∣3)30if ∣u∣≤1otherwise

解释:

  • u u u:表示标准化距离,通常计算为 u = d h u=\frac{d}{h} u=hd​,其中 d d d 是目标点与某个邻近点之间的实际距离,而 h h h 是带宽参数(平滑参数),用于控制模型的灵活性和光滑度

  • 权重值

    • 当∣u∣≤1∣u∣≤1时,权重值根据距离计算得到,离目标点越近的点权重越高。
    • 当∣u∣>1∣u∣>1时,权重为0,这意味着超出带宽范围的数据点不会被考虑在内。

指数可以选择二次(B函数)或三次(W函数),三次方对周围权值的降速更快,平滑效果更好,切适用于大多数分布,但增加了残差的方差,一般来说,第一次迭代会更多实用W函数,第二次迭代会选择B函数。

权重函数的形状
  • 形状特征:Tricube 权重函数呈现出一个 (倒)"U" 形,中心最高,边缘降到零。具体来说,权重在0处达到最大值1,然后随着距离的增加迅速减小,最终在距离带宽阈值处降为0。这种设计使得LOESS能有效地利用近邻信息,同时抑制远离点的影响。

参考代码:

python 复制代码
import numpy as np  
import matplotlib.pyplot as plt  
  
# 定义 tricube 权重函数  
def tricube_weight(u):  
    return np.where(np.abs(u) <= 1, (1 - np.abs(u)**3)**3, 0)  
  
# 生成 u 的值  
u = np.linspace(-1.5, 1.5, 400)  
  
# 计算权重  
weights = tricube_weight(u)  
  
# 绘制图形  
plt.figure(figsize=(8, 5))  
plt.plot(u, weights, label='Tricube Weight Function', color='blue')  
plt.title('Tricube Weight Function')  
plt.xlabel('u (standardized distance)')  
plt.ylabel('Weight W(u)')  
plt.axhline(0, color='black', lw=0.5, ls='--')  
plt.axvline(0, color='black', lw=0.5, ls='--')  
plt.xlim(-1.5, 1.5)  
plt.ylim(-0.1, 1.1)  
plt.grid()  
plt.legend()  
plt.show()

参考图像:

2.3 加权线性回归

在 LOESS 中,我们认为距离拟合点更近的数据点对模型的影响应该更大,而远离拟合点的数据点影响较小,所以我们要定义损失函数的时候,应该优先降低附近的点与拟合直线的误差,这也就是我们对普通的最小二乘法要加上权重的原因,实际上这就是加权最小二乘法: J ( a , b ) = 1 N ∑ N i = 1 w i ( y i − a x i − b ) 2 J(a,b)=\frac{1}{N}\underset{{i=1}}{\overset{{N}}{\sum}}w_i(y_i−ax_i−b)^2 J(a,b)=N1i=1∑Nwi(yi−axi−b)2加权线性回归通过动态调整各个数据点的权重,为数据拟合提供了更大的灵活性。这种方法能够有效处理散点数据中由于距离、噪声等因素造成的复杂情况,特别是在局部回归分析中,能够显著提高拟合精度和可解释性

参考资料


  1. https://blog.csdn.net/jesseyule/article/details/95245350?spm=1001.2014.3001.5506
  2. 《智能供应链:预测算法理论与实践》庄晓天等著;
相关推荐
Kapaseker11 小时前
详解 Compose background 的重组陷阱
android·kotlin
黄林晴11 小时前
Kotlin 2.3.20-RC2 来了!JPA 开发者狂喜,6 大更新一文速览
android·kotlin
糖猫猫cc1 天前
Kite:填充处理器
kotlin·orm·kite
Kapaseker1 天前
一杯美式深入理解 data class
android·kotlin
alexhilton4 天前
端侧RAG实战指南
android·kotlin·android jetpack
Kapaseker4 天前
2026年,我们还该不该学编程?
android·kotlin
Kapaseker5 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
Kapaseker6 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish7 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker7 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin