Основы машинного обучения — вывод формул линейной регрессии

машинное обучение

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


Суть линейной регрессии на самом делестатистикаСреди них метод регрессионного анализа исследуетЛинейная связь между независимыми и зависимыми переменными. Позже может оказаться, что процесс моделирования и метод обучения модели ближе к концепции машинного обучения, поэтому в последние годы эта модель была отнесена к области машинного обучения. Однако к какой бы области она ни относилась, идея всей модели не изменилась. Нам просто нужно кое-что знать.


концепция модели


Определение линейной регрессии очень простое, ее простейшая форма на самом делеСистема линейных уравнений с одной переменной. Например, у нас есть следующая формула:

y=wx+b

Мы знаем число x и y и требуем w и b. Решение очень простое, проходимМетод исключения, вы можете легко найти w и b.


Делаем две деформации по приведенной выше формуле, первая деформация нашаНезависимая переменная x больше не является единственным значением, а представляет собой матрицу m * n.. m представляет количество выборок, а n представляет количество функций, которые мы записываем как X. Каждая строка матрицы X представляет собой n-мерный вектор-строку, представляющий выборку. Его коэффициент W больше не значение, а вектор-столбец n*1, каждое измерение которого представляет вес этого измерения в выборке. Запишем приведенную выше формулу в форме умножения матриц:

Y=XW+b

Y, X и W в формуле — матрицы m * 1, m * n и n * 1 соответственно.


Здесь следует отметить два момента: во-первых, мы можем трактовать b здесь как параметр с плавающей запятой, ноНа самом деле это также матрица m * 1 (вектор-столбец). Но это не имеет значения, даже если мы используем числа с плавающей запятой, потому что, когда мы реализуем модель, numpy или TensorFlow или какой-либо другой фреймворк будут автоматически использоватьтранслироватьПреобразуйте его в вектор для добавления.


Второй момент заключается в том, что X здесь пишется перед W, что такжеДля удобства расчета умножения матриц. Конечно, мы также можем транспонировать и X, и W и записать это как WX, но полученный таким образом результат представляет собой вектор-строку размером 1 * м. Если мы хотим сравнить с Y, нам нужно снова транспонировать. Поэтому для простоты мы меняем порядок X и W на противоположный. Так что не смущайтесь, это очевидно WX+b, как это написать, и это становится XW+b.


После того, как мы перечислим формулу, цель очень ясна, то есть получить W и b путем вычислений, чтобы формула была установлена. Но перед этим нам нужно прояснить одну вещь: в реальных сценариях инженерных приложенийНевозможно найти такие W и b, что XW+b в точности равно Yиз. Поскольку в данных реальной сцены есть ошибки, точного решения нет Мы можем только согласиться на следующее лучшее решение и искать наиболее точное решение.


Метод наименьших квадратов и среднеквадратическая ошибка


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


Вероятность и статистика — ожидание, дисперсия и метод наименьших квадратов


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


Для регрессионных моделей прогнозируемой целью являетсяконкретное значение. Очевидно, что чем ближе прогнозируемое значение к фактическому значению, тем лучше. Мы предполагаем, что прогнозируемое значение равно\hat{y}, истинное значение равно y, что, очевидно, должно быть|y-\hat{y}|Чем меньше, тем лучше.


Но вычисление абсолютного значения очень громоздкое и неудобное для вывода, поэтому мы обычно возводим его в квадрат, а именно:(y-\hat{y})^2минимум. Для m выборок мы хотим, чтобы их сумма квадратов была как можно меньше:\sum_{i=1}^m(y_i - \hat{y_i})^2.


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


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


Поиск наилучших параметров, чтобы сделать среднеквадратичную ошибку как можно меньше, - это метод наименьших квадратов..


Процесс получения


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


Если мы посмотрим на среднеквадратичную ошибку, мы можем записать ее полностью:(Y-(XW+b))^2, если мы рассматриваем W как переменную, это на самом деле обобщенная квадратичная функция. Как найти минимальное значение квадратичной функции? Конечно, это руководство.


Прежде чем приступить к выводу, мы сначала делаем простую деформацию среднеквадратичной ошибки: мы пытаемся избавиться от b и сделать формулу как можно более краткой.


Сначала мы добавляем столбец 1 к X, то есть превращаем X в матрицу m * (n+1), ее первый столбец — константа 1, а новая матрица записывается какX_{new}


Точно так же мы добавляем строку к W, и ее первая строка записывается как b, и мы записываем новую матрицу как\theta, мы можем получить:


XW+b = X_{new}\theta=\left[ \begin{matrix} 1 & x_{11} & x_{12} & \cdots & x_{1n}\\ 1 & x_{21} & x_{22} & \cdots & x_{2n}\\ \vdots & \vdots & \vdots & \vdots & \vdots\\ 1 & x_{m1} & x_{m2} & \cdots & x_{mn} \end{matrix} \right] \cdot \left[ \begin{matrix} b & w_1 & w_2 \cdots w_n \end{matrix} \right]

После этого деформируем среднеквадратичную ошибку:

J(\theta) = \frac{1}{2m}\sum_{i=1}^m(x_i\cdot \theta - y_i)^2

где m - количество выборок,является константой, мы умножаем среднеквадратичную ошибку на этот коэффициент и он не влияет\thetaзначение . этоJ(\theta)Мы часто говорим, что это функция потерь модели, и смысл, который она здесь представляет, таков:1/2 среднего значения всех выборочных средних квадратов.


здесьПотери фактически означают ошибку, чем меньше значение функции потерь, тем меньше погрешность модели и тем ближе она к реальному результату..


мы рассчитываемJ(\theta)правильно\thetaПроизводное от :

\frac{\partial J(\theta)}{\partial \theta}=\frac{1}{m}X^T(X\theta - Y)

Делаем производную равной 0, так как m постоянно, ее можно исключить, и получаем:

\begin{aligned} X^T(X\theta - Y) &= 0 \\ X^TX\theta &= X^TY \\ \theta &= (X^T \cdot X)^{-1}X^TY \end{aligned}

Описанный выше процесс вывода может показаться сложным на первый взгляд, но на самом делене сложно. Простой вывод для частичного вывода, мы можем написать оптимальное\thetaзначение .


По этой формуле посчитать не сложно, неужели все так просто? Попробуем поэкспериментировать с кодом.


эксперимент с кодом


Для простоты мы ориентируемся на самый простой сценарий: в образце есть только одна функция, и мы сначала пытаемся сами создать пакет данных:


import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

import matplotlib.pyplot as plt
plt.scatter(X, y)

Сначала мы генерируем сто x в диапазоне от 0 до 2, а затем y = 3x + 4. Чтобы смоделировать реальную сцену ошибки, мы добавляем ошибку в диапазоне от 0 до 1 к y.


Такую картинку мы можем получить, прорисовав указанные выше точки через plt:

Тогда мы можем непосредственно вычислить по приведенной выше формуле\thetaЗначение :


def get_theta(x, y):
    m = len(y)
    # x中新增一列常数1
    x = np.c_[np.ones(m).T, x]
    # 通过公式计算theta
    theta = np.dot(np.dot(np.linalg.inv(np.dot(x.T, x)), x.T), y)
    return theta

Мы передаем x и y, чтобы получить\theta, распечатайте его, вы обнаружите, что он очень близок к тому, что мы установили:



Наконец, мы наносим результаты подгонки модели и распределения реальных выборок на графике:


# 我们画出模型x在0到2区间内的值
X_new = np.array([[0],[2]])
# 新增一列常数1的结果
X_new_b = np.c_[np.ones((2, 1)), X_new]
# 预测的端点值
y_predict = X_new_b.dot(theta)

# 画出模型拟合的结果
plt.plot(X_new, y_predict,"r-")
# 画出原来的样本
plt.scatter(X,y)
plt.show()

Полученный результат выглядит следующим образом:


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


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


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


Причина тоже очень проста, первая причина в том, что мы вычисляем\thetaиспользуется в формулеОбратная матрицаоперация. В предыдущей статье о линейной алгебре мы сказали:Только матрицы полного ранга имеют обратные матрицы. еслиX^T \cdot X— сингулярная матрица, то у нее нет обратной матрицы и, естественно, эту формулу нельзя использовать.


Конечно, эта проблема не является неразрешимой.X^T \cdot Xявляется сингулярной матрицей. Условие состоит в том, что матрицаXсредиЕсть строка или столбец со всеми 0. мы проходимПредварительная обработка функций, этого можно избежать. Поэтому неспособность выборки вычислить обратную матрицу — лишь одна из причин, а не самая критическая проблема.


Самый принципиальный вопрос -сложность, хотя у нас, кажется, только одна строка кода ядра выше, на самом деле, поскольку мы используем вычисление обратной матрицы, накладные расходы за ним очень большие,X^T \cdot XРезультатом является матрица n*n, где n — размер объекта. Такая матрица вычисляет обратную матрицуСложность примерноn^{2.4}прибытьn^3между. По мере того, как мы увеличиваем использование функций, время, затрачиваемое на весь процесс, увеличивается экспоненциально, и во многих случаях размер нашей выборки также очень велик, мыТакже будут значительные накладные расходы при вычислении матричного умножения..


Именно по этим причинам мы обычно не используем метод прямого расчета по формуле для нахождения параметров модели.


Итак, вопрос в том, если мы не вычисляем это напрямую по формуле, есть ли другой способ решить это?


Ответ, конечно, да, из-за нехватки места мы поместим его в следующей статье.


Сегодняшняя статья здесь,Отсканируйте QR-код ниже, обратите внимание на мой публичный аккаунт в WeChat, получайте больше статей, ваша поддержка — моя самая большая мотивация.