是否有用于计算“运行中”线性或逻辑回归参数的算法?


32

http://www.johndcook.com/standard_deviation.html上的论文“准确计算运行方差” 显示了如何计算运行均值,方差和标准差。

在提供每条新训练记录时,是否存在可以类似地“动态”更新线性或逻辑回归模型参数的算法?


1
有了庞大的训练集或连续的数据输入流,您就可以使用诸如迭代梯度下降之类的迭代算法,并在继续前进时分批抓取输入。那是你在问什么吗?
andreister

Answers:


20

的线性回归系数是和。y=ax+ba=cov(x,y)/var(x)b=mean(y)amean(x)

因此,您真正需要的只是一种增量方法来计算。根据该值和的方差以及和的均值,可以计算参数和。正如您将在下面的伪代码中看到的那样,增量计算与增量计算非常相似。这并不奇怪,因为。cov(x,y)xyxabcov(x,y)var(x)var(x)=cov(x,x)

这是您可能正在寻找的伪代码:

init(): meanX = 0, meanY = 0, varX = 0, covXY = 0, n = 0

update(x,y):
n += 1
dx = x - meanX
dy = y - meanY
varX += (((n-1)/n)*dx*dx - varX)/n
covXY += (((n-1)/n)*dx*dy - covXY)/n
meanX += dx/n
meanY += dy/n

getA(): return covXY/varX
getB(): return meanY - getA()*meanX

我在寻找一个等效算法时发现了这个问题,该算法递增地计算多元回归为以便R=(XX)1XYXR=Y+ϵ


4
感谢您的贡献!关于线性回归的问题部分实际上是stats.stackexchange.com/questions/6920/…的副本,其答案显示了如何更新多元线性回归模型。由于问题的逻辑回归部分与利益无关,因此可以保留本主题。实际上,即使是逻辑部分也已在stats.stackexchange.com/questions/59174/…中复制。
whuber

1
考虑到问题中提供的参考文字,我认为此答案将很有用。谢谢你的链接。但是,这不是我想要的。我的用例显然很特殊。
chmike 2013年

3
我相信它可能有用,并且在提供工作代码方面是独一无二的。
ub

请问为什么让dx * dy次(n-1)/ n?
FavorMylikes

您可以改进代码以计算p值吗?
弥敦道

12

对于您的两个具体示例:

线性回归 Alexander Strehl和Michael Littman 的论文“在线线性回归及其在基于模型的强化学习中的应用”描述了一种称为“ KWIK线性回归”的算法(请参阅算法1),该算法为使用增量更新的线性回归解决方案提供了近似方法。请注意,这不是正规化的(即不是Ridge回归)。我非常确定Strehl&Littman的方法不能扩展到该设置。

逻辑回归

这个线索为这件事提供了一些启示。报价:

即使没有正则化约束,逻辑回归也是一个非线性优化问题。它已经没有解析解决方案,通常这是获得更新解决方案的前提。具有正则化约束,这成为约束优化问题。除了不受约束的问题已经出现的问题之外,这还引入了一套全新的非分析复杂性。

但是,您可能还需要查看其他在线(或增量)回归方法,例如局部加权投影回归(LWPR)


关于逻辑回归,我认为您不必要地悲观。Logistic回归等效于计算两类问题的后验类概率,每个类具有高斯分布,并且均值和共享协方差不同。协方差的MLE只是每个类别协方差的加权总和,因此足够的统计信息只是每个类别的计数,总和和平方和。显然,使用足够的统计数据可以轻松地进行确切的更新。
罗伯特·多迪尔

3
@RobertDodier您已经描述了线性判别分析,而不是逻辑回归。引言部分的最后一段在阐明了这种关系。
ahfoss

@ahfoss即使每个类别的数据不是正态分布的,仍然可以通过每个类别的协方差构造一个等效于逻辑回归的模型。
罗伯特·多迪尔

1
@RobertDodier的等效模型是什么?您似乎暗示着对于一个非常困难的问题有一个明显的解决方案。您的解决方案比您想像的要聪明得多,或者比您想像的要少得多。
ahfoss

11

作为一般原则:

0)您保留足够的统计信息和当前的ML估算值

1)当您获得新数据时,请更新足够的统计信息和估算值

2)如果您没有足够的统计信息,则需要使用所有数据。

3)通常,您没有封闭式解决方案;使用以前的MLE作为起点,使用一些方便的优化方法从那里找到新的最优值。您可能需要进行一些试验,以找到哪种方法可以针对您特定类型的问题实例进行最佳权衡。

如果您的问题具有特殊的结构,则可以利用它。

可能有或没有价值的几个潜在参考:

McMahan,HB和M. Streeter(2012),《
开放式问题:更好地限制在线Logistic回归》
JMLR:研讨会和会议论文集,第23卷,44.1–44.3

Penny,WD和SJ Roberts(1999),《
动态Logistic回归》
会议录IJCNN '99


我同意保留足够的统计信息(如果存在问题的话)的想法,但是是否存在足够的统计信息是否会使其他内容不必要?如果您有足够的统计信息,则可以像使用整个数据集一样精确地计算更新的参数。无需考虑当前参数,也无需尝试优化方法。
罗伯特·多迪尔

2
需要特别注意的是,拥有足够的统计数据并不意味着您可以找到方程式的解决方案。
Glen_b-恢复莫妮卡

8

除了tdc的答案外,还没有已知的方法可以在任何时间点以每次迭代的恒定时间来计算系数的精确估计。但是,有些替代方法是合理且有趣的。

首先要看的模型是在线学习设置。在这种情况下,世界首先宣布x的值,您的算法预测y的值,世界宣布真实值y',并且您的算法遭受损失l(y,y')。对于此设置,已知简单算法(梯度下降和指数梯度等)可实现次线性遗憾。这意味着,当您看到更多示例时,算法所犯的额外错误数量(与最佳线性预测变量相比)不会随示例数量的增加而增加。即使在对抗设置中也可以使用。有一篇很好的论文解释了一种证明这些遗憾界限的流行策略。Shai Shalev-Schwartz的讲义也很有用。

在线学习设置有一个扩展,称为强盗设置,在该设置中,仅为您的算法提供一个数字,表示错误的程度(并且没有指向正确答案的指针)。令人印象深刻的是,在线学习的许多结果都延续到了这一背景,除了这里人们被迫探索和利用外,这导致了各种各样有趣的挑战。


6

其他答案也指向了机器学习的世界,这肯定是解决此问题的地方。

但是,另一种可能更适合您的需求的方法是使用QR分解和低等级更新。这样做的方法及其用于解决最小二乘问题的方法如下:

Hammerling和Lucas 更新了QR分解和最小二乘问题


5

为此,您可以在R中使用一些标准的Kalman过滤器包-sspir,dlm,kfas等。我觉得KF比在线学习要发达得多,所以它可能更实用。您可以使用模型 来允许您的回归系数随时间缓慢变化,KF会在每个模型上重新估计它们步骤(以固定的时间成本为基础)基于最新数据。另外,您可以将它们设置为常数,KF仍将在每个步骤上重新估计它们,但这一次假设它们是恒定的,并且只是合并新的观测数据以产生对相同系数的越来越好的估计价值观。β = β - 1

yt=βtxt+εt,βt=βt1+ηt
βt=βt1

您可以制定类似的逻辑回归模型,因为它是非线性的,您需要请使用上述软件包中的非线性过滤方法-EKF或UKF。

yt=logit(βtxt+εt),βt=βt1+ηt

2

这是添加到@chmike答案。

该方法似乎与BP Welford的在线标准差算法相似,该算法也计算平均值。约翰·库克在这里给出了很好的解释。托尼·芬奇(Tony Finch)在2009年提供了一种用于计算指数移动平均值和标准差的方法:

diff := x – mean 
incr := alpha * diff 
mean := mean + incr 
variance := (1 - alpha) * (variance + diff * incr)

凝视先前发布的答案,并在其上扩展以包括指数移动窗口:

init(): 
    meanX = 0, meanY = 0, varX = 0, covXY = 0, n = 0,
    meanXY = 0, varY = 0, desiredAlpha=0.01 #additional variables for correlation

update(x,y):
    n += 1
    alpha=max(desiredAlpha,1/n) #to handle initial conditions

    dx = x - meanX
    dy = y - meanY
    dxy = (x*y) - meanXY #needed for cor

    varX += ((1-alpha)*dx*dx - varX)*alpha
    varY += ((1-alpha)*dy*dy - varY)*alpha #needed for corXY
    covXY += ((1-alpha)*dx*dy - covXY)*alpha

    #alternate method: varX = (1-alpha)*(varX+dx*dx*alpha)
    #alternate method: varY = (1-alpha)*(varY+dy*dy*alpha) #needed for corXY
    #alternate method: covXY = (1-alpha)*(covXY+dx*dy*alpha)

    meanX += dx * alpha
    meanY += dy * alpha
    meanXY += dxy  * alpha

getA(): return covXY/varX
getB(): return meanY - getA()*meanX
corXY(): return (meanXY - meanX * meanY) / ( sqrt(varX) * sqrt(varY) )

在上面的“代码”中,desireAlpha可以设置为0,如果这样,则代码将在没有指数加权的情况下运行。它可以被建议为通过建议desiredAlpha设定为1 / desiredWindowSize Modified_moving_average用于移动窗口的大小。

附带问题:从精确度的角度来看,在上述替代计算中,有何评论更好?

参考文献:

chmike(2013)https://stats.stackexchange.com/a/79845/70282

约翰·库克(nd)准确计算运行方差http://www.johndcook.com/blog/standard_deviation/

芬奇,托尼。(2009)加权均值和方差的增量计算。https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

维基百科。(nd)韦尔福德的在线算法https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.