Переберите три строки, затем выполните линейную регрессию - PullRequest
0 голосов
/ 14 июня 2019

Я хочу выполнить итерацию по трем строкам только в двух столбцах, затем в функции итерации я делаю линейную регрессию в этих трех строках.Итак, итерация по трем строкам, линейная регрессия, итерация по трем строкам, линейная регрессия и т. Д.

Я поместил ввод данных здесь .Я хочу перебрать три строки в столбце «Год и значение», затем выполнить линейную регрессию, затем перебрать три строки в столбце «Год и значение», затем выполнить линейную регрессию и т. Д.

Я уже пробовал этот код, но есть ошибка

year=data_['Year']
value=data_['Value']
i=0
count=0

for a,b in zip(year,value):
    print(a,b)
    count = count+1

    if count%3 == 0:

        x=np.array([[a]])
        y=np.array([[b]])

        reg=linear_model.LinearRegression()
        x_train,x_test,y_train,y_test=train_test_split(x,y,test_size = 0.2 ,random_state=3)
        reg.fit(x_train,y_train)

        y4=4*reg.coef_ + reg.intercept_
        plt.scatter(x,y)
        plt.show()
        print(reg.coef_)
        print("R^2 : ",reg.score(x, y))
        print("Equation : 4 *", reg.coef_, "+", reg.intercept_)
        print("Y4 : ", y4)
        print("====")

Я ожидаю, что выходные данные каждые три строки приводят к уклону, коэффициенту и уравнению.

1 Ответ

1 голос
/ 14 июня 2019

Если вы хотите провести простую линейную регрессию для группы из трех лет, попробуйте что-то вроде этого:

# Hardcoded input data for clarity
#all_years = data_['Year'].values
#all_values = data_['Value'].values
all_years = np.array([1,2,3,
                      1,2,3,
                      1,2,3,
                      1,2,3,
                      1,2,3])
all_values = np.array([  6.262008,   5.795994,   5.082662,
                       285.433511, 260.436601, 238.713124,
                         2.596145,   2.508278,   2.67997, 
                        90.823952,  91.0962765, 93.821241,
                        19.677544,  18.464335,  18.035489])


w = 3  # window size
for i in range(len(all_years)//w):

    years = all_years[w*i : w*(i+1)].reshape(-1,1)
    values = all_values[w*i : w*(i+1)].reshape(-1,1)
    #print(years, values)

    reg=linear_model.LinearRegression()
    reg.fit(years, values)

    y=(w+1)*reg.coef_ + reg.intercept_
    plt.scatter(years, values)
    plt.show()
    print(reg.coef_)
    print("R^2 : ",reg.score(years, values))
    print("Equation : (w+1) *", reg.coef_, "+", reg.intercept_)
    print("Y4 : ", y)
    print("====")

В этом случае длина будет 15, поэтому цикл for пройдет i= 1, ..., 4. Затем я выбираю нужные вам годы и значения, используя срез массива numpy.

Например, для i = 1 будет выбрано [3*(1-1) : 3*1] = [0 : 3], давая ровно первые три строки. Затем, чтобы убедиться, что это хорошо работает с линейной регрессией, ожидающей вектор столбца, я изменил массив, чтобы он состоял из 1 столбца с .reshape(-1, 1).

Тогда это вопрос обучения и заговора, как вы хотите.

Для версии, которая более удобна для чтения и позволяет избежать проблем с ручной индексацией, вы также можете обратиться к пакету more-itertools. В частности, метод chunked полезен в этом случае для разделения данных на куски фиксированной длины, в нашем случае 3:

from more_itertools import chunked

...

w = 3  # window size  
for years, values in zip(chunked(all_years, n=w), chunked(all_values, n=w)):

    years = years.reshape(-1,1)
    values = values.reshape(-1,1)
    #print(years, values)

    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...