Уравнения линейной регрессии и градиентного спуска

Вопрос или проблема

Я довольно нов в МЛ и начинал с линейной регрессии, сочетая её с градиентным спуском.

Вот уравнение, к которому я пытался прийти, используя JavaScript –

вставьте описание изображения сюда

А вот что у меня получилось на JS –

      function algorithmify(){
    let sumHDiff=hypotheses();
    if(Math.round(hypotheses())!=0){
      let sumHDiffMult=hypothesesWithMult();
      T0-=0.0001*sumHDiff/points;
      T1-=0.0001*sumHDiffMult/points;
      
      console.log(T0,T1);
    }
  }
  
  function hypotheses(){
    let sum=0;
    for(var i=0;i<points;i++){
      let hypo=T0+(T1*X[i]);
      let diff=hypo-Y[i];
      diff*=diff;
      sum+=diff;
    }
    return sum;
  }
  function hypothesesWithMult(){
    let sum=0;
    for(var i=0;i<points;i++){
      let hypo=T0+(T1*X[i]);
      let diff=hypo-Y[i];
      diff*=diff;
      mult=diff*X[i];
      sum+=mult;
    }
    return sum;
  }

Я попытался сопоставить код с уравнением, и хотя я не очень хорошо назвал переменные, я уверен, что он правильно соответствует уравнению.

Но результат $T0$ и $T1$, представляющие theta 0 и theta 1, сначала выводит очень большие отрицательные числа, а после нескольких итераций выводит $-infinity$ в оба раза.

Любая помощь будет очень appreciated!

Нашел решение! В уравнении нет возведения суммы в квадрат, но не знаю, почему я добавил это.

Удаление этого исправило проблему. Тем не менее, я все еще не уверен, когда данные сходятся.

Ответ или решение

Линейная регрессия и уравнения градиентного спуска

Линейная регрессия — это статистический метод, который используется для моделирования взаимосвязи между независимой переменной (или переменными) и зависимой переменной. Формально, уравнение линейной регрессии можно представить в виде:

[ Y = T_0 + T_1 \cdot X ]

где:

  • ( Y ) — зависимая переменная,
  • ( X ) — независимая переменная,
  • ( T_0 ) — свободный член (или смещение),
  • ( T_1 ) — коэффициент регрессии (наклон).

Градиентный спуск

Градиентный спуск — это итеративный метод оптимизации, который используется для нахождения минимальных значений функции потерь, в данной ситуации — среднеквадратичной ошибки. Функция потерь определяется как:

[ L(T_0, T1) = \frac{1}{m} \sum{i=1}^{m} (h(X_i) – Y_i)^2 ]

где:

  • ( m ) — количество обучающих примеров,
  • ( h(X_i) = T_0 + T_1 \cdot X_i ) — гипотеза (предсказание).

Обновление параметров

В процессе обучения мы обновляем параметры ( T_0 ) и ( T_1 ) с помощью следующего правила:

[
T_0 = T_0 – \alpha \cdot \frac{\partial L}{\partial T_0}
]
[
T_1 = T_1 – \alpha \cdot \frac{\partial L}{\partial T_1}
]

где ( \alpha ) — скорость обучения.

Градиенты вычисляются по следующим формулам:

[
\frac{\partial L}{\partial T0} = \frac{2}{m} \sum{i=1}^{m} (h(X_i) – Y_i)
]
[
\frac{\partial L}{\partial T1} = \frac{2}{m} \sum{i=1}^{m} (h(X_i) – Y_i) \cdot X_i
]

Анализ вашего кода на JavaScript

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

Исправления:

  1. Уберите возведение в квадрат в функции hypotheses и в функции hypothesesWithMult.
  2. Убедитесь, что вы также правильно реализовали вычисление градиента для каждого из параметров.

Пример исправленной функции:

function hypotheses(){
    let sum = 0;
    for (var i = 0; i < points; i++) {
        let hypo = T0 + (T1 * X[i]);
        let diff = hypo - Y[i];
        sum += diff; // Здесь убраны квадратные операции
    }
    return sum / points; // Возврат среднего значения
}

function hypothesesWithMult(){
    let sum = 0;
    for (var i = 0; i < points; i++) {
        let hypo = T0 + (T1 * X[i]);
        let diff = hypo - Y[i];
        sum += diff * X[i]; // Здесь также убраны квадратные операции
    }
    return sum / points; // Возврат среднего значения
}

Конвергенция

Определение конвергенции в градиентном спуске может быть осуществлено различными способами. Один из них — отслеживать изменение значений параметров ( T_0 ) и ( T_1 ). Если изменения становятся меньше заранее заданного порога, можно считать, что алгоритм сошелся. Вот пример:

if (Math.abs(oldT0 - T0) < threshold && Math.abs(oldT1 - T1) < threshold) {
    // Конвергенция достигнута
}

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...