Regresión lineal con matplotlib / numpy


87

Estoy tratando de generar una regresión lineal en un diagrama de dispersión que he generado, sin embargo, mis datos están en formato de lista, y todos los ejemplos que puedo encontrar de uso polyfitrequieren el uso arange. arangeaunque no acepta listas. He buscado alto y bajo sobre cómo convertir una lista en una matriz y nada parece claro. ¿Me estoy perdiendo de algo?

A continuación, ¿cuál es la mejor forma de usar mi lista de enteros como entradas para polyfit?

aquí está el ejemplo de polyfit que estoy siguiendo:

from pylab import * 

x = arange(data) 
y = arange(data) 

m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show() 

Respuestas:


183

arange genera listas (bueno, matrices numpy); escriba help(np.arange)para los detalles. No es necesario llamarlo en listas existentes.

>>> x = [1,2,3,4]
>>> y = [3,5,7,9] 
>>> 
>>> m,b = np.polyfit(x, y, 1)
>>> m
2.0000000000000009
>>> b
0.99999999999999833

Debo agregar que tiendo a usar poly1daquí en lugar de escribir "m * x + b" y los equivalentes de orden superior, por lo que mi versión de su código se vería así:

import numpy as np
import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [3,5,7,10] # 10, not 9, so the fit isn't perfect

coef = np.polyfit(x,y,1)
poly1d_fn = np.poly1d(coef) 
# poly1d_fn is now a function which takes in x and returns an estimate for y

plt.plot(x,y, 'yo', x, poly1d_fn(x), '--k')
plt.xlim(0, 5)
plt.ylim(0, 12)

ingrese la descripción de la imagen aquí


38

Este código:

from scipy.stats import linregress

linregress(x,y) #x and y are arrays or lists.

da una lista con lo siguiente:

pendiente: flotante
pendiente de la línea de regresión
intersección: flotante
intersección de la línea de regresión
valor r: flotante
coeficiente de correlación
valor p: flotante valor p de
dos lados para una prueba de hipótesis cuya hipótesis nula es que la pendiente es cero
stderr: flotante
Error estándar de la estimación

Fuente


4
import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

x = np.array([1.5,2,2.5,3,3.5,4,4.5,5,5.5,6])
y = np.array([10.35,12.3,13,14.0,16,17,18.2,20,20.7,22.5])
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y)
mn=np.min(x)
mx=np.max(x)
x1=np.linspace(mn,mx,500)
y1=gradient*x1+intercept
plt.plot(x,y,'ob')
plt.plot(x1,y1,'-r')
plt.show()

Utilizar esta ..


Esto no agrega una nueva forma de abordar el problema; ya se ha sugerido en esta respuesta popular .
Mr. T

¿Quieres convertir la lista generada en una matriz?
Aleena Rehman

No quiero nada específico, esta no es mi pregunta. Solo digo que repetir una respuesta ya establecida no es realmente lo que SO está buscando. Por favor, lea el enlace que publiqué.
Mr. T

2
from pylab import * 

import numpy as np
x1 = arange(data) #for example this is a list
y1 = arange(data) #for example this is a list 
x=np.array(x) #this will convert a list in to an array
y=np.array(y)
m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show()

1
Ya veo, ha escrito algunos comentarios, pero debería considerar agregar algunas oraciones de explicación, esto aumenta el valor de su respuesta ;-)
MBT

1
Tenga en cuenta que, si bien un fragmento de código puede ser una respuesta útil por sí solo, es preferible dejar algunos comentarios para los futuros lectores sobre por qué esto resuelve el problema. ¡Gracias!
Erty Seidohl

1
@ blue-phoenox bueno, pensé que la gente es genial aquí, pero supongo que lo explicaré la próxima vez ..
Aleena Rehman

1

Otra respuesta rápida y sucia es que puede convertir su lista en una matriz usando:

import numpy as np
arr = np.asarray(listname)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.