В течение долгого времени я хотел начать изучать, как использовать ИИ как часть потока кода. С чего мне начать? Что ж, у меня нет бакалавра и определенно нет основ математики, чтобы понимать все уравнения и вычисления, лежащие в основе этого. Но потом я наткнулся на эту удивительную статью Джейсона Браунли и снова начал верить!

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

KNN алгоритм

Представьте, что вы участвуете в чемпионате мира по футболу. Вы видите три паба с разными фанатами: Англия, Швеция и Франция. Вы валлийка, с кем бы отпраздновать? конечно Англия, потому что вы оба в Великобритании!

В этом смысл KNN: K ближайших соседей.
Наши данные будут классифицированы до ближайшего типа в том же измерении:

Мы видим зеленый кружок посередине. он ближе всего к треугольникам, поэтому он, вероятно, будет отнесен к форме треугольника.
Я сказал «вероятно», потому что буква «K» не была определена. Этот «K» означает, сколько пунктов следует рассмотреть. Если «K» равно 3, то круг следует классифицировать как треугольник (два треугольника против одного квадрата). Но если «K» равно 5, то круг следует классифицировать как квадрат (три квадрата против двух треугольников).
В большинстве случаев значение «K» по умолчанию равно 3 (большее «K» означает нечувствительность) .

В один прекрасный день я бегал с приложением Nike Run Club в фоновом режиме.
В тот день я чувствовал себя усталым, мне нужен был кто-то, кто разбудил бы меня и дал некоторую мотивацию. Угадайте что, этого не произошло. Мне пришло в голову: классифицируйте песни как ритмичные или как неритмичные!

Я не музыкант, но небольшое исследование привело меня к термину Tempo и его единице измерения BPM. Значение ударов в минуту определяет, ритмична песня или нет.

Как написано в Википедии, значение ударов в минуту ритмической песни выше 120:

Allegro - быстро, быстро и ярко (120–156 ударов в минуту) (molto allegro немного быстрее, чем allegro, но всегда в пределах своего диапазона)

Vivace - живой и быстрый (156–176 ударов в минуту)

Вивациссимо - очень быстро и живо (172–176 ударов в минуту)

Allegrissimo или Allegro vivace - очень быстро (172–176 ударов в минуту)

Presto - очень и очень быстро (168–200 ударов в минуту)

Prestissimo - даже быстрее, чем presto (200 ударов в минуту и ​​более)

Так что теоретически нам нужно определить, превышает ли BPM песню 120.
Проблема в том, что я не нашел точного алгоритма для расчета BPM, поэтому мне пришлось добавить больше значений, чтобы песня была ритмичной: < br /> 1. Среднее значение BPM для песни.
2. Процент высоких значений BPM от целых баллов.
3. Сколько баллов в последовательности BPM имеют песни (выше 5 баллов высокого BPM подряд).
Также я вычел каждый балл на 5, потому что не доверял результатам алгоритма библиотеки Aubio.

Давайте извлечем эти значения и добавим их в БД:
Сначала извлечем значения BPM песни с помощью примера aubio:

затем получаем все нужные нам значения:

Поместите все значения в БД и приступим к классификации!

Создание наборов данных

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

Давайте посмотрим:

Мы создаем список списков с нашими данными из БД.
Затем нам нужно загрузить его и разделить на 2 группы:
* обучающий набор - данные, которые алгоритм фактически изучает.
* набор тестов - набор для проверки нашего алгоритма.

Каждый список содержит 4 атрибута:
* Среднее количество ударов в минуту.
* Процент счетчика ударов в минуту.
* Последовательность точек высоких ударов в минуту.
* Ритмичность песни или нет.

Создание модели KNN

Наша модель KNN имеет дело с действительными числами. Таким образом, мы собираемся использовать Евклидово расстояние для вычисления лучших K точек для следующего прогноза. Каждый обучающий набор сравнивается с тестовым примером: мы вычисляем расстояние между значениями каждого обучающего набора и значениями тестового набора и добавляем его к переменной. Мы сортируем переменную, в которой хранятся наши данные, и получаем лучший вариант K (наименьшие расстояния).

Напишем код!

Предсказывая будущее

Мы создали все данные, получили лучшие баллы для каждой обучающей выборки, и теперь мы готовы прогнозировать результат!

Прогноз - это голосование. Выбрана основная группа. Просто как тот.

Посмотрим, как это делается

Собираем все вместе

Теперь, когда у нас есть все детали, давайте решим эту головоломку!

  1. Сначала получите данные обучения или загрузите их из существующего объекта Pickle.
  2. Найдите лучших соседей.
  3. Предсказывать.

У нас будет два режима:
1. Режим обучения - поиск лучшего набора данных, который мы можем для наиболее точного. предсказание.
2. Определите ритмичность песни или нет.

Давайте протестируем классификатор и проверим результат:

Remix.mp3
Train set: 64
Test set: 1
[[158, 64, 125, <TEMPOS.RHYTHMIC: 'Rhythmic'>], [154, 63, 112, <TEMPOS.RHYTHMIC: 'Rhythmic'>], [167, 72, 145, <TEMPOS.RHYTHMIC: 'Rhythmic'>]]
Is Remix.mp3 rhythmic? True
Remix.mp3 is added successfully

Песня, которую я тестировал, ритмичная (это ремикс !!!)
Мы видим, что лучшие соседи, которые она нашла, это:
[158, 64, 125, ‹TEMPOS.RHYTHMIC: 'Rhythmic' ›],
[154, 63, 112,‹ TEMPOS.RHYTHMIC: «Rhythmic» ›],
[167, 72, 145,‹ TEMPOS.RHYTHMIC: «Rhythmic» ›]

Победитель… «Ритмик»! У нас есть успех!

Заключение

Мы узнали о модели KNN, как ее реализовать и с ее помощью прогнозировать данные.
Использование ИИ в коде, даже если у вас нет всех необходимых основ, возможно. Я уверен, что если у нас будет больше простых статей, подобных упомянутой выше, об этих моделях и их реализациях, мы увидим больше разработчиков, использующих эти концепции в своем коде. Не бойтесь его использовать!

Я надеюсь, что эта статья научила вас чему-то новому, и с нетерпением жду ваших отзывов. Скажите, пожалуйста, это было вам полезно?

Полную версию проекта можно найти на Github здесь.