Вопрос или проблема
Я довольно нов в МЛ и начинал с линейной регрессии, сочетая её с градиентным спуском.
Вот уравнение, к которому я пытался прийти, используя 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
Ваш код имеет правильную основу для реализации градиентного спуска, однако присутствует ошибка в вычислении функции потерь. Вы правильно обнаружили, что не нужно возводить в квадрат разность между гипотезой и фактическим значением.
Исправления:
- Уберите возведение в квадрат в функции
hypotheses
и в функцииhypothesesWithMult
. - Убедитесь, что вы также правильно реализовали вычисление градиента для каждого из параметров.
Пример исправленной функции:
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) {
// Конвергенция достигнута
}
Заключение
Линейная регрессия и градиентный спуск являются основами многих алгоритмов машинного обучения. Понимание их работы позволит вам успешно реализовывать различные модели и решать практические задачи. Убедитесь, что ваши алгоритмы правильно реализованы и постоянно следите за их производительностью.