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

Я пытаюсь создать функцию, которая возвращает значение &theta;<sub>0</sub> & &theta;<sub>1</sub> функции гипотезы линейной регрессии. Но я получаю разные результаты для разных начальных (случайных) значений &theta;<sub>0</sub> & &theta;<sub>1</sub>.

Что не так в коде?

training_data_set = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]
initial_theta = [1, 0]


def gradient_descent(data, theta0, theta1):
    def h(x, theta0, theta1):
        return theta0 + theta1 * x

    m = len(data)
    alpha = 0.01

    for n in range(m):
        cost = 0
        for i in range(m):
            cost += (h(data[i][0], theta0, theta1) - data[i][1])**2

        cost = cost/(2*m)

        error = 0
        for i in range(m):
            error += h(data[i][0], theta0, theta1) - data[i][1]

        theta0 -= alpha*error/m
        theta1 -= alpha*error*data[n][0]/m

    return theta0, theta1


for i in range(5):
    initial_theta = gradient_descent(training_data_set, initial_theta[0], initial_theta[1])


final_theta0 = initial_theta[0]
final_theta1 = initial_theta[1]

print(f'theta0 = {final_theta0}\ntheta1 = {final_theta1}')

Выход:

When initial_theta = [0, 0]

theta0 = 0.27311526522692103
theta1 = 0.7771301328221445


When initial_theta = [1, 1]

theta0 = 0.8829506006170339
theta1 = 0.6669442287905096

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

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

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

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

1 голос
/ 18 марта 2019

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

1 голос
/ 18 марта 2019

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

...