0
Окт 22
Не могу понять почему не работает Gradient Descend для линейного уравнения типа
у = а + b*х1+c*x2....
В python рассчитывает линейную регрессию, но результат совсем не удовлетворяет.
Gradient Descend по идее должен дать правильный результат, но когда начинаю разбираться то функция objective function при каждой итерации ухудшается вместо того чтобы уменьшаться.
У меня подозрения что мое уравнение нелинейное поэтому так происходит. Как проверить что уравнение соответствует линейности?
Или в чем может быть ошибка?
Опубликовано
12 Окт 2022
Активность
22
ответа
2182
просмотра
7
участников
1
Рейтинг
Можно встречный вопрос, что вы ищете?
судя по всему человек балуется новодным направленим - машинное обучение, и выборка явно не маленькая, и ну надо же - это черный ящик не работает, как ожидалось, и концов не найти. Ну бывает и так))) с высоты своего чайничного уровня, могу только посоветовать перепроверить входные данные, и удалить выбросы для начала. Ну вдргу поможет
Все верно машинное обучение. Пытаюсь воспроизвести пример из статьи, но не получается. Данные искусственные, из нескольких функции без шума, что означает по статье все должно ложиться тютелька в тютельку. Скорее всего я что-то не то делаю. Хотел проверить данные на линейность и точно убедиться что проблема с функциями и подобранными фичами.
ну выкладывай статью. Попробуем попробовать и сравним)
PetroleumEng, для линейного уравнения множественные итерации не нужны
Для поиска минимума loss function и нахождения весов (коэффициентов) методом градиентого спуска нужны.
а зачем тут метод градиентного спуска? если выводится простая линейная формула
[/quote]
а зачем тут метод градиентного спуска? если выводится простая линейная формула
[/quote]
веса (коэффициенты) перед х1, х2...x_n вы каким образом найдете?
Можно конечно все загнать в scikit-learn или другую библиотеку не углубляясь в тонкости, но мы же не знаем, что автор там считает.
Спасибо за комментарии. Пробовал оба способа. Метод градиентного спуска пробовал для того чтобы конкретно проследить весь процесс сходимости.
Решил идти в лоб. Оцифровал из графика статьи данные и запустил линейную регрессию от питона. Результат лучше, но опять не то. Скорее всего проблема в том как рассчитываю через функции входные переменные. Похоже придется капать дальше в этом направлении.
Просто по ссылке https://www.statisticssolutions.com/free-resources/directory-of-statistical-analyses/assumptions-of-multiple-linear-regression/
было указано что для линейной регрессии определенные условия должны быть соблюдены. Посчитал возможно надо проверить данные на эти условия чтобы точно сказать
ох странные люди, для начала надо разобраться что считаем то
вот у вас линейное уравнение относительно параметров
у = а0 + a1*х1+a2*x2....
есть группа значений [(yi, x1i, x2i ..)]
Судя по тому, что вы пытаете метод градиентного спуска, вы мытаетесь применить "Метод Наименьших Квадратов", т.е. минимизировать оценочную функцию
F(a0, a1, a2 ...) = Σ[ (а0 + a1*х1i+a2*x2i +.... - уi)^2]
Что бы функция имела минимальное значение частный производные по параметрам должны быть равны 0, т.е. нужно решить систему
{ ∂ F(a0, a1, a2 ...) / ∂ aj = 0 }
она линейная: (считаем, что x0i, которого нет = 1)
∂ F(a0, a1, a2 ...) / ∂ aj = Σ[ 2 * xji * (а0 + a1*х1i+a2*x2i +.... - уi)] = 0
или
{Σ[ xji * (а0 + a1*х1i+a2*x2i +.... - уi)] = 0}
{Σ[ xji * (а0 + a1*х1i+a2*x2i +....)] = Σ[ xji * уi)]}
что по сути: найти решение для матричного уравнения
M * a = b
что бы оно имело решение, из курса ЛА: "определитель M не должен быть равен 0"
На вики всё расписано
помимо верных комментариев выше - еще 1 вопрос: в многомерной регрессии переменные xi ~ {x1, x2, ..., xn} должны быть независимы друг от друга (если есть попарно-зависимые xi, то нужно оставить одну переменную из каждой такой пары в уравнении регрессии) - вы проверяли наличие связей (корреляции) между отдельными xi ?
Входные переменные xi~{x1, х2, ..., xn} есть результат использования независимых функций где говориться что они соответствуют линейности в том числе что они не зависимы друг от друга. Данные не реальные а симулированные.
ТС четко пишет, что хочет использовать градиентный спуск, а это процесс итеративный. То, что вы предлагаете это аналитическое решение. В данном случае, работает точнее и быстрее, но работать будет не всегда. Например, попробуйте найти аналитическое решение для линейной регрессии с L1 регуляризацией (LASSO).
ТС вообще заморачиваться не хочет. Судя по всему, ему: что-то вставить, что-то получить.
Оно работает всегда, если оно "не работает" - значит данные не соответствуют действительности и считать бессмысленно
Как, например, в ситуации с зависимыми переменными определитель будет 0.
PS: Для гладких функций естественно
В моем случае градиентный спуск не сработал, хотя для линейных уравнений он должен однозначно работать.
скинь табличку просто, здесь же предсказателей нет
Данные под катом
Проблема здесь не в методе, вот табличка с решением
то, что красным, и правее - это проверка
Красная должна быть единичной матрицей, как видим это не так. Да и при расчёте матрицы A не факт, что эксель не напортачил.
Проблема здесь в точности вычислений. Что бы решить эту систему нужно использовать арифметику повышенной точности (целые дроби и пр). Для питона, честно говоря, не знаю таких библиотек, сам он из коробки только с большими целыми числами работать умеет.
Не стал бы доверять эксель в точности расчетов. Хотя матрица почти единичная, если округлить.
В статье был добавлен шум в 5% и сказано что метод устойчив к шумам.
а где ссылка на саму статью?
если я ничего не напутал то вот:
Просто по ссылке https://www.statisticssolutions.com/free-resources/directory-of-statistical-analyses/assumptions-of-multiple-linear-regression/
Так для информации. Выяснил почему метод градиентного спуска не работал как ожидал. Оказывается шаг обучения был слишком высоким. Задавал примерно как 0,5 а алгоритм работал правильно с шагом примерно 0,0005.