Это 26-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Требования к названию и ссылки для скачивания материалов:Адрес для скачивания Coursera
Бесполезная информация пропускается, а полезные переводы делаются.
Файлы, включенные в это упражнение:
- 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
Перед запуском функции стоимости вспомните, что гипотеза логистической регрессии определяется следующим образом:
Функция g представляет собой сигмовидную функцию, определяемую следующим образом:
Первый шаг — реализовать эту функцию в sigmoid.m, чтобы ее можно было вызывать из остальной части программы. После этого попробуйте проверить некоторые значения, вызвав sigmoid(x) в Otave. Для x, если это большое положительное число, сигмоида должна быть близка к 1; если это большое отрицательное число, сигмоида должна быть близка к 0. сигмоид (0) должен быть 0,5. Ваш код также должен иметь возможность обрабатывать векторы и матрицы. При выполнении сигмовидной функции на матрице она должна работать с каждым элементом.
Сделайте эти коммиты. Перейдите на Coursera, чтобы найти токен. я не знаю что делатьProgramming Exercise 1: Linear Regression1.1.
ответ:g = 1 ./ ( 1 + exp( -1 * z ));
Давайте проанализируем это, позвольте вам завершить функцию сигмовидной кривой, о которой упоминалось выше., теперь это значит ввести х для вас, пусть вы спросите, этот x может быть числом, матрицей или вектором.Давайте посмотрим на исходный вопрос, учитывая эту сигмовидную функцию, возвращаемое значение равно g, первое предложение тела функции состоит в том, чтобы сначала присвоить это возвращаемое значение и дать ему нулевую матрицу, размер матрицы такой же, как z . То есть, если z является матрицей, возвращаемое значение g также является матрицей, а если z является числом, возвращаемое значение g также является числом. Затем вы можете напрямую ввести z в приведенную выше формулу функции.
g = 1 ./ ( 1 + exp( -1 * z ));
-
, который используется для умножения матриц и чисел
*
, а также используется умножение чисел и чисел*
-
, попрошайничествоэто
exp(n)
-
, матрица и число складываются напрямую с помощью
+
Вот и все, сложение цифр и цифр+
-
, матричное и числовое деление должны использовать
./
, так что обратите внимание здесь! ! ! - Наконец добавьте
;
Это делается для того, чтобы запущенный процесс не отображал результат g. В октаве, если добавлена точка с запятой, текущий результат не будет отображаться, если точка с запятой не добавлена, результат одного шага будет отображаться после выполнения одного шага. - Если вы ничего из этого не помните, то предлагаю вам вспомнить:Краткое руководство по октаве
После записи файл выглядит следующим образом.
Запустите его с октавой, это точно так же, как и в вопросе:
Для x, если это большое положительное число, сигмоида должна быть близка к 1; если это большое отрицательное число, сигмоида должна быть близка к 0. сигмоид (0) должен быть 0,5.
Отправить это.
я не знаю что делатьProgramming Exercise 1: Linear Regression1.1.
Показывает, что я получил все пять баллов. ОК закончил.
1.2.2 Функция стоимости и градиентный спуск
Теперь давайте реализуем функцию стоимости и алгоритм градиентного спуска для логистической регрессии. Введите код в costFunction.m. Функция стоимости:
Градиентный спуск:
ответ:
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
это, но вы должны понимать, что это логистическая регрессия! ! ! Помните, что это не та же самая формула, что и линейная регрессия! ! ! Просто используйте сигмовидную функцию из предыдущего шага.
(:cry: Я потратил впустую десятки минут, потому что использовал неправильную формулу. Как я ни проверял код, я не получил ни одного балла. Наконец-то нашел меняИспользуя формулу линейной регрессии...
-
add
Это добавление, кусок в формуле суммирования -
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. то есть убрать все -
sum((hx - y) .* X(:,j:j)
: Просто спроси -
1 / m .* sum((hx - y) .* X(:,j:j))
: найти целое
После написания этого:
Отправьте его, чтобы увидеть:
Оценка обоих.
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 до шестой степени.
В результате этого сопоставления два наших вектора признаков (оценки двух тестов обеспечения качества) были преобразованы в 28-мерный вектор. Классификатор логистической регрессии, обученный на этом многомерном векторе признаков, будет иметь более сложные границы решений и будет демонстрировать нелинейность при построении на нашем двумерном графике. Хотя карты функций позволяют нам создавать более выразительные классификаторы, они также более подвержены переоснащению. В следующей части упражнения вы реализуете регуляризованную логистическую регрессию, чтобы подогнать данные, и сами убедитесь, как регуляризация может помочь при переоснащении.
2.3 Функция стоимости и градиент
Теперь реализуйте код для вычисления функции стоимости и градиента для обычной логистической регрессии. Завершите код в costFunctionReg.m, чтобы вернуть стоимость и градиент. Напомним, что регуляризованная функция затрат в логистической регрессии имеет вид
Обратите внимание, что параметры не должны быть нормализованы. Помните, что в Octave/MATLAB индексы начинаются с 1, поэтому вам не следует упорядочивать параметр theta(1) в вашем коде (соответствующий). Градиент функции стоимости представляет собой вектор, гдеЭлементы определяются следующим образом:
После написания кода вызовите 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.
Отправьте полный балл. Это здесь. Позвольте мне перевести остальные, когда у меня будет время.