Regressão linear com matplotlib / numpy


87

Estou tentando gerar uma regressão linear em um gráfico de dispersão que gerei; no entanto, meus dados estão em formato de lista e todos os exemplos de uso que posso encontrar polyfitexigem o uso arange. arangenão aceita listas embora. Pesquisei muito sobre como converter uma lista em uma matriz e nada parece claro. Estou esquecendo de algo?

A seguir, qual a melhor forma de usar minha lista de inteiros como entradas para o polyfit?

aqui está o exemplo de polyfit que estou seguindo:

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

Experimente regplotem seaborn: stackoverflow.com/a/42263217/911945
Anton Tarasenko

Respostas:


183

arange gera listas (bem, matrizes numpy); digite help(np.arange)para os detalhes. Você não precisa chamá-lo em 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

Devo acrescentar que tendo a usar poly1daqui em vez de escrever "m * x + b" e os equivalentes de ordem superior, então minha versão do seu código seria mais ou menos assim:

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)

insira a descrição da imagem aqui


38

Este código:

from scipy.stats import linregress

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

fornece uma lista com o seguinte:

declive: float
declive da linha de regressão
interceptar: float
intercepto da linha de regressão
valor r: float
coeficiente de correlação
p-valor: float
valor p bilateral para um teste de hipótese cuja hipótese nula é que a inclinação é zero
stderr: float
Erro padrão da estimativa

Fonte


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

Usa isto ..


Isso não adiciona uma nova maneira de resolver o problema - já foi sugerido nesta resposta popular .
Sr. T

você deseja converter a lista gerada em um array?
Aleena Rehman

Não quero nada específico, essa não é a minha pergunta. Estou apenas dizendo que repetir uma resposta já estabelecida não é realmente o que o SO está procurando. Por favor, leia o link, eu postei.
Sr. 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
Vejo que você escreveu alguns comentários, mas deve considerar adicionar algumas frases de explicação, isso aumenta o valor da sua resposta ;-)
MBT

1
Observe que, embora um snippet de código possa ser uma resposta útil por si só, é preferível deixar alguns comentários para futuros leitores sobre por que isso resolve o problema. Obrigado!
Erty Seidohl

1
@ blue-phoenox bem, eu pensei que as pessoas são gênios aqui, mas acho que vou explicar na próxima vez ..
Aleena Rehman

1

Outra resposta rápida e suja é que você pode simplesmente converter sua lista em uma matriz usando:

import numpy as np
arr = np.asarray(listname)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.