Написание моего первого алгоритма машинного обучения с нуля

(Примечание: мои следующие публикации о R и Python для машинного обучения будут связаны с работой, которую я выполняю для своего финального проекта для обоих своих магистерских курсов. Поэтому я собираюсь отложить публикацию результатов в своем блоге. пока занятия не закончатся)

В «Монти Пайтон и Святой Грааль» есть довольно известная сцена, где группа рыцарей натыкается на кроличье логово. Пещера окружена костями, и их проводник предупреждает их, что «милый маленький кролик» на самом деле убийца-садист. Группа считает, что они более чем способны справиться с угрозой, поэтому они посылают одного из своих людей — и его быстро убивает кровожадный кролик. Группа, теперь веря в угрозу, но все еще игнорируя предупреждения, решает атаковать в полном составе. Закончится предсказуемо:

В связи с этим я решил запустить онлайн-программу сертификатов машинного обучения Корнельского университета. На первый взгляд это выглядело как хорошее дополнение к моей программе магистра наук о данных в области здравоохранения — сертификат, более конкретно ориентированный на алгоритмы и теорию машинного обучения, тогда как магистерская программа больше ориентирована на практическое применение. Это казалось идеальным дополнением. (И в этом я не ошибся.)

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

Какой милый зайчик.

Оказалось, что математические концепции — и, в частности, для первого курса все матричное умножение — не только активно использовались, но и имели решающее значение для понимания, чтобы реализовать окончательный проект для курса. В нем нам нужно было создать функцию для вычисления евклидова расстояния между матрицами, а затем использовать эту функцию (или ее эквивалент) для создания алгоритма k-ближайших соседей (k-NN). С нуля. И **ЗАТЕМ** реализовать **ЭТО** как часть системы распознавания лиц.

Шутки в сторону, материал продвигается очень быстро и предполагает, что у вас будет приличный опыт программирования на Python с самого начала. Это не для финта сердца. Однако, предполагая, что вы пройдете без особого вмешательства со стороны фасилитатора курса, к его концу вы на довольно глубоком уровне поймете, как работает алгоритм k-NN, а также его относительные сильные и слабые стороны. Это заинтриговало меня, так как это было намного глубже и более узко сфокусировано, чем я ожидал, но очень интересными способами, которые, безусловно, окажутся полезными, когда я углублюсь в мир науки о данных.

На YouTube есть несколько видеороликов, в которых подробно рассказывается о том, как работает алгоритм k-NN, поэтому я просто дам очень общее резюме: по сути, вы берете набор размеченных точек данных (например, изображения вещей — деревьев, камней, людей и т. д.), которые составляют ваши обучающие данные, и вы разлагаете их на какое-то числовое значение (возможно, матрицу). Затем вы берете новое изображение без метки, разлагаете его на числовое значение, а затем математически определяете, какие точки в ваших обучающих данных больше всего похожи на немаркированное изображение. k в k-NN представляет количество ближайших точек данных, которые вы ищете, и обычно является нечетным числом, чтобы попытаться избежать совпадений. «Ближайший» сосед в нашем классном проекте определялся евклидовым расстоянием (т.е. ближайший по прямой или «как летит птица»), однако в некоторых случаях приходится определять расстояние на основе доступных путей (например, ближайший ресторан с евклидовой точки зрения может быть в трех кварталах, но в неправильном направлении на улице с односторонним движением, поэтому ресторан, который находится в пяти кварталах, но в правильном направлении, на самом деле «ближе» с этой точки зрения), что может стать более сложным. После определения k ближайших точек в обучающих данных вы просто угадываете/назначаете метку контрольной точки, чтобы она совпадала с меткой, имеющей самые близкие точки.

В качестве примера предположим, что я загружаю свою фотографию и установил значение k равным трем. Если бы эта картинка была математически ближе всего к трем отмеченным точкам, одна из которых — человек, а две — камни (давайте предположим, что это не очень хорошая картинка, и просто остановим на этом разговор…), эта картинка была бы помечена как камень — даже если фактически самым близким совпадением было изображение человека. Однако, если бы я установил значение k равным единице, результат изменился бы, и мое изображение теперь было бы помечено как человек.

На самом деле вы обычно получаете довольно четкий результат. Мой пример с камнем был бы очень редким исключением, и его, скорее всего, можно было бы исправить, увеличив (а не уменьшив) значение k. Допустим, два ближайших наскальных рисунка оказались статуями людей, отсюда и путаница в наших данных. Если мы установим для нашего k более высокое число — скажем, девять, — то вполне вероятно, что семь из девяти будут помечены как человек, и, таким образом, алгоритм даст правильный ответ.

На бэкенде много чего происходит, и я думаю, что курс (и наш фасилитатор) проделал действительно хорошую работу, пытаясь связать кучу сложных тем в удобоваримые куски, которые можно было бы изучить в течение двух недель. период. Хотя это было сложно, это было также очень весело, настолько, что я пошел вперед и записался на следующие два курса. Я не знаю, что меня ждет в математике, но я ожидаю, что это будет и сложно, и весело! Опять же, мое ботаническое определение веселья может отличаться от вашего, так что будьте осторожны, покупатель…