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

Для полноты мы начнем с обычной линейной регрессии.

Обычная линейная регрессия

Сначала нам нужны некоторые данные, с которыми мы можем поиграть. Здесь мы просто создадим несколько произвольных двумерных образцов.

Вы можете думать об этих данных как хотите. Здесь мы можем ясно видеть, что существует сильная корреляция между двумя переменными. По оси X может быть цена билета на автобус, а по оси Y — пройденное расстояние, поскольку здесь можно ожидать сильную корреляцию. Ваши данные, вероятно, выглядят совершенно по-другому, но линейная регрессия все равно работает.

Давайте внимательно посмотрим на данные. В нашем случае данные X являются только одномерными, но мы возьмем несколько выборок, поэтому у нас будет n=100 выборок для каждой размерности d=1.

Мы знаем, что уравнение линии y=mx. Мы просто позволяем нашим данным X представлять общий x, а затем нам просто нужно найти m.

Поскольку мы не можем инвертировать матрицу, которая не является квадратной, мы просто делаем X квадратным, умножая его на собственное транспонирование перед инверсией. Чтобы вернуть исходную форму, с помощью математической магии мы снова умножаем на транспонирование и получаем то, что известно как инверсия Мура-Пенроуза.

Хорошо, наконец пришло время для большего количества кода.

Что ж, у нас есть линия… но она еще не совсем соответствует данным. Так что же пошло не так? Уравнение линии, которое мы начали с y=mx, всегда будет проходить через (0,0). Независимо от того, какое значение вы выберете для m при x=0, y должно быть равно 0. Однако линия регрессии, которую мы ожидаем от наших данных, не проходить через (0,0). Поэтому нам нужно скорректировать наше линейное уравнение так, чтобы его значение y при x=0 соответствовало нашему подходу. Мы все знаем из школы, что мы можем просто добавить константу к нашей линейной формуле, чтобы получить y=mx+b.

Как мы идем к этому с нашим текущим уравнением? Давайте посмотрим, что у нас есть на данный момент:

Теперь, если мы просто добавим дополнительное измерение к нашим данным, то заметим, что для того же умножения X и m потребуется, чтобы m было двумерным. также. А умножение матриц выглядит так:

Теперь, если мы установим x[:,1]=1 и рассмотрим m[1] как b, мы получим линейное уравнение с нашим смещением б! Так что нам даже не нужно менять наше уравнение вообще!

Это уже выглядит намного лучше!

Мы не собираемся подробно обсуждать оставшиеся темы. Остальное просто для того, чтобы вы начали и дать вам общее представление.

Ридж-регрессия

Иногда псевдоинверсия может столкнуться с проблемами, которых можно избежать, если мы добавим небольшое значение в нашу матрицу перед вычислением инверсии. Это известно как гребневая регрессия.

Первобытная форма против двойной формы

До сих пор мы реализовывали основную форму. Если мы посмотрим на размеры, то заметим, что матрица, которую мы должны инвертировать, представляет собой квадратную матрицу размерности 2. Как и наши (расширенные) примеры в X.

Однако мы можем точно так же вычислить обратное, изменив порядок транспонирования.

Это известно как двойная форма. Обратите внимание, что матрица, которую необходимо инвертировать, представляет собой квадратную матрицу размера n x n. Это намного дороже вычислять, когда у нас больше выборок, чем измерений в X. Поэтому в большинстве случаев мы хотим избежать этого. Однако может быть полезно получить решения для задач классификации, таких как SVM, поэтому хорошо, что вы видели это раньше.

Регрессия ядра

Теперь мы знаем, как вычислить линейную регрессию. Но часто данные нелинейны… мы могли бы придумать методы нелинейной регрессии. Но мы только что изучили линейную регрессию, так что давайте посмотрим, что мы можем сделать. Если мы добавим несколько измерений к нашим входным данным, мы сможем получить линейную регрессию в более высоком измерении (пространстве признаков). Или линейное разделение, как показано ниже:

Как выглядит эта трансформация? Просто чтобы дать вам представление, простое полиномиальное отображение может выглядеть так:

Ну, это, безусловно, выглядит как много работы для нас и компьютера. Мы перешли от 2-го измерения к 6-му. Мало того, что мы должны сначала вычислить это вложение, все, что мы делаем с этого момента, должно работать с 6-м измерением, а не с 2-м. К счастью, некоторые умные люди заметили, что существуют определенные специальные преобразования. где мы можем свести скалярное произведение в пространстве признаков, которое является новым многомерным пространством, к простой оценке в исходном низкоразмерном пространстве!

Хотя это может показаться не таким уж большим. Это ОГРОМНО. Так, например, полиномиальная функция — это такая специальная ядерная функция (Mercer Kernel). Для простого полиномиального ядра карта признаков уже имеет смехотворно большую размерность:

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

Теперь мы просто берем нашу уже знакомую линейную регрессию и заменяем все скалярные произведения функциями ядра.

Обратите внимание, что мы также должны внедрить вектор, по которому мы оцениваем регрессию, здесь z. Помещая это в код, мы получаем:

Хорошая нелинейная регрессия с использованием трюка с ядром! Для полноты вот код, используемый для графиков: