Визуализация многомерных данных

Этот пример показывает, как визуализировать многомерные данные с помощью различных статистических графиков. Многие статистические анализы включают только две переменные: переменную предиктора и переменную отклика. Такие данные легко визуализировать, используя 2D графики поля точек, двухмерные гистограммы, коробчатые графики и т.д. Также можно визуализировать трехмерные данные с 3D графиками поля точек или 2D графики поля точек с третьей переменной, закодированной, например, цветом. Однако многие наборы данных включают большее количество переменных, что затрудняет прямую визуализацию. Этот пример исследует некоторые способы визуализации высоко-размерных данных в MATLAB ®, используя Statistics и Machine Learning Toolbox™.

В этом примере мы будем использовать carbig dataset, набор данных, который содержит различные измеренные переменные для около 400 автомобилей 1970-х и 1980-х годов. Мы проиллюстрируем многомерную визуализацию, используя значения топливной эффективности (в милях на галлон, MPG), ускорения (время от 0-60MPH в секундах), объема двигателя (в кубических дюймах), веса и лошадиных сил. Мы будем использовать количество цилиндров, чтобы сгруппировать наблюдения.

load carbig
X = [MPG,Acceleration,Displacement,Weight,Horsepower];
varNames = {'MPG'; 'Acceleration'; 'Displacement'; 'Weight'; 'Horsepower'};

Графики поля точек

Просмотр срезов через нижние размерные подпространства является одним из способов частичной работы вокруг ограничения двух или трёх размерностей. Для примера мы можем использовать gplotmatrix функция для отображения массива всех двухмерных графиков поля точек между нашими пятью переменными вместе с одномерной гистограммой для каждой переменной.

figure
gplotmatrix(X,[],Cylinders,['c' 'b' 'm' 'g' 'r'],[],[],false);
text([.08 .24 .43 .66 .83], repmat(-.1,1,5), varNames, 'FontSize',8);
text(repmat(-.12,1,5), [.86 .62 .41 .25 .02], varNames, 'FontSize',8, 'Rotation',90);

Точки в каждом графике поля точек закодированы по количеству цилиндров: синий для 4 цилиндров, зеленый для 6 и красный для 8. Существует также горстка из 5 гидроцилиндров, и роторные автомобили указаны как имеющие 3 цилиндра. Этот массив графиков облегчает выбор шаблонов в отношениях между парами переменных. Однако могут быть важные шаблоны в более высоких размерностях, и их нелегко распознать на этом графике.

Параллельные графики координат

Матрица графика поля точек отображает только двухмерные отношения. Однако существуют и другие альтернативы, которые отображают все переменные вместе, что позволяет исследовать высокомерные связи между переменными. Самым прямым многомерным графиком является график параллельных координат. На этом графике координатные оси все расположены горизонтально, вместо использования ортогональных осей как в обычном Декартовом графе. Каждое наблюдение представлено на графике как ряд связанных сегментов линии. Для примера мы можем сделать график всех автомобилей с 4, 6, или 8 цилиндрами, и цветные наблюдения по группам.

Cyl468 = ismember(Cylinders,[4 6 8]);
parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames)

Горизонтальное направление на этом графике представляет координатные оси, а вертикальное направление представляет данные. Каждое наблюдение состоит из измерений пяти переменных, и каждое измерение представлено как высота, на которой соответствующая линия пересекает каждую координатную ось. Поскольку пять переменных имеют широко различные области значений, этот график был выполнен с стандартизированными значениями, где каждая переменная была стандартизирована, чтобы иметь нулевое среднее и единичное отклонение. С помощью цветового кодирования на графике показано, например, что 8 автомобилей с гидроцилиндрами обычно имеют низкие значения для MPG и ускорения и высокие значения для объема, веса и лошадиной силы.

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

parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames, 'quantile',.25)

Эндрюс графики

Другим подобным типом многомерной визуализации является график Эндрюса. Этот график представляет каждое наблюдение как гладкую функцию на интервале [0,1].

andrewsplot(X(Cyl468,:), 'group',Cylinders(Cyl468), 'standardize','on')

Каждая функция является рядом Фурье с коэффициентами, равными соответствующим значениям наблюдения. В этом примере ряд имеет пять членов: константа, два синуса с периодами 1 и 1/2 и два аналогичных косинуса. Эффекты на формы функций из-за трех ведущих членов являются наиболее очевидными на графике Эндрюса, поэтому шаблоны в первых трех переменных, как правило, являются таковыми наиболее легко распознаваемыми.

Существует различие между группами в t = 0, что указывает на то, что первая переменная, MPG, является одной из отличительных функций 4, 6 и 8 автомобилей с гидроцилиндрами. Более интересной является различие между тремя группами при t = 1/3. Вставляя это значение в формулу для функций построения графика Эндрюса, мы получаем набор коэффициентов, которые задают линейную комбинацию переменных, которая различает группы.

t1 = 1/3;
[1/sqrt(2) sin(2*pi*t1) cos(2*pi*t1) sin(4*pi*t1) cos(4*pi*t1)]
ans =

    0.7071    0.8660   -0.5000   -0.8660   -0.5000

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

Графики глифа

Другой способ визуализации многомерных данных - использовать «глифы» для представления размерностей. Функция glyphplot поддерживает два типа глифов: звезды и грани Черноффа. Например, вот звездный график первых 9 моделей в данных автомобиля. Каждый спот в звезде представляет одну переменную, и длина спика пропорциональна значению этой переменной для этого наблюдения.

h = glyphplot(X(1:9,:), 'glyph','star', 'varLabels',varNames, 'obslabels',Model(1:9,:));
set(h(:,3),'FontSize',8);

В живом графическом окне MATLAB этот график позволил бы интерактивно исследовать значения данных с помощью курсоров данных. Например, нажатие на правую точку звезды для Ford Torino покажет, что она имеет значение MPG 17.

Графики глифа и многомерное масштабирование

Построение графиков звёзд на сетке, без особого порядка, может привести к рисунку, которая запутана, потому что смежные звёзды могут закончиться совсем по-разному. Таким образом, может отсутствовать гладкий шаблон для ловли глаза. Часто полезно объединить многомерное масштабирование (MDS) с глифовым графиком. Чтобы проиллюстрировать, мы сначала выберем все автомобили от 1977 года и используем zscore функция для стандартизации каждой из пяти переменных с нулевым средним и единичным отклонением. Затем мы вычислим евклидовы расстояния среди этих стандартизированных наблюдений как меру неоднородности. Этот выбор может быть слишком упрощенным в реальном приложении, но служит здесь в целях рисунка.

models77 = find((Model_Year==77));
dissimilarity = pdist(zscore(X(models77,:)));

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

Y = mdscale(dissimilarity,2);
glyphplot(X(models77,:), 'glyph','star', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:), 'radius',.5);
title('1977 Model Year');

На этом графике мы использовали MDS как метод уменьшения размерности, чтобы создать 2D график. Обычно это означало бы потерю информации, но путем построения глифов мы включили всю высокомерную информацию в данные. Цель использования MDS состоит в том, чтобы навязать некоторую регулярность изменению данных, чтобы шаблоны среди глифов было легче видеть.

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

Другой тип глифа - лицо Черноффа. Этот глиф кодирует значения данных для каждого наблюдения в лицевые функции, такие как размер лица, форма лица, положение глаз и т.д.

glyphplot(X(models77,:), 'glyph','face', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:));
title('1977 Model Year');

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

Соответствие функций переменным определяет, какие отношения легче всего видеть, и glyphplot позволяет легко изменить выбор.

close