Programming Exercise 2: Logistic Regression

глубокое обучение

Это 26-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Требования к названию и ссылки для скачивания материалов:Адрес для скачивания Coursera

Бесполезная информация пропускается, а полезные переводы делаются.

image.png

Файлы, включенные в это упражнение:

  • ex2.m - скрипт Octave/MATLAB
  • ex2_reg.m - скрипт Octave/MATLAB для практики
  • ex2data1.txt — тренировочный набор для первой половины упражнения
  • ex2data2.txt — тренировочный набор для второй половины упражнения
  • submit.m - отправить скрипт задания
  • mapFeature.m — функция для генерации полиномиальных признаков
  • plotDecisionBoundary.m — строит границу решения
  • plotData.m — отображает двухмерные категориальные данные
  • sigmoid.m - сигмовидная функция
  • costFunction.m - функция стоимости логистической регрессии
  • предсказать.м - функция предсказания логистической регрессии
  • costFunctionReg.m - регуляризация функции стоимости логистической регрессии

в

  • Указывает документы, которые необходимо заполнить

1 Logistic Regression

在这里插入图片描述В этой части упражнения вы построите модель логистической регрессии, чтобы предсказать, будет ли студент принят в колледж.

在这里插入图片描述Предположим, вы являетесь администратором в колледже и хотите предсказать шансы каждого абитуриента на поступление, основываясь на результатах двух тестов. Теперь у вас есть данные от предыдущих заявителей в качестве обучающего набора для логистической регрессии. Для каждого образца у вас есть баллы абитуриента и результаты приема на обоих экзаменах. Ваша задача — построить классификационную модель для оценки вероятности поступления абитуриента на основе результатов этих двух экзаменов.

1.1 Visualizing the data

在这里插入图片描述

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

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

Для практики позвольте вам завершить код plotData.m. Но это необязательный вопрос, вам не обязательно это делать, ответ будет дан вам прямо ниже, вы можете скопировать и вставить его прямо.

% Find Indices of Positive and Negative Examples
pos = find(y==1); neg = find(y == 0);
% Plot Examples
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, ...
'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', ...
'MarkerSize', 7);

Скопируйте его прямо в него вот так:在这里插入图片描述После изменения войдите в каталог, где находится функция, и запустите октаву, выполните функцию ex2, и вы увидите, что ваше изображение такое же, как на рисунке 1.在这里插入图片描述

1.2 Реализация

1.2.1 Warmup exercise: sigmoid function

在这里插入图片描述

Перед запуском функции стоимости вспомните, что гипотеза логистической регрессии определяется следующим образом:

hθ(x)=g(θTx),h_{\theta}(x)=g\left(\theta^{T} x\right),

Функция g представляет собой сигмовидную функцию, определяемую следующим образом:

g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}

在这里插入图片描述

在这里插入图片描述Первый шаг — реализовать эту функцию в sigmoid.m, чтобы ее можно было вызывать из остальной части программы. После этого попробуйте проверить некоторые значения, вызвав sigmoid(x) в Otave. Для x, если это большое положительное число, сигмоида должна быть близка к 1; если это большое отрицательное число, сигмоида должна быть близка к 0. сигмоид (0) должен быть 0,5. Ваш код также должен иметь возможность обрабатывать векторы и матрицы. При выполнении сигмовидной функции на матрице она должна работать с каждым элементом. Сделайте эти коммиты. Перейдите на Coursera, чтобы найти токен. я не знаю что делатьProgramming Exercise 1: Linear Regression1.1.

ответ:g = 1 ./ ( 1 + exp( -1 * z ));

Давайте проанализируем это, позвольте вам завершить функцию сигмовидной кривой, о которой упоминалось выше.g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}, теперь это значит ввести х для вас, пусть вы спроситеg(x)=11+exg(x)=\frac{1}{1+e^{-x}}, этот x может быть числом, матрицей или вектором.在这里插入图片描述Давайте посмотрим на исходный вопрос, учитывая эту сигмовидную функцию, возвращаемое значение равно g, первое предложение тела функции состоит в том, чтобы сначала присвоить это возвращаемое значение и дать ему нулевую матрицу, размер матрицы такой же, как z . То есть, если z является матрицей, возвращаемое значение g также является матрицей, а если z является числом, возвращаемое значение g также является числом. Затем вы можете напрямую ввести z в приведенную выше формулу функции.

g = 1 ./ ( 1 + exp( -1 * z ));

  • 1*z-1 * z, который используется для умножения матриц и чисел*, а также используется умножение чисел и чисел*
  • exp()exp(), попрошайничествоene^nэтоexp(n)
  • 1+exp(1*z)1+exp( -1 * z ), матрица и число складываются напрямую с помощью+Вот и все, сложение цифр и цифр+
  • 1./(1+exp(1*z))1 ./ ( 1 + exp( -1 * z )), матричное и числовое деление должны использовать./, так что обратите внимание здесь! ! !
  • Наконец добавьте;Это делается для того, чтобы запущенный процесс не отображал результат g. В октаве, если добавлена ​​точка с запятой, текущий результат не будет отображаться, если точка с запятой не добавлена, результат одного шага будет отображаться после выполнения одного шага.
  • Если вы ничего из этого не помните, то предлагаю вам вспомнить:Краткое руководство по октаве

После записи файл выглядит следующим образом.

在这里插入图片描述

Запустите его с октавой, это точно так же, как и в вопросе:

Для x, если это большое положительное число, сигмоида должна быть близка к 1; если это большое отрицательное число, сигмоида должна быть близка к 0. сигмоид (0) должен быть 0,5.

在这里插入图片描述Отправить это.

я не знаю что делатьProgramming Exercise 1: Linear Regression1.1.

在这里插入图片描述Показывает, что я получил все пять баллов. ОК закончил.

1.2.2 Функция стоимости и градиентный спуск

在这里插入图片描述 在这里插入图片描述

Теперь давайте реализуем функцию стоимости и алгоритм градиентного спуска для логистической регрессии. Введите код в costFunction.m. Функция стоимости:

J(θ)=1m[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]\begin{aligned} J(\theta) =-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right] \end{aligned}

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

J(θ)θj=1mi=1m(hθ(x(i))y(i))xj(i)\frac{\partial J(\theta)}{\partial \theta_{j}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}

ответ:

hx = sigmoid(X*theta);
add = y .* log(hx) + (1 - y) .* log(1 - hx);
J = -1 / m .* sum(add);

for j = 1 : n = length(theta)
  grad(j) = 1 / m .* sum((hx - y) .* X(:,j:j));
endfor

Или сначала проанализируйте данную функцию:在这里插入图片描述Позвольте вам написать функцию costFunction с двумя возвращаемыми значениями J и grad. J — функция стоимости, а grad — частная производная градиентного спуска. Тогда просто следуйте формуле.

hx = sigmoid(X*theta);
add = y .* log(hx) + (1 - y) .* log(1 - hx);
J = -1 / m .* sum(add);
  • hxэтоh(x)h(x), но вы должны понимать, что это логистическая регрессия! ! ! Помните, что это не та же самая формула, что и линейная регрессия! ! ! Просто используйте сигмовидную функцию из предыдущего шага.

(:cry: Я потратил впустую десятки минут, потому что использовал неправильную формулу. Как я ни проверял код, я не получил ни одного балла. Наконец-то нашел меняh(x)h(x)Используя формулу линейной регрессии...

  • addЭто добавление, кусок в формуле суммированияy(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)
  • J- функция конечной стоимости.

Повторно проанализируйте этот фрагмент кода:

for j = 1 : n = length(theta)
  grad(j) = 1 / m .* sum((hx - y) .* X(:,j:j));
endfor
  • grad — частная производная для каждого x. Число x равно числу θ, поэтому длина тета-вектора вычисляется здесь напрямую.
  • Используйте цикл for для записи без градации
  • X(:,j:j): Возьмите j-й столбец всех строк матрицы X. то есть убрать всеxjx_j
  • sum((hx - y) .* X(:,j:j): Просто спросиi=1m(hθ(x(i))y(i))xj(i)\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}
  • 1 / m .* sum((hx - y) .* X(:,j:j)): найти целое1mi=1m(hθ(x(i))y(i))xj(i)\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}

После написания этого:

在这里插入图片描述

Отправьте его, чтобы увидеть:

在这里插入图片描述 在这里插入图片描述Оценка обоих.

1.2.3 Learning parameters using fminunc

Используйте fminunc для изучения параметров (это перевод?)

fminunc помнишь? Для линейной регрессии используется градиентный спуск и нормальные уравнения, а для логистической регрессии — градиентный спуск и другие передовые методы оптимизации. Что касается этого другого расширенного метода оптимизации, используйте fminunc непосредственно в октаве.

在这里插入图片描述 в предыдущем задании, вы нашли оптимальные параметры θ для модели линейной регрессии, реализуя градиентный спуск. Вы пишете функцию стоимости и вычисляете ее градиент, а затем также выполняете шаг градиентного спуска.

В упражнении в предыдущем подразделе (1.2.2 выше) вы также сами написали градиентный спуск для завершения логистической регрессии.

Но на этот раз вы будете использовать функцию fminunc, которая является встроенной функцией Octave/MATLAB и представляет собой функцию расширенной оптимизации для получения оптимального решения.

在这里插入图片描述fminunc Octave/MATLAB — это решатель оптимизации, который находит минимум неограниченной функции.

В частности, fminunc используется для нахождения оптимального параметра θ для функции стоимости логистической регрессии с учетом фиксированного набора данных (значения X и y). Вам нужно передать следующий ввод в fminunc:

  • Начальное значение параметра, который мы пытаемся оптимизировать.
  • Вычислите функцию стоимости логистической регрессии и функцию градиента по отношению к θ для набора данных (X, y) при заданном обучающем наборе и конкретном θ.

在这里插入图片描述. В ex2.m мы написали код для вызова fminunc с правильными аргументами.

在这里插入图片描述 Уведомление: Приведенный выше код был записан для вас в файл ex2.m.Этот код может корректно вызывать функцию fminunc, и вам не нужно писать его самостоятельно.

在这里插入图片描述В этом коде мы сначала определяем параметры, которые будут использоваться с fminunc. Конкретно,

  • Установите для параметра GradObj значение on, которое сообщает fminunc, что наша функция должна возвращать функцию стоимости и градиент. Позволяет fminunc использовать градиенты при минимизации функций.
  • Установите для параметра MaxIter значение 400, чтобы fminunc выполнял до 400 итераций перед завершением.

在这里插入图片描述

Чтобы указать фактическую функцию, которую мы минимизируем, мы используем «сокращение» для указания с помощью @(t) ( costFunction(t, X, y) )Функция. Это создает функцию с параметром t, которая вызывает вашу функцию стоимости. Это можно понимать как предоставление fminunc вызова вашей функции costFunction для совместного использования.

在这里插入图片描述

С fminunc, поскольку это встроенная функция, вам не нужно ничего делать, вам просто нужно предоставить правильную функцию costFunction, которую вы сделали в предыдущем подразделе (1.2.2).

在这里插入图片描述

После выполнения fminunc ex2.m перенесет полученный оптимальный параметр θ в вашу функцию costFunction. Вы должны увидеть, что стоимость составляет около 0,203. Это значение θ также используется для построения границы решения для обучающих данных, в результате чего получается график, аналогичный рисунку 2. Рекомендуется взглянуть на код в plotDecisionBoundary.m, чтобы увидеть, как нарисовать такую ​​границу, используя тета-значения.

在这里插入图片描述 在这里插入图片描述

1.2.4 Оценка логистической регрессии

在这里插入图片描述Теперь вы можете использовать модель, чтобы предсказать, будет ли принят конкретный студент. Для учащегося, набравшего 45 баллов за тест 1 и 85 баллов за тест 2, следует ожидать, что вероятность поступления составит 0,776.在这里插入图片描述在这里插入图片描述Другой способ оценить — посмотреть, насколько хорошо изученная модель предсказывает на нашем тренировочном наборе. Ваша задача состоит в том, чтобы завершить код в predict.m. Учитывая набор данных и изученный вектор параметров θ, функция прогнозирования будет давать прогноз «1» или «0».

После завершения кода в pred.m ex2.m отобразит точность обучения классификатора в процентах.

Затем сдайте задание.

ответ: p = sigmoid(X * theta) >= 0.5;

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

在这里插入图片描述

p = PREDICT(theta, X) computes the predictions for X using a threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1)

Это предложение является ключевым моментом, используйте 0,5 в качестве порога, чтобы увидеть, как предсказывает результат вычисления X.

在这里插入图片描述Хорошо, отправьте его сейчас.在这里插入图片描述Оцените это.

2 Регуляризация логистической регрессии

在这里插入图片描述В этой части упражнения логистическая регрессия упорядочивается, чтобы предсказать, проходят ли заводские чипы проверку качества (QA). В процессе обеспечения качества каждый микрочип проходит различные тесты, чтобы убедиться, что он работает должным образом. Предположим, вы работаете менеджером по продукции на фабрике и у вас есть результаты по двум различным направлениям оценки микрочипов. Из этих двух тестов вы можете решить, соответствует ли микрочип требованиям или нет. Чтобы помочь вам принять решение, у вас есть набор данных результатов испытаний прошлых микрочипов, из которых вы можете построить модель логистической регрессии.加粗样式Используйте другой сценарий, ex2_reg.m, чтобы выполнить эту часть упражнения.

То есть это упражнение отличается от предыдущей части, и теперь используется скрипт ex2_reg.m.

2.1 Визуализация данных

在这里插入图片描述

Как и в предыдущих разделах, plotData используется для создания графика, подобного рисунку 3, где оси представляют собой результаты двух тестов с положительными (y = 1, принятие) и отрицательными (y = 0, отклоненными) примерами, показанными с разными маркерами. .

在这里插入图片描述Рисунок 3 показывает, что наш набор данных нельзя разделить на положительные и отрицательные примеры прямой линией. Следовательно, прямое применение логистической регрессии не дает хороших результатов в этом наборе данных, поскольку логистическая регрессия может найти только линейные границы решений.

2.2 Отображение функций

在这里插入图片描述

Один из способов лучше подогнать данные — создать больше функций из каждой точки данных. В предоставленной функции mapFeature.m мы будем отображать функции во все полиномиальные члены x1 и x2 до шестой степени.

 mapFeature (x)=[1x1x2x12x1x2x22x13x1x25x26]\text { mapFeature }(x)=\left[\begin{array}{c} 1 \\ x_{1} \\ x_{2} \\ x_{1}^{2} \\ x_{1} x_{2} \\ x_{2}^{2} \\ x_{1}^{3} \\ \vdots \\ x_{1} x_{2}^{5} \\ x_{2}^{6} \end{array}\right]

在这里插入图片描述

В результате этого сопоставления два наших вектора признаков (оценки двух тестов обеспечения качества) были преобразованы в 28-мерный вектор. Классификатор логистической регрессии, обученный на этом многомерном векторе признаков, будет иметь более сложные границы решений и будет демонстрировать нелинейность при построении на нашем двумерном графике. Хотя карты функций позволяют нам создавать более выразительные классификаторы, они также более подвержены переоснащению. В следующей части упражнения вы реализуете регуляризованную логистическую регрессию, чтобы подогнать данные, и сами убедитесь, как регуляризация может помочь при переоснащении.

2.3 Функция стоимости и градиент

在这里插入图片描述Теперь реализуйте код для вычисления функции стоимости и градиента для обычной логистической регрессии. Завершите код в costFunctionReg.m, чтобы вернуть стоимость и градиент. Напомним, что регуляризованная функция затрат в логистической регрессии имеет вид

J(θ)=1mi=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]+λ2mj=1nθj2=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+λ2mj=1nθj2J(\theta)=\frac{1}{m} \sum_{i=1}^{m}\left[-y^{(i)} \log \left(h_{\theta}\left(x^{(i)}\right)\right)-\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]+\frac{\lambda}{2 m} \sum_{j=1}^{n} \theta_{j}^{2} \\= - \frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \left(h_{\theta}\left(x^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]+\frac{\lambda}{2 m} \sum_{j=1}^{n} \theta_{j}^{2}

Обратите внимание, что параметры не должны быть нормализованыθ0θ_0. Помните, что в Octave/MATLAB индексы начинаются с 1, поэтому вам не следует упорядочивать параметр theta(1) в вашем коде (соответствующийθ0θ_0). Градиент функции стоимости представляет собой вектор, гдеjthj^{th}Элементы определяются следующим образом:

J(θ)θ0=1mi=1m(hθ(x(i))y(i))xj(i) for j=0J(θ)θj=(1mi=1m(hθ(x(i))y(i))xj(i))+λmθj for j1\begin{aligned} &\frac{\partial J(\theta)}{\partial \theta_{0}}=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} \quad \text { for } j=0\\ &\frac{\partial J(\theta)}{\partial \theta_{j}}=\left(\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}\right)+\frac{\lambda}{m} \theta_{j} \quad \text { for } j \geq 1 \end{aligned}

在这里插入图片描述После написания кода вызовите ex2_reg.m, и результат будет около 0,693.

Отвечать:

n = size(theta);

hx = sigmoid(X*theta);
sum1 = sum(y .* log(hx) + (1 - y) .* log(1 - hx));
sum2 = sum(theta(2:n) .^ 2);
J = -1 / m * sum1 + lambda / (2 * m) * sum2;

grad(1) = 1 / m .* sum((hx - y) .* X(1));

for j = 2:n
  grad(j) = 1 / m .* sum((hx - y) .* X(:,j:j)) + lambda / m .* theta(j);
endfor

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

Запустив его, результат равен 0,693.

在这里插入图片描述Отправьте полный балл. Это здесь. Позвольте мне перевести остальные, когда у меня будет время.

在这里插入图片描述