Визуализация многомерных данных с помощью диаграмм Эндрюса

В эпоху Big Data графическое представление многомерных данных является весьма актуальной задачей. Однако результат визуализации не всегда соответствует ожиданиям. Вот пример не самого наглядного графика для изображения многомерных данных «Ирисы Фишера»:


Это обыкновенная точечная диаграмма. Можно даже увидеть в ней закономерность. Есть группа точек (выделенный красным сорт setosa) которые явно выделяются на фоне остальных. Но сколько времени понадобилось, чтобы рассмотреть всю диаграмму и понять это? А здесь ведь только 4 измерения. Что будет, когда у вас будут данные с 10-ю измерениями? Не трудно догадаться, что тогда задача визуальной классификации станет намного сложнее.

Диаграммы Эндрюса

Дэвид Эндрюс (Andrews, David F.) в 1972-м году описал удобный способ визуализации многомерных данных. Суть данного метода такова:
Каждая точка представляется в виде ряда Фурье:



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

Код на ЯП Python
import numpy as np
import pylab as pl

def andrews_curve(x,theta):
  curve = list()
  for th in theta:
    x1 = x[0] / np.sqrt(2)
    x2 = x[1] * np.sin(th)
    x3 = x[2] * np.cos(th)
    x4 = x[3] * np.sin(2.*th)
    curve.append(x1+x2+x3+x4)
  return curve

accuracy = 1000
samples = np.loadtxt('iris.csv', usecols=[0,1,2,3], delimiter=',')
theta = np.linspace(-np.pi, np.pi, accuracy)

for s in samples[:20]: # setosa
  pl.plot(theta, andrews_curve(s, theta), 'r')

for s in samples[50:70]: # versicolor
  pl.plot(theta, andrews_curve(s ,theta), 'g')

for s in samples[100:120]: # virginica
  pl.plot(theta, andrews_curve(s, theta), 'b')

pl.xlim(-np.pi,np.pi)
pl.show()







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

Диаграммы Эндрюса далеко не единственная возможность визуализировать многомерные данные. Но этот метод прост в реализации, понятен и может без труда применяться на практике.

Список литературы:
en.wikipedia.org/wiki/Andrews_plot
● Andrews, David F. (1972). «Plots of High-Dimensional Data». International Biometric Society 18 (1): 125–136. JSTOR 2528964.
glowingpython.blogspot.ru/2014/10/andrews-curves.html
Поддержать автора
Поделиться публикацией

Комментарии 23

    +3
    А если точек не 600, а 600 * 10^6? Мне кажется, каждый вариант визуализации имеет свои «за» и «против», даже «не самый наглядный» с кучей отдельных графиков.

    Тем не менее, за метод спасибо. Такие диаграммы видел, но как называются и строятся — не знал.
      0
      Количество точек может сыграть роль, а может и нет. Все зависит от конкретных данных. Я с вами полностью согласен, что у всех методов есть свои плюсы и минусы и не нужно зацикливаться на чем-то одном.
        +1
        А если точек не 600, а 600 * 10^6?

        Тогда будут не графики, а двумерная гистограмма плотности. Если повезёт, то можно будет увидеть плотные траектории — сгущения в исходном пространстве.

        Хуже другое. А что, если в пространстве не 4, а 600 измерений?
        +1
        Чем описанный метод лучше обычной визуализации методом parallel coordinates? Пример: http://exposedata.com/parallel/
        Такая диаграмма преобразований не требует, а результат сопоставим.
          0
          На той диаграмме очень трудно увидеть корреляции между несоседними координатами. Или более сложные линейные соотношения. В приведённых здесь диаграммах мы берём много потенциальных соотношений, и смотрим, работают они или нет. По хорошему, в софте должна быть возможность выбрать две или три точки t, и показать координаты точек (fx(t1),fx(t2),fx(t3)) на двумерной или трёхмерной диаграмме.
          0
          Красный сорт и на точечном графике хорошо выделяется — для этого красные линии не нужны. Вопрос, скорее в том как отличить синее от зеленого. В принципе на линейном графике в районе sin(t)=3 примерно видна довольно четкая граница между синим и зеленым. Есть ли смысл ее использовать как критерий классификации? Или ерунда все это?
          И еще вопрос: порядок иксов в формуле имеет значение? Т.е. если х1 и х2 поменять местами, то что-то изменится?
            0
            Граница между зелёным и синим видна и на двумерном графике (1,4). Смотрите на него — насколько она для вас убедительна?
            Если x1 и x2 поменять местами, то вся картина изменится — в кривых будут выражены другие частоты и фазы. Но вертикальные сечения графика (точки разных кривых с одинаковым t) будут иметь примерно одинаковое распределение.
            В сущности, мы нарисовали на трёхмерной сфере кривую, взяли из начала координат по вектору в каждую точку этой кривой, спроектировали все точки на каждый вектор и отложили длины проекций на график. И всё зависит от того, насколько плотно легла кривая на сферу.
              0
              Если на точечном графике провести границу между зеленым и синим, то при любом раскладе несколько точек попадают в чужую зону. А на линейном графике возникает такое ощущение, что разделить можно со 100% надежностью. Мелочь — а приятно.
              Хотя может там просто зеленое за синее спряталось. Аналитически надо смотреть.

              По поводу рисования кривых на сфере — интересно, но непонятно :)
            +2

            (http://i.snag.gy/jTf9g.jpg)

            Ок, два пучка я вижу. Три — ну никак нет.
              0
              Ирисы — задача классификации в оригинале, а не кластеризации. Убрав цвета линий вы пытаетесь этой диаграммой решить кластеризацию. А там ошибка между синими и зелеными получается приличная (к-средним, например).
                0
                Возможно, я не понял какую задачу в решаете. Можете в простых словах объяснить?
                  +1
                  Классификация, это обучение с учителем. Обучают классификатор на примерах, которые размечены. Каждому примеру обозначен класс. Полученный классификатор в дальнейшем работает автономно на других примерах.

                  Ирисы — задача классификации. Потому есть возможность раскрасить линии в цвета. Каждому классу ирисов свой цвет.

                  Если вы цвета убрали, это эквивалентно случаю кластеризации, когда в исходных данных класс не указан и требуется разбить выборку на группы по степени схожести. Если сделать линии полупрозрачными, тогда пучки будет лучше видно, если данные хорошо делятся на группы.
                    0
                    Понял. Спасибо.
              0
              Я не использовал метод параллельных координат. Немного прочитал про него сейчас. Очень интересный способ визуализации. Но как и все, со своими минусами. К примеру, для получения хорошо интерпретируемой картинки, важно учитывать порядок осей. Здесь есть даже специальный алгоритм для упрощения упорядочивания осей:
              A New Axes Re-ordering Method in Parallel Coordinates Visualization.
              Так же, то, что я заметил, это очень длинный график, получающийся при большом количестве измерений. Да, его можно ужать, если взять небольшие расстояния между осями, но не превратится ли все это в «кашу» ?!
              Опять же, повторюсь, предложенный вами метод, я не использовал и все вышесказанное просто предположения после «гугления» на эту тему.
              Можно, кстати для интереса, посмотреть как будут выглядеть данные по вашей ссылке если их изобразить с помощью диаграмм Эндрюса.
                0
                Извините, это ответ пользователю hohlandrik
                –1
                Мне кажется тему стоило(ит) раскрыть шире, а то многие моменты кажутся опущенными и от того немного непонятными:

                • Хоть какой-то пошаговый алгоритм: что дано, что на выходе и как это анализировать? Например, пучки пересекаются в точке -2.5 под разными углами, какая у всего этого интерпретация? Какая-то корреляция? Что мы вообще видим?
                • Как по диаграмме с пучками понять, где какие классы? Даны ли классы изначально или мы их ищем? Как например, не имея цвета увидеть, что классов на самом деле три? На первом графике все привычно и понятно, на втором не так очевидно для читателя, который этого не видел
                • У вас получится разная картинка в зависимости от порядка размерностей, причем мы увидим только одну из многих возможных. Как выбрать правильную? (Кстати, про это стоит явно написать.)
                • Но этот метод прост в реализации, понятен и может без труда применяться на практике.
                  Можно какой-нибудь пример применения на практике? Статья 1972 года уже должны были что-то придумать


                В общем ждем следующую статью :-)
                  +1
                  Например, пучки пересекаются в точке -2.5 под разными углами, какая у всего этого интерпретация?

                  Подставив точку t=-2.5 в уравнение, мы получим
                  0.7*x1 — 0.6*x2 — 0.8*x3 + 0.95*x4 = 0.3, которое приближённо выполняется для всех точек.
                  Из диаграммы (x3,x4) можно увидеть, что x4 приближенно равно x3/3, поэтому уравнение можно упростить до 7*x1-6*x2-5*x3=3. Наверное, для данного вида растений оно что-нибудь значит.
                  При неподходящем выборе кривых мы бы этого пересечения могли и не увидеть (как не видим чёткого пересечения в t=1.7). Но метод главных компонент сразу бы выдал оба этих соотношения, и спроектировал точки на самую чётко выделяющуюся плоскость.
                    0
                    Когда в тексте видите ссылку на задачу "Ирисы" — это такой код, свой/чужой. Либо вы в теме анализа данных, либо нет :)
                    Это самая популярная задача для чайников. «Ирисы» изначально классификация. В наборе данных 150 записей. По 50 на каждый класс. Первые четыре столбца геометрия растения. Пятый — имя класса.
                      0
                      В статье про Exploratory Data Analysis должно быть явно прописано, что и зачем мы делаем, то что iris — известный набор данных от подобного объяснения не освобождает. С ним можно сделать тысячу и одну вещь (например, кластеризовать данные и использовать имеющиеся метки, чтобы проверить качество кластеризации), в статье вообще центральная тема — представление данных, а не классификация (акцент на классификации, скорее вообще смутит читателя).

                      Здесь вполне мог бы быть и любой другой набор данных c классами и без.
                      0
                      > Как например, не имея цвета увидеть, что классов на самом деле три?

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

                      > У вас получится разная картинка в зависимости от порядка размерностей, причем мы увидим только одну из многих возможных. Как выбрать правильную?

                      Да, тоже об этом подумал. Нужен критерий, чтобы выбрать нужный порядок. Первая мысль — ширина распределения должна убывать с увеличением гармоники.
                      +1
                      Спасибо за статью.

                      Хороший альтернативный метод визуализации многомерных данных, как говориться не «точечными диаграммами» едиными.
                      Как уже было замечено, метод весьма чувствителен к порядку выбора переменных используемых в уравнении. Тут уже упоминали «метод главных компонент» (Principal component analysis), так вот этот метод может быть использован при выборе порядка использованания переменных в уравнении Эндрюса. Подробнее можно почитать здесь.
                        +1
                        Любопытно. А как обобщить этот метод на три измерения? Трехмерное пространство же тоже можно обозревать.
                          0
                          Можно-то можно, а вот удобство — это уже спорный вопрос. Например, кучу поверхностей в пространстве уже не так удобно обозревать, потому что они будут перекрывать друг друга и потребуется ядрёный рендер с полупрозрачностью и сортировкой, чтобы вообще увидеть больше одной. Можно одну из переменных вынести в качестве координаты z, и получить кучу кривых, распределённых в пространстве, но опять-таки это будет менее удобно. Обозревать данные в 3D, вероятнее всего, станет действительно удобно только когда у каждого будет свой голографический проектор на столе.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое