局部多项式回归
localreg的Python项目详细描述
通过局部多项式回归对噪声数据序列进行平滑(包括黄土/黄土)。
安装
使用pip(首选方法)从PyPI安装:
pip install localreg
或者下载github存储库https://github.com/sigvaldm/localreg.git并运行:
python setup.py install
简介
使用以下函数执行局部多项式回归:
localreg(x, y, x0=None, degree=2, kernel=epanechnikov, width=1, frac=None)
其中x和y分别是要平滑的数据的x和y值。 x0是计算平滑值的x值。默认情况下,这与x相同,但请注意,运行时间与x0的大小成正比,因此,如果您有许多数据点,可能值得您自己指定较小的x0。
局部多项式回归通过将次数为degree的多项式拟合到希望计算平滑值(x0)附近的数据点,然后在x0处计算该多项式来工作。对于degree=0,它减少为加权移动平均值。权重函数或内核kernel用于为x0附近的数据点分配更高的权重。kernel的参数是一个参数的纯函数,因此可以定义自定义内核。以下内核已经实现:
- rectangular
- triangular
- epanechnikov
- biweight
- triweight
- tricube
- gaussian(非紧凑型)
- cosine
- logistic(非压缩)
- sigmoid(非紧凑型)
- silverman(非紧凑型)
使一个内核向边缘逐渐变细,即不是矩形内核,会导致输出平滑。
内核的宽度可以通过参数width进行缩放,该参数实际上是具有紧凑支持的内核宽度的一半。对于非紧支撑的核,如高斯核,它只是一个标度参数,类似于标准差。拥有更宽的内核并包含更多的数据点会降低噪声(方差),但会增加偏差,因为回归无法在比内核窗口窄得多的范围内捕获变量。
对于间隔不均的数据点,具有固定宽度意味着窗口中包含的数据点数量可变,因此噪声/方差也可变。但是,偏差是固定的。使用变化的宽度,使得包含固定数量的数据点,而不是导致恒定的噪声/方差,而是固定的偏差这可以通过指定frac来实现,它将否决width,并指定要包含在内核宽度中的所有数据点的分数。
示例用法
下面的示例展示了几个有趣的功能:
import numpy as np import matplotlib.pyplot as plt from localreg import * np.random.seed(1234) x = np.linspace(1.5, 5, 2000) yf = np.sin(x*x) y = yf + 0.5*np.random.randn(*x.shape) y0 = localreg(x, y, degree=0, kernel=tricube, width=0.3) y1 = localreg(x, y, degree=1, kernel=tricube, width=0.3) y2 = localreg(x, y, degree=2, kernel=tricube, width=0.3) plt.plot(x, y, '+', markersize=0.6, color='gray') plt.plot(x, yf, label='Ground truth ($\sin(x^2)$)') plt.plot(x, y0, label='Moving average') plt.plot(x, y1, label='Local linear regression') plt.plot(x, y2, label='Local quadratic regression') plt.legend() plt.show()
如果边缘附近的数据中有一个斜率,那么简单的移动平均值将无法考虑该斜率,如图所示,因为大多数数据点将位于x0的右侧(或左侧)。局部线性回归(或高阶回归)可以弥补这一点。我们还发现,随着振荡频率的增加,局部线性回归无法跟上,因为与窗口相比,变化变得太小一个较小的窗口会有帮助,但代价是回归过程中会有更多的噪声另一个选择是将度数增加到2。二次回归更适合填谷填山。但是,与核相比,二次多项式的变化太快,也会开始失败。
值得注意的是,更高的阶数还伴随着方差的增加,这可以表现为小的虚假振荡因此,虽然localreg支持任意度数,但高于2的情况并不常见
[Hastie] |
|
[Cleveland] |
|