Я использую полиномиальную регрессию прямо в pytorch? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь сделать полиномиальную регрессию по pytorch. Сначала я просто попробовал только линейную регрессию (b + wx).

model_1 = RegressionModel()
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad = True)
optimizer_1 = torch.optim.SGD([W, b], lr = 0.001)

x_train = torch.FloatTensor(dataset.x_data['LSTAT'])
y_train = torch.FloatTensor(dataset.data['target'])

nb_epochs = 10000

for epoch in range(nb_epochs + 1):
    hypothesis = x_train * W + b
    cost = torch.nn.functional.mse_loss(hypothesis, y_train.float())

    optimizer_1.zero_grad()
    cost.backward()
    optimizer_1.step()

    print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f}, Cost: {:.6f}'.format(epoch, 
    nb_epochs, W.item(), b.item(), cost.item()))

Затем я изменил и добавил некоторые переменные для полиномиальной регрессии (b + w1x + w2x ^ 2)

model_2 = RegressionModel()
W1 = torch.zeros(1, requires_grad=True) 
W2 = torch.zeros(1, requires_grad=True) 
b = torch.zeros(1, requires_grad = True)
optimizer_2 = torch.optim.SGD([W2, W1, b], lr = 0.0000099)

x_train = torch.FloatTensor(dataset.x_data['LSTAT'])
y_train = torch.FloatTensor(dataset.data['target'])

nb_epochs = 10000

for epoch in range(nb_epochs + 1):
    hypothesis = b + x_train * W1 + x_train * x_train * W2
    cost = torch.nn.functional.mse_loss(hypothesis, y_train.float())

    optimizer_2.zero_grad()
    cost.backward()
    optimizer_2.step()

    print('Epoch {:4d}/{} W1: {:.3f}, W2: {:.3f}, b: {:.3f}, Cost: 
    {:.6f}'.format(epoch, nb_epochs, W1.item(), W2.item(), b.item(), 
    cost.item()))

Могу ли я попробовать полиномиальную регрессию, как это? Если нет, я был бы очень признателен, если бы вы дали мне знать. Я действительно нуб, чтобы pytorch ...

1 Ответ

1 голос
/ 30 сентября 2019

Ваш код должен работать. При работе с большими данными будет более эффективно, если вы выполните регрессию в одной матричной операции. Для этого вам необходимо предварительно рассчитать полиномы входных объектов:

x_train_polynomial = torch.stack([x_train, x_train ** 2], dim=1)

Чтобы сохранить несколько строк, вы можете переписать проекцию линейным слоем:

import torch.nn as nn
projection = nn.Linear(2, 1, bias=True)

ВТренировочный цикл можно позвонить:

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