Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用局部加权回归预测新数据(黄土/低洼)_Python_Python 3.x_Pandas_Statsmodels - Fatal编程技术网

Python 使用局部加权回归预测新数据(黄土/低洼)

Python 使用局部加权回归预测新数据(黄土/低洼),python,python-3.x,pandas,statsmodels,Python,Python 3.x,Pandas,Statsmodels,如何在python中拟合局部加权回归,以便可以使用它预测新数据 有statsmodels.nonparametric.smoothers_lowess.lowess,但它只返回原始数据集的估计值;因此,它似乎只将拟合和预测放在一起,而不是像我预期的那样单独进行 scikit-learn始终有一个fit方法,该方法允许对象稍后在新数据上使用predict;但是它没有实现lowsslowss在预测方面非常有用(与插值结合使用时)!我认为代码非常简单——如果您有任何问题,请告诉我! 考虑改用内核回归

如何在python中拟合局部加权回归,以便可以使用它预测新数据

statsmodels.nonparametric.smoothers_lowess.lowess
,但它只返回原始数据集的估计值;因此,它似乎只将
拟合
预测
放在一起,而不是像我预期的那样单独进行


scikit-learn
始终有一个
fit
方法,该方法允许对象稍后在新数据上使用
predict
;但是它没有实现
lowss

lowss在预测方面非常有用(与插值结合使用时)!我认为代码非常简单——如果您有任何问题,请告诉我!


考虑改用内核回归

statmodels有一个


如果数据点太多,为什么不使用sk.learn并指定一个三立方加权函数?

我创建了一个名为
moepy
的模块,为Lowss模型(包括拟合/预测)提供类似sklearn的API。这使得可以使用基本的局部回归模型进行预测,而不是使用其他答案中描述的插值方法。下面是一个极简主义的例子

#导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
来自moepy import lowess
#数据生成
x=np.linspace(0,5,num=150)
y=np.sin(x)+(np.random.normal(size=len(x))/10
#模型拟合
lowess_model=lowess.lowess()
lowess_模型拟合(x,y)
#模型预测
x_pred=np.linspace(0,5,26)
y_pred=lowess_模型。预测(x_pred)
#策划
plt.plt(x_pred,y_pred,'--',label='LOWESS',color='k',zorder=3)
plt.散射(x,y,标签='噪声正弦波',颜色='C1',s=5,zorder=1)
plt.图例(frameon=False)


有关如何使用该模型(以及其置信度和预测区间变量)的更详细指南,请参见。

这不是lowess的目的。Lowess用于平滑,而不是predicting@JesseBakker它当然可以用于预测。另请参见。@JesseBakker,lowess用于使用局部加权最小二乘法拟合曲线(与直线相反),这有助于揭示趋势。虽然不是很常用于预测,但它肯定可以用于预测。目前正在审查一种扩展LOWESS插值实现的方法。不过,它不会获取拟合/预测语义,而是使用线性插值。虽然这不是不合理的,但它与“使用lowess预测”并不完全相同。Lowess定义为训练点子集上的加权线性回归。它对新点的预测应该基于该回归的结果,而不是预测训练集中两个附近的点,然后用一条线将它们连接起来。当然,对于密集数据集而言,差别很小。超出范围的点也应使用相应邻域上的加权LR(而不是固定值)进行预测。@max刚刚遇到了一个类似的问题。虽然sklearn没有实现leash,但它有一个RANSAC实现,这在我未经培训的眼里已经足够相似了。希望这对某些人有用:@max这一点也不不不合理,我已经使用类似的方法以非参数方式缩放代谢组学数据一段时间了。我将范围外的点缩放为LOWESS曲线的最大值或最小值,并对其他所有点进行线性插值。在我看来,如果没有足够的点进行适当的线性插值,那么就没有足够的点进行适当的LOWESS曲线。另一个注意事项是,我一直在使用R库来代替Python库。python库在边缘效果方面存在一些我无法解决的问题。一定要爱RPy2@DanielHitchcock
如果没有足够的点进行适当的线性插值,那么在我看来就没有足够的点进行适当的LOWESS曲线
——我赞同你的论点,但这是因为我个人偏爱超简单技术。我当然不会试图说服许多使用LOWESS的数据科学家,他们应该放弃它,转而支持线性插值。我没有降低你的答案,但是我能看到用户怎么会认为它没有回答我原来的问题。但这肯定是一个非常不同的算法(它是不确定的;它对异常值不太敏感,因为它试图删除它们)。@David_R,如果你能更清楚地说明你的意思(实际上展示了你的实现),这个答案会很好。只是一个建议。@benjaminmgross,谢谢你的留言。也许我会在本周晚些时候或本周末抽出时间详细阐述。
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()