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


87

Я намагаюся генерувати лінійну регресію на графіку розсіювання, який я створив, однак мої дані у форматі списку, і всі приклади, які я можу знайти, polyfitвимагають використання arange. arangeне приймає списки. Я шукав високо і низько про те, як перетворити список у масив, і нічого не здається зрозумілим. Мені чогось не вистачає?

Далі, як найкраще я можу використовувати свій список цілих чисел як вхідні дані до polyfit?

ось приклад 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.

видає список із наступним:

нахил: плаваючий
нахил лінії регресії
перехоплення: плаваючий
перехоплення лінії регресії
r-значення: плаваючий
коефіцієнт кореляції
p-значення: плаваюче
двостороннє 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()

Використовуй це ..


Це не додає нового способу вирішення проблеми - це вже було запропоновано у цій популярній відповіді .
Містер Т,

ти хочеш перетворити створений список у масив?
Aleena Rehman

Я не хочу нічого конкретного, це не моє питання. Я просто кажу, що повторення вже встановленої відповіді насправді не є тим, що шукає ТО. Будь ласка, прочитайте посилання, яке я розмістив.
Містер Т,

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
Зверніть увагу: хоча фрагмент коду може бути корисним для вирішення сам по собі, бажано залишити коментар для майбутніх читачів про те, чому це вирішує проблему. Дякую!
Ерті Сейдоль,

1
@ blue-phoenox добре, я думав, що люди тут геніальні, але, мабуть, наступного разу пояснить ..
Алеена Реман

1

Ще одна швидка і брудна відповідь полягає в тому, що ви можете просто перетворити свій список на масив, використовуючи:

import numpy as np
arr = np.asarray(listname)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.