-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlinregress.py
More file actions
56 lines (44 loc) · 1.74 KB
/
linregress.py
File metadata and controls
56 lines (44 loc) · 1.74 KB
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
46
47
48
49
50
51
52
53
54
55
56
""" Le but est de na pas utiliser scipy.stats dont la taille est de 30 Mo
Mais finalement scipy est utilisée par sklearn ... Grrr
"""
import numpy
from collections import namedtuple
def calculate( x, y ):
"""
Régression linéaire utilisant uniquement NumPy.
Reproduit les fonctionnalités principales de scipy.stats.linregress.
Parameters :
- x : array-like, les données indépendantes.
- y : array-like, les données dépendantes.
Return :
- slope : pente de la régression.
- intercept : ordonnée à l'origine.
- stderr : erreur standard de la pente.
"""
# namedtuple for results
LinregressResult = namedtuple(
"LinregressResult",
["slope", "intercept", "stderr"]
)
# Conversion en tableaux NumPy
x = numpy.asarray(x, dtype=float)
y = numpy.asarray(y, dtype=float)
# Moyennes et tailles des données
n = len(x)
x_mean = numpy.mean(x)
y_mean = numpy.mean(y)
# Calcul de la pente et de l'intercept
slope = numpy.sum((x - x_mean) * (y - y_mean)) / numpy.sum((x - x_mean) ** 2)
intercept = y_mean - slope * x_mean
# Coefficient de corrélation
#ss_tot = numpy.sum((y - y_mean) ** 2)
ss_res = numpy.sum((y - (slope * x + intercept)) ** 2)
#rvalue = numpy.sqrt(1 - (ss_res / ss_tot)) * numpy.sign(slope)
# Coefficient de détermination (R^2)
#r_squared = rvalue ** 2
# Erreur standard de la pente
stderr = numpy.sqrt(ss_res / (n - 2)) / numpy.sqrt(numpy.sum((x - x_mean) ** 2))
# Calcul de la valeur-p (distribution t de Student)
#t_stat = rvalue * numpy.sqrt((n - 2) / (1 - r_squared))
#pvalue = 2 * (1 - t.cdf(np.abs(t_stat), df=n - 2))
return LinregressResult( slope, intercept, stderr )