import matplotlib.pyplot as plt
%matplotlib inline
from scipy.interpolate import interp1d
import statsmodels.api as sm
# introduce some floats in our x-values
x = list(range(3, 33)) + [3.2, 6.2]
y = [1,2,1,2,1,1,3,4,5,4,5,6,5,6,7,8,9,10,11,11,12,11,11,10,12,11,11,10,9,8,2,13]
# lowess will return our "smoothed" data with a y value for at every x-value
lowess = sm.nonparametric.lowess(y, x, frac=.3)
# unpack the lowess smoothed points to their values
lowess_x = list(zip(*lowess))[0]
lowess_y = list(zip(*lowess))[1]
# run scipy's interpolation. There is also extrapolation I believe
f = interp1d(lowess_x, lowess_y, bounds_error=False)
xnew = [i/10. for i in range(400)]
# this this generate y values for our xvalues by our interpolator
# it will MISS values outsite of the x window (less than 3, greater than 33)
# There might be a better approach, but you can run a for loop
#and if the value is out of the range, use f(min(lowess_x)) or f(max(lowess_x))
ynew = f(xnew)
plt.plot(x, y, 'o')
plt.plot(lowess_x, lowess_y, '*')
plt.plot(xnew, ynew, '-')
plt.show()
6条答案
按热度按时间ghhkc1vu1#
Lowess在预测方面非常出色(当与插值相结合时)!我认为代码非常简单-如果您有任何问题,请告诉我!Matplolib Figure
字符串
u3r8eeie2#
我创建了一个名为
moepy
的模块,它为LOWESS模型(包括fit/predict)提供了一个类似sklearn的API。这使得预测可以使用底层的局部回归模型,而不是其他答案中描述的插值方法。下面是一个极简示例。字符串
x1c 0d1x的数据
关于如何使用该模型(以及其置信度和预测区间变量)的更详细的指南可以在here中找到。
bxgwgixi3#
考虑使用Kernel Regression。
statmodels有一个实现。
如果你有太多的数据点,为什么不使用sk.learn的radiusNeighborRegression并指定一个三立方加权函数呢?
m4pnthwp4#
查看
scikit-misc
中的loess
类。fitted对象有一个predict方法:字符串
https://has2k1.github.io/scikit-misc/stable/generated/skmisc.loess.loess.html
raogr8fs5#
目前还不清楚是否有一个专门的LOESS对象与单独的拟合/预测方法,就像Scikit-Learn中常见的那样。相比之下,对于神经网络,你可以有一个只存储相对较小的权重集的对象。拟合方法将通过使用非常大的训练数据集来优化“少数”权重。预测方法只需要权重来进行新的预测,而不是整个训练集。
另一方面,基于LOESS和最近邻的预测需要整个训练集来进行新的预测。拟合方法唯一能做的就是将训练集存储在对象中以供以后使用。如果
x
和y
是训练数据,x0
是进行新预测的点,这个面向对象的拟合/预测解决方案看起来像下面这样:字符串
相比之下,在我的localreg库中,我选择了简单:
型
这真的归结为设计选择,因为性能是一样的。拟合/预测方法的一个优点是,你可以像Scikit-Learn中那样拥有一个统一的界面,一个模型可以很容易地被另一个模型交换。拟合/预测方法也鼓励机器学习的方式来思考它,但从这个意义上说,LOESS不是很有效,因为它需要为每个新的预测存储和使用所有的数据。后一种方法更倾向于LOESS的起源,作为一个散点图平滑算法,这是我更喜欢的想法。这也可能有助于解释为什么statsmodel这样做。
7rfyedvj6#
你可以使用这个库:https://github.com/yaniv-shulman/rsklpr。注意它与Lowess非常相似,但不完全相同,因为它在单次迭代中使用鲁棒权重而不是迭代拟合。您也可以使用它来计算置信区间。
透露一下,我是那个图书馆的作者。