Введение

У меня всегда была страсть к учебе, и я считаю себя учеником всю жизнь. Работа в SAS в качестве специалиста по данным позволяет мне изучать и опробовать новые алгоритмы и функции, которые мы регулярно предоставляем нашим клиентам. Часто алгоритмы технически не новы, но они для меня новы, что доставляет массу удовольствия.

Недавно у меня была возможность узнать больше о t-распределенном стохастическом соседнем встраивании (t-SNE). В этом посте я собираюсь дать общий обзор алгоритма t-SNE. Я также поделюсь некоторым примером кода Python, в котором я буду использовать t-SNE как для набора данных Digits, так и для набора данных MNIST.

Что такое t-SNE?

t-Распределенное стохастическое соседнее встраивание (t-SNE) - это неконтролируемый нелинейный метод, в основном используемый для исследования данных и визуализации многомерных данных. Проще говоря, t-SNE дает вам ощущение или интуицию того, как данные расположены в многомерном пространстве. Его разработали Лоренс ван дер Маатенс и Джеффри Хинтон в 2008 году.

t-SNE против PCA

Если вы знакомы с Анализом основных компонентов (PCA), то, как и я, вы, вероятно, задаетесь вопросом о разнице между PCA и t-SNE. Прежде всего следует отметить, что PCA был разработан в 1933 году, а t-SNE - в 2008 году. С 1933 года в мире науки о данных многое изменилось, главным образом в области вычислений и размера данных. Во-вторых, PCA - это метод уменьшения линейной размерности, который стремится максимизировать дисперсию и сохраняет большие попарные расстояния. Другими словами, разные вещи оказываются далеко друг от друга. Это может привести к плохой визуализации, особенно при работе с нелинейными структурами многообразия. Думайте о многообразной структуре как о любой геометрической форме, такой как цилиндр, шар, кривая и т. Д.

t-SNE отличается от PCA тем, что сохраняет только небольшие попарные расстояния или локальные сходства, тогда как PCA заботится о сохранении больших попарных расстояний для максимизации дисперсии. Лоренс довольно хорошо иллюстрирует подходы PCA и t-SNE, используя набор данных Swiss Roll на Рисунке 1 [1]. Вы можете видеть, что из-за нелинейности этого набора данных игрушек (коллектора) и сохранения больших расстояний PCA неправильно сохранит структуру данных.

Как работает t-SNE

Теперь, когда мы знаем, почему мы можем использовать t-SNE вместо PCA, давайте обсудим, как работает t-SNE. Алгоритм t-SNE вычисляет меру сходства между парами экземпляров в пространстве большой и низкой размерности. Затем он пытается оптимизировать эти две меры сходства с помощью функции стоимости. Давайте разберем это на 3 основных шага.

1. Шаг 1, измерьте сходство между точками в многомерном пространстве. Представьте себе набор точек данных, разбросанных в двухмерном пространстве (рисунок 2). Для каждой точки данных (xi) мы центрируем гауссово распределение по этой точке. Затем мы измеряем плотность всех точек (xj) при этом распределении Гаусса. Затем перенормируйте для всех точек. Это дает нам набор вероятностей (Pij) для всех точек. Эти вероятности пропорциональны сходству. Все это означает, что если точки данных x1 и x2 имеют равные значения под этим гауссовым кругом, то их пропорции и сходства равны, и, следовательно, у вас есть локальные сходства в структуре этого многомерного пространства. Распределением Гаусса или кругом можно управлять, используя так называемое недоумение, которое влияет на дисперсию распределения (размер круга) и, по сути, на количество ближайших соседей. Нормальный диапазон недоумения составляет от 5 до 50 [2].

2. Шаг 2 аналогичен шагу 1, но вместо использования распределения Гаусса вы используете t-распределение Стьюдента с одной степенью свободы, которое также известно как распределение Коши (рисунок 3). Это дает нам второй набор вероятностей (Qij) в низкоразмерном пространстве. Как вы можете видеть, t-распределение Стьюдента имеет более тяжелые хвосты, чем нормальное распределение. Тяжелые хвосты позволяют лучше моделировать большие расстояния.

3. Последний шаг состоит в том, чтобы этот набор вероятностей из низкоразмерного пространства (Qij) как можно лучше отражал те из многомерного пространства (Pij). Мы хотим, чтобы две структуры карты были похожи. Мы измеряем разницу между распределениями вероятностей двумерных пространств с помощью дивергенции Кульбака-Либлера (KL). Я не буду вдаваться в подробности о KL, за исключением того, что это асимметричный подход, который эффективно сравнивает большие значения Pij и Qij. Наконец, мы используем градиентный спуск, чтобы минимизировать нашу функцию стоимости KL.

Пример использования t-SNE

Теперь, когда вы знаете, как работает t-SNE, давайте быстро поговорим о том, где он используется. Лоренс ван дер Маатен приводит множество примеров в своей видеопрезентации [1]. Он упоминает об использовании t-SNE в таких областях, как исследования климата, компьютерная безопасность, биоинформатика, исследования рака и т.д. .

Кроме того, t-SNE можно использовать для исследования, изучения или оценки сегментации. Часто мы выбираем количество сегментов перед моделированием или повторяем после получения результатов. t-SNE часто может демонстрировать четкое разделение данных. Это можно использовать до использования вашей модели сегментации для выбора номера кластера или после, чтобы оценить, действительно ли ваши сегменты работают. Однако t-SNE не является кластерным подходом, поскольку он не сохраняет входные данные, такие как PCA, и значения могут часто меняться между запусками, так что это чисто для исследования.

Пример кода

Ниже приведен код Python (рисунки ниже со ссылкой на GitHub), где вы можете увидеть визуальное сравнение между PCA и t-SNE в наборах данных Digits и MNIST. Я выбрал оба этих набора данных из-за различий в размерностях и, следовательно, различий в результатах. Я также показываю в коде методику, позволяющую запустить PCA перед запуском t-SNE. Это можно сделать, чтобы сократить объем вычислений, и обычно вы сокращаете до ~ 30 измерений, а затем запускаете t-SNE.

Я запустил это с помощью python и вызвал библиотеки SAS. Он может немного отличаться от того, к чему вы привыкли, и это видно на изображениях ниже. Я использовал Seaborn для своих визуальных эффектов, что, на мой взгляд, было великолепно, но с t-SNE вы можете получить действительно компактные кластеры и нуждаться в увеличении. Другой инструмент визуализации, такой как Plotly, может быть лучше, если вам нужно увеличить масштаб или манипулировать вашим сюжетным объектом. . Кроме того, простой вызов %matplotlib notebook перед построением графиков также работает, если вы используете Matplotlib.

Ознакомьтесь с полной записной книжкой в ​​GitHub, чтобы увидеть все промежуточные шаги и получить код:

Шаг 1. Загрузите библиотеки Python. Создайте соединение с сервером SAS (называемым «CAS», который представляет собой распределенный механизм в памяти). Загрузите наборы действий CAS (воспринимайте их как библиотеки). Считайте данные и посмотрите на форму.

Шаг 2. На данный момент я все еще работаю на своем локальном компьютере. Я собираюсь загрузить эти данные на упомянутый мною сервер CAS. Это помогает мне использовать преимущества распределенной среды и повысить производительность. Затем я выполняю анализ PCA как для данных Digits, так и для данных MNIST.

Шаг 3. Визуализируйте наши результаты PCA как для цифр, так и для MNIST

Шаг 4. Теперь давайте попробуем те же шаги, что и выше, но с использованием алгоритма t-SNE

А теперь о наборе данных MNIST…

Заключение

Надеюсь, вам понравился этот обзор и пример алгоритма t-SNE. Я нашел t-SNE очень интересным и полезным инструментом визуализации, поскольку почти все данные, с которыми я когда-либо работал, казались многомерными. Я опубликую ресурсы, которые я нашел очень полезными, ниже. Лучшим ресурсом для меня было видео Лоренса на YouTube. Это немного длинновато, почти 1 час, но хорошо объяснено, и я нашел наиболее четкое объяснение с деталями.

Дополнительные ресурсы, которые я считаю полезными:

1. t-SNE против PCA: https://www.quora.com/What-advantages-does-the-t-SNE-algorithm-have-over-PCA

2. Дивергенция Кульбака-Либлера: https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence

3. Википедия t-SNE: https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding

4. Пошаговое руководство по t-SNE: https://www.analyticsvidhya.com/blog/2017/01/t-sne-implementation-r-python/

5. Хорошая информация о гиперпараметре: https://distill.pub/2016/misread-tsne/

6. Страница Лорен ван дер Маатен на GitHub: https://lvdmaaten.github.io/tsne/

7. SAS, разработчик набора действий t-SNE. Авторы и права: Хорхе Сильва

Ссылки

1. YouTube. (2013, 6 ноября). Визуализация данных с помощью t-SNE [видеофайл]. Получено с https://www.youtube.com/watch?v=RJVL80Gg3lA

2. Л.Дж.П. ван дер Маатен и Г. Хинтон. Визуализация многомерных данных с помощью t-SNE. Journal of Machine Learning Research 9 (ноябрь): 2579–2605, 2008 г.

Первоначально опубликовано на medium.com 29 августа 2018 г.