### 8.2.20 Régression logistique : logistic_regression

Les courbes logistiques sont des courbes dont léquation y=y(x) sont solutions d’une équation différentielle de la forme :
y′/y=a*y+b et y0=y(x0) avec a<0 et b>0.
Les solutions sont de la forme : y(x)=C/(1+exp(−α (x−x0−k) avec C=−b/a, α=−b et y0=(−b/a)/(1+exp(−b*k) soit
k=−1/b*(ln(−((a*y0+b)/(a*y0)))) Pour vérifier, on peut taper :

normal(desolve(y’/y=a*y+b)

On obtient :

(-b*exp(-(b*c_0-b*x)))/(a*exp(-(b*c_0-b*x))-1)

Puis on peut taper :

normal(desolve([y’/y=a*y+b,y(x0)=y0],y)

On obtient :

[(-b*exp(b*x-b*x0+ln(y0/(a*y0+b))))/(a*exp(b*x-b*x0+ln(y0/(a*y0+b)))-1)]

On a donc : c0=x0−ln(y0/(a*y0+b))/b Donc, en multipliant le numérateur et dénominateur de y(x) par exp(b*c_0−b*x) on a :
y(x)=(−b/(exp(b*c_0−b*x)*a*exp(−(b*c_0−b*x))−1) soit y(x)=−b/(a−exp(b*(x−c0)))=(−b/(a*(1−exp(b*(x−c0))/a))
On a 1/a=−exp(−ln(−a)) car a<0 donc y(x)=(−b/a)*(1/(1+exp(b*(x−c0)−ln(−a))) qui est bien la forme annoncée.

Lorsque on connait les valeurs de f′ en x=x0,x0+1....x0+n, on cherche une fonction logistique y(x) tel que y′(x) approche au mieux les différentes valeurs de f′(x).

logistic_regression a comme paramètres :

- une liste L qui contient les valeurs de y′ pour x=x0,x0+1....x0+n,
- la valeur de x0 de x0
- la valeur y0 de y(x0) lorsqu’on la connait sinon Xcas arrive à l’estimer...

logistic_regression(L,x0,y0 renvoie les fonctions y(x) et y’(x), la constante C, y1M et xM avec y1M est la valeur y’(xM) qui est le maximum de y′ obtenu en x=xM, et enfin le coefficient de correlation linéaire R de Y=y′/y en fonction de y avec la droite Y=a*y+b.
À partir de la liste L, Xcas calcule la liste Ly en utilisant la formule y(t+1)−y(t)=y′(t), donc, on a Ly=[y0,y0+y0’,y0+y0’+y1’,....]. Puis Xcas fait une régression linéaire de L/Ly en fonction de Ly pour avoir les valeurs de a et b (y′/y=a*y+b et y0=y(x0)) puis touve la solution de cette équation différentielle On tape :

logistic_regression([0.0,1.0,2.0,3.0,4.0],0,1)

On obtient avec écrit en bleu la signification des valeurs renvoyées :

[(-17.77)/(1+exp(-0.496893925384*x+2.82232341488+3.14159265359*i)), (-2.48542227469)/(1+cosh(-0.496893925384*x+2.82232341488+3.14159265359*i)), -17.77,-1.24271113735,5.67993141131+6.32246138079*i, 0.307024935856]

On tape :

evalf(logistic_regression([1,2,4,6,8,7,5],0,2))

Ou on tape :

logistic_regression(evalf([1,2,4,6,8,7,5]),0,2.0))

On obtient :

[64.8358166583/(1.0+exp(-0.551746244591*x+2.95837880348)), 14.4915280084/(1.0+cosh(-0.551746244591*x+2.95837880348)), 64.8358166583,7.24576400418,5.36184674112,-0.81176431297]

Pour retouver la valeur -0.81176431297 du coefficient de corrélation, on tape :
L:=[1,2,4,6,8,7,5];
y0:=2.0;
Ly:=makelist(y0,1,size(L))+cumSum(L)
On obtient : [3,5,9,15,23,30,35]
puis
correlation(L/Ly,Ly) qui renvoie
-0.81176431297