Bonjour,

J'essaye de faire une régression linéaire multiple.
Soit deux paramètres que je fais varier (dH et ddV) pour m'en donner un autre : phi
J'ai calculer à la main 36 valeurs de phi en faisant varier dH et ddV

J'aimerais trouver une fonction telle que phi=f(dH, ddV)

En regardant le plot 3D des différentes mesures, il semble que tout s'ajuste plus ou moins suivant un plan légèrement courbé.

Je me suis inspiré de ce code pour réaliser une régression linéaire multiple

http://www.scipy-lectures.org/packag...ession_3d.html

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#usr/bin/python
# -*- coding: utf-8 -*-
# Python 3
import numpy as np
import matplotlib.pyplot as plt
import pandas
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from mpl_toolkits.mplot3d import Axes3D
 
data = np.loadtxt('Data_Phi_dH_ddV_M40-48')
#signal_1=np.loadtxt(namefile1)
phi=data[:,0]/364
dH=data[:,1]
ddV=data[:,2]
 
# Plot the data
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(dH, ddV, phi, cmap=plt.cm.coolwarm)
 
ax.set_xlabel('dH')
ax.set_ylabel('ddV')
ax.set_zlabel('phi')
 
##############################################################################
# Multilinear regression model, calculating fit, P-values, confidence
# intervals etc.
 
# Convert the data into a Pandas DataFrame to use the formulas framework
# in statsmodels
 
# First we need to flatten the data: it's 2D layout is not relevent.
dH = dH.flatten()
ddV = ddV.flatten()
phi = phi.flatten()
 
data = pandas.DataFrame({'x': dH, 'y': ddV, 'z': phi})
 
# Fit the model
model = ols("z ~ x + y", data).fit()
 
print result.summary()
 
plt.show()
me retournant

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
                        OLS Regression Results                            
==============================================================================
Dep. Variable:                      z   R-squared:                       0.970
Model:                            OLS   Adj. R-squared:                  0.968
Method:                 Least Squares   F-statistic:                     528.2
Date:                Fri, 12 May 2017   Prob (F-statistic):           8.73e-26
Time:                        17:57:19   Log-Likelihood:                 80.588
No. Observations:                  36   AIC:                            -155.2
Df Residuals:                      33   BIC:                            -150.4
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept      0.0200      0.008      2.556      0.015         0.004     0.036
x              0.0023   7.53e-05     31.103      0.000         0.002     0.002
y           4.456e-05   7.16e-05      0.622      0.538        -0.000     0.000
==============================================================================
Omnibus:                       33.046   Durbin-Watson:                   1.880
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              100.560
Skew:                           2.032   Prob(JB):                     1.46e-22
Kurtosis:                      10.108   Cond. No.                         185.
==============================================================================

Et j'ai alors deux problèmes :

1/ Premièrement il m'ouvre une figure pour:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 surf = ax.plot_surface(dH, ddV, phi, cmap=plt.cm.coolwarm)
mais vide, sans aucune valeur dedans...

2/ Deuxièmement, j'imagine que l'équation d'après les paramètres donnés serait:

phi=0.0023*dH+0.00004456*ddV+0.002

Mais en faite pas du tout puisqu'en recalculant sur mes mesures, ça me donne pas la même chose.

J'ai du me tromper dans l'interprétation des résultats ou le code en lui même mais je ne vois pas où.


et j'aurais également une autre question :

Apparemment on peut aussi utiliser scikit-learn pour les regressions linéaires multiples mais en essayant d'importer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
from sklearn import linear_model
il me retourne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
   from sklearn import linear_model
ImportError: No module named sklearn

Merci par avance de toutes aides.

PS, pour info voici le fichier de data:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
49 50 0 
90 100 0
1 0 42
51 50 42
93 100 42
5 0 167
60 50 167
106 100 167
40 30 0
-48 -50 42 
2 0 42
43 50 42
-44 -50 167 
11 0 167
52 50 167
-88 -160 42
-38 -50 42
3 0 42
-84 -100 167
-29 -50 167
16 0 167
50 50 0
91 100 0
4 0 125
59 50 125
105 100 125
41 50 0
-46 -50 125
9 0 125
55 50 125
-87 -100 125 
-32 -50 125
13 0 125
55 50 0
100 100 0
46 50 0