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

Следующее работает, если fgets() «пропущен» после использования scanf()

После того, как вы сказали:

scanf("%d", &loops);

Скажите:

char garbage[100];

fgets(garbage,100,stdin);

Это сохранит все, что осталось на входном буфере, в переменную мусора.

Это эффективно очистит входной буфер и позволит вам впоследствии использовать fgets().

EDIT: I недавно выяснили, что есть более легкое решение, чем выше. Если вы скажете getchar () после scanf (), это позволит вам использовать fgets () без проблем. getchar () получит следующий символ во входном буфере, который в этом случае будет «\n». После удаления '\n' из входного буфера fgets должен работать нормально.

2
задан Adnan Toky 18 March 2019 в 15:57
поделиться

3 ответа

Вот как я вижу градиентный спуск: представьте, что вы находитесь высоко на скалистом склоне горы в тумане. Из-за тумана вы не можете увидеть самый быстрый путь вниз по горе. Итак, вы оглядываетесь вокруг и опускаетесь, основываясь на том, что видите поблизости. Сделав шаг, вы снова оглядываетесь вокруг и делаете еще один шаг. Иногда это может привести вас в ловушку в небольшом низком месте, где вы не сможете увидеть путь вниз (локальный минимум), а иногда это безопасно приведет вас к подножию горы (глобальный минимум). Запуск из разных случайных мест на туманном склоне горы может заманить вас в ловушку в разных локальных минимумах, хотя вы можете безопасно спуститься вниз, если случайный стартовый пункт хорош.

0
ответ дан James Phillips 18 March 2019 в 15:57
поделиться

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

Вы выполнили пять итераций градиентного спуска всего за 5 обучающих выборок с (вероятно, разумной) скоростью обучения 0,01. То есть не не должен привести вас к «окончательному» решению вашей проблемы - вам нужно будет сделать много итераций градиентного спуска, как вы реализовали, повторяя процесс до thetas сходятся к стабильному значению. Тогда имеет смысл сравнить полученные значения.

Замените 5 в for i in range(5) на 5000, а затем посмотрите, что происходит. Для иллюстрации того, насколько быстро процесс сходится к решению, может быть наглядно представить график уменьшения функции ошибки / стоимости.

0
ответ дан Peteris 18 March 2019 в 15:57
поделиться

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

0
ответ дан Ritaprava Dutta 18 March 2019 в 15:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: