Existe-t-il des algorithmes permettant de calculer les paramètres de régression linéaire ou logistique «en cours d'exécution»?


32

Un article intitulé «Calcul précis de la variance courante», disponible à l' adresse http://www.johndcook.com/standard_deviation.html, montre comment calculer la moyenne courante, la variance et les écarts types.

Existe-t-il des algorithmes dans lesquels les paramètres d'un modèle de régression linéaire ou logistique peuvent être mis à jour de manière "dynamique" de manière similaire à chaque nouvel enregistrement de formation fourni?


1
Avec un vaste ensemble d’entraînements ou un flux continu de données, vous pouvez utiliser des algorithmes itératifs tels que la descente de gradient stochastique et saisir l’entrée par petits lots à mesure que vous avancez. Est-ce ce que vous demandiez?
andreister

1
Algorithme de recherche RLS et ses variantes. en.wikipedia.org/wiki/Recursive_least_squares_filter
Memming

Réponses:


20

Les coefficients de régression linéaire y=ax+b sont a=cov(x,y)/var(x) et b=mean(y)amean(x) .

Donc, tout ce dont vous avez besoin, c’est d’une méthode incrémentale pour calculer cov(x,y) . A partir de cette valeur et de la variance de x et de la moyenne de y et de x vous pouvez calculer les paramètres a et b . Comme vous le verrez dans le pseudo-code donné ci-dessous, le calcul incrémental de cov(x,y) est très similaire au calcul incrémental de var(x) . Cela ne devrait pas être une surprise parce que var(x)=cov(x,x) .

Voici le pseudo-code que vous recherchez probablement:

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

J'ai trouvé cette question en recherchant un algorithme équivalent calculant de manière incrémentielle une régression à variables multiples telle que R=(XX)1XY sorte que XR=Y+ϵ


4
Nous vous remercions de votre contribution! La partie de la question sur la régression linéaire est en fait une copie de stats.stackexchange.com/questions/6920/… dont les réponses montrent comment mettre à jour un modèle de régression linéaire multiple. Le fil actuel est autorisé, car la partie de la question relative à la régression logistique est indépendante de l’intérêt. En fait, même la partie logistique a été dupliquée à l' adresse stats.stackexchange.com/questions/59174/… .
whuber

1
J'ai pensé que cette réponse serait utile compte tenu du texte de référence donné dans la question. Merci pour le lien. Cependant, ce n'est pas ce que je recherche. Mon cas d'utilisation est apparemment particulier.
Chmike

3
Je crois que cela peut être utile et est unique en offrant un code de travail.
whuber

Puis-je vous demander pourquoi vous laissez dx * dy times (n-1) / n?
FavorMylikes

Pouvez-vous améliorer le code pour calculer la valeur p?
Nathan

12

Pour vos deux exemples spécifiques:

Régression linéaire Le document "Régression linéaire en ligne et son application à l'apprentissage par renforcement basé sur un modèle" de Alexander Strehl et Michael Littman décrit un algorithme appelé "Régression linéaire KWIK" (voir l'algorithme 1) qui fournit une approximation de la solution de régression linéaire à l'aide de mises à jour incrémentielles. . Notez que ceci n’est pas régularisé (c’est-à-dire que ce n’est pas une régression de crête). Je suis à peu près sûr que la méthode de Strehl & Littman ne peut s'étendre à ce paramètre.

Régression logistique

Ce fil apporte un peu de lumière sur le sujet. Citant:

Même sans contrainte de régularisation, la régression logistique est un problème d'optimisation non linéaire. Il n’existe déjà aucune solution analytique, ce qui est généralement une condition préalable à la création d’une solution de mise à jour. Avec une contrainte de régularisation, cela devient un problème d'optimisation sous contrainte. Cela introduit un nouvel ensemble de complications non analytiques qui s'ajoutent à celles déjà rencontrées par le problème sans contrainte.

Il existe cependant d’autres méthodes de régression en ligne (ou incrémentielles) que vous pourriez souhaiter examiner, par exemple la régression à projection pondérée localement (LWPR)


Concernant la régression logistique, je pense que vous êtes inutilement pessimiste. La régression logistique est équivalente au calcul des probabilités de classe postérieure pour un problème à deux classes avec chaque classe gaussienne distribuée, avec des moyens différents et une covariance partagée. Le MLE pour la covariance est juste une somme pondérée des covariances par classe, de sorte que les statistiques suffisantes sont uniquement le nombre, la somme et la somme des carrés par classe. Évidemment, il est facile de trouver une mise à jour exacte en utilisant les statistiques suffisantes.
Robert Dodier

3
@ RobertDodier Vous avez décrit l'analyse discriminante linéaire, pas la régression logistique. Le dernier paragraphe de la section d' introduction ici clarifie la relation.
Ahfoss

@ahfoss Même si les données par classe ne sont pas distribuées normalement, il est toujours possible de construire un modèle équivalent à la régression logistique via des covariances par classe.
Robert Dodier

1
@ RobertDodier Quel est le modèle équivalent? Vous semblez impliquer qu'il existe une solution évidente à un problème très difficile. Votre solution est soit plus brillante que vous ne le réalisez, ou beaucoup moins.
ahfoss

11

En principe général:

0) vous conservez les statistiques suffisantes et les estimations actuelles du BC

1) lorsque vous obtenez de nouvelles données, mettez à jour les statistiques suffisantes et les estimations

2) Lorsque vous ne disposez pas de statistiques suffisantes, vous devez utiliser toutes les données.

3) En règle générale, vous n'avez pas de solutions fermées; utilisez les MLE précédents comme point de départ, utilisez une méthode d’optimisation pratique pour trouver le nouvel optimum à partir de là. Vous devrez peut-être expérimenter un peu pour trouver les approches qui offrent les meilleurs compromis pour vos types de problèmes particuliers.

Si votre problème a une structure spéciale, vous pouvez probablement l'exploiter.

Quelques références potentielles pouvant ou non avoir une certaine valeur:

McMahan, HB et M. Streeter (2012),
Problème ouvert: de meilleures limites pour la régression logistique en ligne ,
JMLR: compte rendu des ateliers et des conférences , vol 23, 44.1–44.3.

Penny, WD et SJ Roberts (1999),
Régression logistique dynamique ,
Actes IJCNN '99


Je suis d'accord avec l'idée de conserver des statistiques suffisantes (si elles existent pour le problème), mais la présence de statistiques suffisantes ne rend-elle pas les autres éléments inutiles? Si vous disposez des statistiques suffisantes, vous pouvez calculer les paramètres mis à jour exactement comme si vous utilisiez l'intégralité du jeu de données. Il n'est pas nécessaire de prendre en compte les paramètres actuels ni d'expérimenter des méthodes d'optimisation.
Robert Dodier

2
Il est important de noter qu'avoir suffisamment de statistiques ne signifie pas que vous ayez une solution aux équations.
Glen_b -Reinstate Monica

8

Ajoutant à la réponse de tdc, il n’existe aucune méthode connue pour calculer des estimations exactes des coefficients à un moment donné, avec juste un temps constant par itération. Cependant, il existe des alternatives raisonnables et intéressantes.

Le premier modèle à examiner est le cadre d’ apprentissage en ligne . Dans ce paramètre, le monde annonce une valeur de x, votre algorithme prédit une valeur pour y, le monde annonce la valeur vraie y 'et votre algorithme subit une perte l (y, y'). Pour ce paramètre, il est connu que des algorithmes simples (descente de gradient et gradient exponentiel, entre autres) permettent d'obtenir un regret sous-linéaire. Cela signifie qu'au fur et à mesure que vous voyez plus d'exemples, le nombre d'erreurs supplémentaires commises par votre algorithme (par rapport au meilleur prédicteur linéaire possible) n'augmente pas avec le nombre d'exemples. Cela fonctionne même dans des contextes contradictoires. Il existe un bon article expliquant une stratégie populaire pour prouver ces limites de regret. Les notes de cours de Shai Shalev-Schwartz sont également utiles.

Il existe une extension du paramètre d'apprentissage en ligne appelée paramètre bandit où votre algorithme se voit uniquement attribuer un numéro représentant son erreur (et aucun pointeur vers la bonne réponse). De manière impressionnante, de nombreux résultats de l’apprentissage en ligne se retrouvent dans ce contexte, sauf qu’il faut ici explorer et exploiter, ce qui crée toutes sortes de défis intéressants.


6

D'autres réponses ont mis en évidence le monde de l'apprentissage automatique, et c'est certainement un endroit où ce problème a été traité.

Cependant, une autre approche qui pourrait mieux convenir à vos besoins est l’utilisation de la factorisation QR avec des mises à jour de rangs faibles. Les approches pour le faire et l’utiliser pour résoudre les problèmes de moindres carrés sont présentées dans:

Mise à jour de la factorisation QR et du problème des moindres carrés par Hammerling et Lucas.


5

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

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

2

Ceci est à ajouter à la réponse @chmike.

La méthode semble être similaire à l'algorithme en ligne de l'écart type de BP Welford, qui calcule également la moyenne. John Cook donne une bonne explication ici . Tony Finch en 2009 fournit une méthode pour une moyenne mobile exponentielle et un écart type:

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

Observez la réponse précédemment publiée et développez-la pour y inclure une fenêtre en mouvement exponentiel:

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) )

Dans le "code" ci-dessus, désiréAlpha pourrait être mis à 0 et si tel était le cas, le code fonctionnerait sans pondération exponentielle. Il peut être suggéré de définir désiréeAlpha sur 1 / désiréeWindowSize comme suggéré par Modified_moving_average pour une taille de fenêtre en mouvement.

Question secondaire: des calculs alternatifs ci-dessus, quels commentaires sur ce qui est le mieux du point de vue de la précision?

Les références:

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

Cook, John (nd) Calculer avec précision la variance en cours d'exécution http://www.johndcook.com/blog/standard_deviation/

Finch, Tony. (2009) Calcul incrémental de la moyenne pondérée et de la variance. https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf

Wikipédia. (nd) Algorithme en ligne de Welford https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.