Уловка картографа XIX века, основанная на современных линейных моделях и симуляциях Монте-Карло
Андре-Луи Холески представляет собой причуду среди математиков: его работа была опубликована посмертно после того, как он погиб в бою во время Первой мировой войны. Он открыл метод линейной алгебры, который носит его имя благодаря его работе в качестве создателя карт конца 19 века, но он продолжает оставаться эффективным трюком, который питает многие модели машинного обучения. В этой статье будут обсуждаться математические основы метода и показаны два приложения к линейной регрессии и моделированию Монте-Карло.
Как это работает
Я постараюсь сделать линейную алгебру краткой, но это неизбежно: осознайте, что линейная алгебра - это просто метод эффективного решения систем уравнений, а также осознайте, что передовые методы линейной алгебры являются основой машинного обучения. Помимо извинений, давайте перейдем к делу.
Разложение Холецкого сводит симметричную матрицу к нижнетреугольной матрице, которая при умножении на транспонирование дает исходную симметричную матрицу. Если это не имело смысла, то вот как это выглядит:
from numpy import array from numpy.linalg import cholesky # define a 3x3 matrix A = array([[36, 30, 18], [30, 41, 23], [18, 23, 14]]) print(L) # Cholesky decomposition L = cholesky(A) print(L) print(L.T) # reconstruct B = L.dot(L.T) print(B)
Интуиция этого метода немного усложняется - я представлю его здесь, но это будет та часть сообщения, которую стоит пропустить из-за ловкости сердца - забавные вещи (приложения) ниже). Мы будем использовать обозначение A [1,1] для обозначения строки = 1, столбца = 1 в матрице A.
Разложение Холецкого - итеративный процесс. Я буду придерживаться обозначений систем уравнений ниже, но когда мы дойдем до третьей строки, вы увидите, что запись этого с помощью линейной алгебры будет иметь большой смысл. Эта запись хорошо объясняет нотацию матричной алгебры. Обратите внимание, что есть и другие методы для нахождения разложения Холецкого - Википедия объясняет несколько. Все следуют одинаковому типу потока.
Ладно, и что? Теперь самое интересное: с помощью разложения Холецкого мы можем решать системы уравнений любого размера за 2 шага. Предположим, мы хотим найти a, b и c: помните, что это также можно записать в виде системы из трех уравнений.
Обычно мы складываем 3 уравнения друг на друга, решаем одну переменную, зависящую от двух других, подключаем ее и т. Д. Используя разложение Холецкого, у нас есть гораздо более эффективный метод.
Матрица 3x3 немного разочаровывает, но мы уже можем начать оценивать эффективность этого метода на очень большой матрице.
Приложения - регрессия наименьших квадратов
Линейная регрессия имеет вид Y = X * β, где Y - вектор зависимых переменных, а X - вектор независимых переменных. Регрессия наименьших квадратов относится к нахождению вектора β, в котором квадраты разностей между прогнозируемыми и фактическими значениями Y (т.е. RSS = «Остаточная сумма квадратов» или «Сумма квадратов ошибок») сведены к минимуму.
Если это не имеет смысла, сосредоточьтесь на одном выводе: разложение Холецкого примерно вдвое эффективнее, чем другие методы решения систем линейных уравнений.
Приложения - моделирование методом Монте-Карло
Самое крутое приложение я оставил напоследок. Представьте, что вы хотите сгенерировать много коррелированных нормальных случайных величин, но не хотите иметь дело с массивной многомерной нормой. Разложение Холецкого позволяет моделировать некоррелированные нормальные переменные и преобразовывать их в коррелированные переменные noraml - круто!
Предположим, 3 нормальные (0,1) случайные величины, мы хотим следовать ковариационной матрице ниже, представляющей лежащие в основе матрицы корреляции и стандартного отклонения:
Мы находим разложение Холецкого ковариационной матрицы и умножаем его на матрицу некоррелированных случайных величин, чтобы создать коррелированные переменные.
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt x_uncor = np.random.normal(0, 1, (3, 10000)) cov = np.array([[ 10.0, -2.00, 2.00], [-2.00, 20.00, 0.50], [ 2.00, 0.50, 0.50]]) L = np.linalg.cholesky(cov) x_cor = np.dot(L, x_uncor) corr_simulated = pd.DataFrame(x_cor).T.corr() std_ = np.sqrt(np.diag(cov)) corr_empirical = cov / np.outer(std_, std_) x_uncor = pd.DataFrame(x_uncor.T) x_cor = pd.DataFrame(x_cor.T) sns.pairplot(x_uncor, kind="reg") sns.pairplot(x_cor, kind="reg")
Вуаля! Идем от некоррелированных:
Чтобы соотнести:
В соответствии с матрицами корреляции и стандартного отклонения, представленными выше, столбцы 0 и 2 имеют строго положительную корреляцию, 0 и 1 - слегка отрицательную, 1 и 2 - слегка положительную. Стандартное отклонение переменной 2 содержится, в то время как 0 и 1 намного шире.
Обратите внимание, что это не работает таким же образом для ненормальных случайных величин. В приведенном выше примере наши коррелированные переменные сохранили нормальное распределение. Если мы применим этот метод к случайным величинам, генерируемым гамма-излучением, мы увидим, что процесс не выполняется.
Некоррелированная гамма (1, 5) - все в порядке.
И коррелировано:
Здесь мы видим, что переменные больше не имеют гамма-распределения - это наиболее очевидный признак того, что переменная 1 принимает отрицательные значения, в то время как гамма-распределение строго положительно. Существует простое приближение с задним ходом, которое включает моделирование коррелированных случайных величин, нахождение их обратных величин и последующее извлечение из желаемого распределения с использованием значений обратно-коррелированных нормальных величин. Это не совсем так, но работа может быть выполнена. Точные методы обычно довольно экзотичны.
Заключение
Разложение Холецкого - это хитрый прием, лежащий в основе многих приложений машинного обучения, два из которых были описаны здесь: регрессия по методу наименьших квадратов и моделирование Монте-Карло с использованием коррелированных нормальных переменных. Хотя линейная алгебра может быть немного пугающей, важно помнить, что это просто эффективный метод записи систем линейных уравнений, и что понимание методов линейной алгебры на высоком уровне имеет решающее значение для понимания современных алгоритмов машинного обучения.