Как предсказать значение с помощью линейной регрессии? - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу предсказать поведение моих данных в будущем.Значение моих данных х и у составляет около 1000 значений.Я хочу предсказать значение у [1001].Это мой пример.

from numpy.random import randn
from numpy.random import seed
from numpy import sqrt
import numpy
from numpy import sum as arraysum
from scipy.stats import linregress
from matplotlib import pyplot

seed(1)
x = 20 * randn(1000) + 100
print(numpy.size(x))
y = x + (10 * randn(1000) + 50)
print(numpy.size(y))
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
# make predictions
yhat = b0 + b1 * x
# define new input, expected value and prediction
x_in = x[1001]
y_out = y[1001]
yhat_out = yhat[1001]
# estimate stdev of yhat
sum_errs = arraysum((y - yhat)**2)
stdev = sqrt(1/(len(y)-2) * sum_errs)
# calculate prediction interval
interval = 1.96 * stdev
print('Prediction Interval: %.3f' % interval)
lower, upper = y_out - interval, y_out + interval
print('95%% likelihood that the true value is between %.3f and %.3f' % (lower, upper))
print('True value: %.3f' % yhat_out)
# plot dataset and prediction with interval
pyplot.scatter(x, y)
pyplot.plot(x, yhat, color='red')
pyplot.errorbar(x_in, yhat_out, yerr=interval, color='black', fmt='o')
pyplot.show()

Когда я пытаюсь это сделать, я получаю эту ошибку.

     x_in = x[1001]
IndexError: index 1001 is out of bounds for axis 0 with size 1000

Моя цель состоит в том, чтобы предсказать поведение моих данных в будущем и оценить их, построив также графики ошибок.Я вижу этот пример как создать прогноз линейной регрессии для данных временных рядов в python , но я не понимаю, как применить его к моим данным.Я обнаружил, что можно использовать модель ARIMA.Пожалуйста, как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вот код графического установщика плойномов для подгонки полинома первого порядка с использованием numpy.polyfit () для выполнения подгонки и mu, py.polyval () для прогнозирования значений.Вы можете поэкспериментировать с различными порядками полиномов, изменив строку «polynomialOrder = 1» в верхней части кода.

import numpy, matplotlib
import matplotlib.pyplot as plt

xData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.0, 6.6, 7.7, 0.0])
yData = numpy.array([1.1, 20.2, 30.3, 40.4, 50.0, 60.6, 70.7, 0.1])

polynomialOrder = 1 # example straight line

# curve fit the test data
fittedParameters = numpy.polyfit(xData, yData, polynomialOrder)
print('Fitted Parameters:', fittedParameters)

modelPredictions = numpy.polyval(fittedParameters, xData)
absError = modelPredictions - yData

SE = numpy.square(absError) # squared errors
MSE = numpy.mean(SE) # mean squared errors
RMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSE
Rsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))
print('RMSE:', RMSE)
print('R-squared:', Rsquared)

print()


##########################################################
# graphics output section
def ModelAndScatterPlot(graphWidth, graphHeight):
    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
    axes = f.add_subplot(111)

    # first the raw data as a scatter plot
    axes.plot(xData, yData,  'D')

    # create data for the fitted equation plot
    xModel = numpy.linspace(min(xData), max(xData))
    yModel = numpy.polyval(fittedParameters, xModel)

    # now the model as a line plot
    axes.plot(xModel, yModel)

    axes.set_xlabel('X Data') # X axis data label
    axes.set_ylabel('Y Data') # Y axis data label

    plt.show()
    plt.close('all') # clean up after using pyplot

graphWidth = 800
graphHeight = 600
ModelAndScatterPlot(graphWidth, graphHeight)
0 голосов
/ 12 февраля 2019
x = 20 * randn(1000) + 100

^ Здесь вы создаете входной вектор X только с 1000 значениями.

y = x + (10 * randn(1000) + 50)

^ и здесь вы создаете выходной вектор y с снова только 1000 значениями.

Итак, когдавы делаете x_in = x[1001], вы имеете в виду элемент, которого нет во входном векторе, поскольку он содержит только 1000 элементов.

Быстрое исправление будет

seed(1)
x = 20 * randn(1001) + 100
print(numpy.size(x))
y = x + (10 * randn(1001) + 50)
print(numpy.size(y))
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x[:1000], y[:1000])
# make predictions
yhat = b0 + b1 * x
# define new input, expected value and prediction
x_in = x[1000]
y_out = y[1000]
...