Это основано на Линейной регрессии, часть 1.

Линейная регрессия только для прямых линий? На первый взгляд уравнение коэффициента

может описывать только прямую линию (в нескольких измерениях).

Как мы можем расширить линейную регрессию для получения кривых?

Что нам нужно сделать, так это изменить (или добавить) входное значение X. Чтобы построить кривую, нам нужна функция более высокого порядка, например квадратичная

Взяв наши входные данные X, мы можем возвести их в квадрат и запустить ту же линейную регрессию. На этот раз мы решаем:

Это один из примеров, когда мы можем добавить квадраты значений к исходному X

Фактически, мы можем применить любую нелинейную функцию (применение линейной бессмысленно {почему?}) Log, cos, cube и т. Д.

import math
import torch
import matplotlib.pyplot as plt

Сначала создадим шумную кривую, сделаем полукруг. X - одномерный вектор.

noisiness = 20
num_points = 50
a = torch.linspace( 0, 1*math.pi, steps=num_points ).unsqueeze(1)
x = 7 * torch.cos( a ) + ( ( torch.rand( num_points, 1 ) - 0.5 ) * noisiness/100.0 )
y = torch.sin( a ) + ( ( torch.rand( num_points, 1 ) - 0.5 ) * noisiness/100.0 )

Показать входные данные

plt.scatter( x.tolist(), y.tolist(), color='red' )
plt.show()

Теперь мы запускаем стандартную линейную регрессию, чтобы найти прямую линию

xplusone = torch.cat( ( torch.ones( x.size(0),1 ), x) , 1 ) 
R, _ = torch.gels( y, xplusone )
R = R[0:xplusone.size(1)]  

Наносим данные на график

Неудивительно, что прямая линия совсем не точно описывает данные.

yh = xplusone.mm( R ) 
plt.plot( x.tolist(), yh.tolist() )
plt.scatter( x.tolist(), y.tolist(), color='red' )
plt.show()

Измените входные данные, чтобы они были возведены в квадрат. Повторите регрессию, тот же старый код.

x2 = x*x
x2plusone = torch.cat( ( torch.ones( x2.size(0),1 ), x2) , 1 ) 
R2, _ = torch.gels( y, x2plusone )
R2 = R2[0:x2plusone.size(1)]

Постройте кривую

Мы должны умножить коэффициенты на квадрат входных данных, что мы и решили.

Намного лучше подходит

yh2 = x2plusone.mm( R2 ) 
plt.scatter( x.tolist(), y.tolist(), color='red' )
plt.plot( x.tolist(), yh2.tolist() )
plt.show()

В некотором смысле: мы изогнули поверхность и подогнали прямую линию к изогнутой поверхности.

Что стоит попробовать.

На примере автомобиля из части 1:

  • X1 Максимальная скорость в милях в час.
  • X2 Расход топлива в миль на галлон.
  • X3 Грузовместимость в куб.

мы могли бы попробовать:

  • умножьте два коэффициента вместе
  • X4 = X1 × X2
  • квадратный коэффициент
  • X4 = X3 × X3
  • взять журнал одного входа
  • X4 = ln( 1.0 + X2 )

Предупреждение:

будьте осторожны, чтобы не заставить кривую соответствовать данным. Убедитесь, что у нас есть данные для обучения и тестирования (подробнее об этом позже). Мы можем идеально подогнать наши данные с помощью многочленов высокого порядка, но это может не моделировать проблемное пространство.

Пример кода для настройки входов

Пример добавления квадрата значения каждого входа к входам с помощью pytorch

X = torch.rand( 5, 2 ) 
X = torch.cat( ( X, X*X ), 1 )
print(X)

тензор ([[0,6184, 0,6986, 0,3825, 0,4881],
[0,0635, 0,7061, 0,0040, 0,4986],
[0,4244, 0,2934, 0,1802, 0,0861],
[0,9931, 0,6057, 0,9862, 0,3668],
[0,6223, 0,0366, 0,3872, 0,0013]])