Отличный инструмент для машинного обучения

Вычисление подобия может быть невероятно полезным при создании приложений машинного обучения. Если вам нужно сгруппировать документы на основе того, насколько похоже их содержимое, или если вы строите модель для сопоставления изображений, вам понадобится метод для определения того, что похоже, а что нет. Это довольно легко сделать с помощью числовых данных, но как определить сходство документов или изображений?

Подобие косинусов – это метод вычисления сходства двух векторов путем деления скалярного произведения на величины каждого вектора, как показано на рисунке ниже:

Используя python, мы можем конвертировать текст и изображения в векторы и применять ту же логику! Scikit-learn, PIL и Numpy делают этот процесс еще проще. В этой статье я покажу вам пару примеров того, как вы можете использовать косинусное сходство и как его вычислить с помощью python.

Сходство косинуса с текстовыми данными

Процесс преобразования текста в векторы очень распространен в обработке естественного языка. Существует множество различных способов векторизации текста, и эта статья отлично объясняет некоторые из них. У каждого метода есть свои плюсы и минусы, но все они по сути дают один и тот же результат: преобразование текста в числа.

Давайте попробуем это на Python — сначала нам нужно загрузить наши текстовые данные и использовать Text CountVectorizer sklearn для создания этого вектора. В этом примере я хочу сравнить два похожих абзаца, поэтому я буду использовать первый абзац страницы «Пчела» в Википедии и первую строку из Bee Movie.

Теперь, когда у нас есть эти текстовые векторы, мы можем сравнить сходства и различия каждого из них, используя расчет под названием Частота термина, обратная частоте документа (TFIDF). Я знаю, это звучит очень запутанно, но в основном это способ измерить, насколько уникально определенное слово относительно любого другого слова в документе. Это рассчитывается по шкале от 0 до 1, где наиболее распространенные слова приближаются к 0, а самые уникальные слова приближаются к 1. Вот как это выглядит для наших пчелиных документов:

Когда у нас есть этот кадр данных, нам просто нужно запустить функцию cosine_similarity, и мы получим наш результат.

Это означает, что в соответствии с косинусным сходством первая строка Bee Movie всего на 19% похожа на первый абзац страницы «Пчела» в Википедии. Сначала это может показаться низким, но давайте сравним первый документ с чем-то еще, чтобы увидеть разницу.

Эти два документа похожи только на 7,6%, что имеет смысл, поскольку слово «Пчела» даже не встречается ни разу в третьем документе.

Этот процесс можно легко масштабировать для больших документов, что должно создавать меньше места для статистической ошибки в расчетах. Если два документа из 50 слов похожи на 50 %, это, скорее всего, потому, что половина слов — это «the», «to», «a» и т. д. плагиат. Косинусное сходство невероятно полезно для анализа текста — как специалист по данным, вы можете выбрать, какой % считать слишком похожим или недостаточно похожим, и посмотреть, как это отсечение повлияет на ваши результаты.

Существуют и другие методы определения схожести текста, такие как индекс Жаккара, который удобен тем, что не учитывает повторяющиеся слова.

Косинусное сходство с изображениями

Вы, наверное, догадались, что этот процесс очень похож на описанный выше. К счастью, нам не нужно выполнять всю работу с NLP, нам просто нужно загрузить изображение и преобразовать его в массив значений RGB. Этот процесс довольно прост благодаря PIL и Numpy! В этом примере я сравню две фотографии собак, а затем сравню собаку с лягушкой, чтобы показать разницу в оценках.

Вот две фотографии собак, которых я буду сравнивать:

А вот код, который я использовал для загрузки изображений и преобразования их в векторы:

Чтобы показать вам другой метод вычисления сходства косинусов, я буду использовать Scipy и функцию пространственного.расстояния. Косинусное расстояние и косинусное сходство вычисляются почти одинаково с одним небольшим отличием. Эта статья Джона Р. Лэдда отлично объясняет разницу и то, как они связаны с евклидовым расстоянием, но для этого примера все, что нам нужно знать, это то, что

Теперь, когда мы это знаем, мы можем просто вычислить косинусное расстояние с помощью Scipy, а затем преобразовать его в косинусное сходство. Вот как я это сделал:

Это означает, что эти изображения собак похожи на 81%, что имеет смысл, просто взглянув на них, вы можете сказать, что у них в основном один и тот же предмет и цветовая палитра. Что, если бы мы взяли совершенно другое изображение и сравнили его с первой фотографией собаки? Что-то вроде этого:

Как и ожидалось, эти два изображения значительно менее похожи, чем первые два. 30% все еще относительно много, но это, вероятно, результат того, что у них обоих есть большие темные области в левом верхнем углу, а также небольшое цветовое сходство. Как и в случае с текстовым примером, вы можете определить пороговое значение для чего-либо, чтобы быть «достаточно похожим», что делает косинусное сходство отличным для кластеризации и других методов сортировки.

Также можно использовать значения HSL вместо RGB или преобразовать изображения в черно-белые, а затем сравнить — это может дать лучшие результаты в зависимости от типа изображений, с которыми вы работаете. Независимо от того, пытаетесь ли вы создать алгоритм обнаружения лиц или модель, которая точно сортирует изображения собак и изображения лягушек, косинусное сходство — это удобный расчет, который действительно может улучшить ваши результаты!

Заключение

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

Если вам интересно узнать больше о сходстве косинусов, я НАСТОЯТЕЛЬНО рекомендую это видео на YouTube. Или, если вы хотите узнать больше о процессе естественного языка, вы можете прочитать мою статью об анализе настроений. Я также буду рад раскрыть больше подобных тем в будущем. Дайте мне знать, если вы хотите узнать больше об определенной функции, методе или концепции.

Спасибо за чтение!

Хотите от меня большего?

  1. Следуй за мной на Medium
  2. Поддержите меня, подписавшись на Medium по моей реферальной ссылке.
  3. Свяжитесь со мной в LinkedIn и Twitter