Линейная регрессия с matplotlib / numpy


87

Я пытаюсь создать линейную регрессию на графике рассеяния, который я сгенерировал, однако мои данные находятся в формате списка, и все примеры, которые я могу найти, polyfitтребуют использования arange. arangeне принимает списки. Я много и мало искал, как преобразовать список в массив, и ничего не кажется ясным. Я что-то упускаю?

Далее, как лучше всего использовать свой список целых чисел в качестве входных данных для polyfit?

вот пример полифита, которому я следую:

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

Попробуйте regplotс seaborn: stackoverflow.com/a/42263217/911945
Anton Tarasenko

Ответы:


183

arange генерирует списки (ну, массивы numpy); введите help(np.arange)подробности. Вам не нужно называть его в существующих списках.

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

Я должен добавить, что я предпочитаю использовать poly1dздесь, а не писать «m * x + b» и эквиваленты более высокого порядка, поэтому моя версия вашего кода будет выглядеть примерно так:

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)

введите описание изображения здесь


38

Этот код:

from scipy.stats import linregress

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

выдает список со следующим:

slope: float
наклон линии регрессии
пересечение: float
пересечение линии регрессии
r-value: float
коэффициент корреляции
p-значение: float
двустороннее p-значение для проверки гипотезы, нулевая гипотеза которой заключается в том, что наклон равен нулю
stderr: float
Стандартная ошибка оценки

Источник


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

Использовать это ..


Это не добавляет нового способа решения проблемы - он уже был предложен в этом популярном ответе .
Мистер Т.

вы хотите преобразовать сгенерированный список в массив?
Алина Рехман

Я не хочу ничего конкретного, это не мой вопрос. Я просто говорю, что повторение уже установленного ответа на самом деле не то, что ищет SO. Прочтите пожалуйста ссылку, которую я разместил.
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
Я вижу, вы написали несколько комментариев, но вам следует подумать о добавлении нескольких предложений с объяснением, это повысит ценность вашего ответа ;-)
MBT

1
Обратите внимание, что хотя фрагмент кода может быть полезным ответом сам по себе, желательно оставить комментарий для будущих читателей о том, почему это решает проблему. Благодарность!
Erty Seidohl

1
@ blue-phoenox: ну, я думала, что здесь люди гениальные, но я думаю, что объясню в следующий раз ..
Алина Рехман

1

Еще один быстрый и грязный ответ - вы можете просто преобразовать свой список в массив, используя:

import numpy as np
arr = np.asarray(listname)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.