Линейная регрессия с matplotlib / numpy
Я пытаюсь создать линейную регрессию на точечной диаграмме, которую я создал, однако мои данные находятся в формате списка, и все примеры, которые я могу найти, используют 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()
5 ответов:
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 fit = np.polyfit(x,y,1) fit_fn = np.poly1d(fit) # fit_fn is now a function which takes in x and returns an estimate for y plt.plot(x,y, 'yo', x, fit_fn(x), '--k') plt.xlim(0, 5) plt.ylim(0, 12)
этот код:
from scipy.stats import linregress linregress(x,y) #x and y are arrays or lists.
выдает список со следующим:
наклон : поплавок
наклон линии регрессии
перехват : поплавок
перехват линии регрессии
r-значение: float
коэффициент корреляции
p-значение: float
двустороннее p-значение для теста гипотезы, нулевая гипотеза которого заключается в том, что наклон равен нулю
устройство : поплавок
Стандартная ошибка оценка
еще один быстрый и грязный ответ, что вы можете просто преобразовать список в массив с помощью:
import numpy as np arr = np.asarray(listname)
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()
использовать это ..