В этом примере показано, как выполнить классическое многомерное масштабирование с помощью cmdscale функция в Toolbox™ статистики и машинного обучения. Классическое многомерное масштабирование, также известное как анализ основных координат, принимает матрицу расстояний между точками и создает конфигурацию точек. В идеале эти точки могут быть построены в двух или трех измерениях, и евклидовы расстояния между ними приблизительно воспроизводят исходную матрицу расстояний. Таким образом, график рассеяния этих точек обеспечивает визуальное представление исходных расстояний.
Этот пример иллюстрирует применение многомерного масштабирования для измерения различий, отличных от пространственного расстояния, и показывает, как построить конфигурацию точек для визуализации этих различий.
В этом примере описывается классическое многомерное масштабирование. mdscale функция выполняет неклассическую MDS, которая иногда более гибкая, чем классический метод. Неклассическая MDS описана в примере неклассического многомерного масштабирования.
Предположим, вы измерили генетическое «расстояние», или непохожесть, между рядом локальных субпопуляций одного вида животных. Вы также знаете их географическое положение и хотели бы знать, насколько точно соответствуют их генетические и пространственные расстояния. Если они это делают, это является доказательством того, что взаимодействие между субпопуляциями зависит от их географического положения.
Ниже приведены пространственные местоположения субпопуляций и верхний треугольник матрицы генетических расстояний в том же векторном формате, произведенном pdist.
X = [39.1 18.7;
40.7 21.2;
41.5 21.5;
39.2 21.8;
38.7 20.6;
41.7 20.1;
40.1 22.1;
39.2 21.6];
D = [4.69 6.79 3.50 3.11 4.46 5.57 3.00 ...
2.10 2.27 2.65 2.36 1.99 1.74 ...
3.78 4.53 2.83 2.44 3.79 ...
1.98 4.35 2.07 0.53 ...
3.80 3.31 1.47 ...
4.35 3.82 ...
2.57];Хотя этот векторный формат для D является пространственно-эффективным, часто легче видеть отношения расстояний, если переформатировать расстояния в квадратную матрицу.
squareform(D)
ans = 8×8
0 4.6900 6.7900 3.5000 3.1100 4.4600 5.5700 3.0000
4.6900 0 2.1000 2.2700 2.6500 2.3600 1.9900 1.7400
6.7900 2.1000 0 3.7800 4.5300 2.8300 2.4400 3.7900
3.5000 2.2700 3.7800 0 1.9800 4.3500 2.0700 0.5300
3.1100 2.6500 4.5300 1.9800 0 3.8000 3.3100 1.4700
4.4600 2.3600 2.8300 4.3500 3.8000 0 4.3500 3.8200
5.5700 1.9900 2.4400 2.0700 3.3100 4.3500 0 2.5700
3.0000 1.7400 3.7900 0.5300 1.4700 3.8200 2.5700 0
cmdscale распознает любой из двух форматов.
[Y,eigvals] = cmdscale(D);
cmdscaleпервый выход, Y, является матрицей точек, созданных для того, чтобы иметь расстояния интерполяции, которые воспроизводят расстояния в D. С восемью видами, точки (ряды Y) может иметь до восьми измерений (столбцы Y). Визуализация генетических расстояний зависит от использования точек только в двух или трех измерениях. К счастью, cmdscaleвторой выход, eigvals, - это набор отсортированных собственных значений, относительные величины которых указывают, сколько измерений можно безопасно использовать. Если только первые два или три собственных значения являются большими, то только те координаты точек в Y необходимы для точного воспроизведения D. Если более трех собственных значений велики, то найти хорошую низкоразмерную конфигурацию точек не представляется возможным, и визуализировать расстояния будет непросто.
[eigvals eigvals/max(abs(eigvals))]
ans = 8×2
29.0371 1.0000
13.5746 0.4675
2.0987 0.0723
0.7418 0.0255
0.3403 0.0117
0.0000 0.0000
-0.4542 -0.0156
-3.1755 -0.1094
Обратите внимание, что существует только два больших положительных собственных значения, поэтому конфигурация точек создается cmdscale можно печатать в двух измерениях. Два отрицательных собственных значения указывают на то, что генетические расстояния не евклидовы, то есть никакая конфигурация точек не может воспроизводиться D точно. К счастью, отрицательные собственные значения невелики относительно самых больших положительных, и сокращение до первых двух столбцов Y должны быть достаточно точными. Это можно проверить, посмотрев на ошибку в расстояниях между двумерной конфигурацией и исходными расстояниями.
maxrelerr = max(abs(D - pdist(Y(:,1:2)))) / max(D)
maxrelerr = 0.1335
Теперь можно сравнить «генетические местоположения», созданные cmdscale к фактическим географическим местоположениям. Потому что конфигурация возвращена cmdscale является уникальным только до трансляции, вращения и отражения, генетические местоположения, вероятно, не будут соответствовать географическим местоположениям. У них тоже будет неправильный масштаб. Но вы можете использовать procrustes команда, чтобы сопоставить два набора точек лучше всего в смысле наименьших квадратов.
[D,Z] = procrustes(X,Y(:,1:2)); plot(X(:,1),X(:,2),'bo',Z(:,1),Z(:,2),'rd'); labels = num2str((1:8)'); text(X(:,1)+.05,X(:,2),labels,'Color','b'); text(Z(:,1)+.05,Z(:,2),labels,'Color','r'); xlabel('Distance East of Reference Point (Km)'); ylabel('Distance North of Reference Point (Km)'); legend({'Spatial Locations','Constructed Genetic Locations'},'Location','SE');

Этот график показывает наилучшее совпадение реконструированных точек в тех же координатах, что и фактические пространственные местоположения. По-видимому, генетические расстояния имеют тесную связь с пространственными расстояниями между субпопуляциями.
Предположим, что вычислена следующая корреляционная матрица для набора из 10 переменных. Очевидно, что все эти переменные положительно коррелированы, и что существуют очень сильные парные корреляции. Но с этим множеством переменных, это не легко получить хорошее чувство для отношений между всеми 10.
Rho = ...
[1 0.3906 0.3746 0.3318 0.4141 0.4279 0.4216 0.4703 0.4362 0.2066;
0.3906 1 0.3200 0.3629 0.2211 0.9520 0.9811 0.9052 0.4567 0 ;
0.3746 0.3200 1 0.8993 0.7999 0.3589 0.3460 0.3333 0.8639 0.6527;
0.3318 0.3629 0.8993 1 0.7125 0.3959 0.3663 0.3394 0.8719 0.5726;
0.4141 0.2211 0.7999 0.7125 1 0.2374 0.2079 0.2335 0.7050 0.7469;
0.4279 0.9520 0.3589 0.3959 0.2374 1 0.9657 0.9363 0.4791 0.0254;
0.4216 0.9811 0.3460 0.3663 0.2079 0.9657 1 0.9123 0.4554 0.0011;
0.4703 0.9052 0.3333 0.3394 0.2335 0.9363 0.9123 1 0.4418 0.0099;
0.4362 0.4567 0.8639 0.8719 0.7050 0.4791 0.4554 0.4418 1 0.5272;
0.2066 0 0.6527 0.5726 0.7469 0.0254 0.0011 0.0099 0.5272 1 ];Многомерное масштабирование часто рассматривается как способ построения точек с использованием только попарных расстояний. Но его также можно использовать с разными измерениями, которые являются более общими, чем расстояние, чтобы пространственно визуализировать вещи, которые не являются «точками в пространстве» в обычном смысле. Переменные, описанные Rho, являются примером, и вы можете использоватьcmdscale для построения графика визуального представления их взаимозависимостей.
Корреляция на самом деле измеряет сходство, но легко преобразовать его в меру разнородности. Поскольку все корреляции здесь положительные, вы можете просто использовать
D = 1 - Rho;
хотя другие варианты также могут иметь смысл. Если Rho содержит отрицательные корреляции, вам придется решить, например, указывает ли корреляция -1 больше или меньше разнородности, чем корреляция 0, и выбрать соответствующее преобразование.
Важно решить, возможна ли визуализация информации в корреляционной матрице, то есть можно ли уменьшить количество измерений с десяти до двух или трех. Собственные значения, возвращенные cmdscale дать тебе способ определиться. В этом случае scree-график этих собственных значений показывает, что для представления переменных достаточно двух измерений. (Обратите внимание, что некоторые собственные значения на графике ниже отрицательные, но небольшие относительно первых двух.)
[Y,eigvals] = cmdscale(D); plot(1:length(eigvals),eigvals,'bo-'); line([1,length(eigvals)],[0 0],'LineStyle',':','XLimInclude','off',... 'Color',[.7 .7 .7]) axis([1,length(eigvals),min(eigvals),max(eigvals)*1.1]); xlabel('Eigenvalue number'); ylabel('Eigenvalue');

В более независимом наборе переменных может потребоваться больше измерений. Если требуется более трех переменных, визуализация не все это полезно.
График 2-D конфигурации, возвращенной cmdscale указывает, что есть два подмножества переменных, которые наиболее тесно связаны между собой, плюс одна переменная, которая более или менее сама по себе. Один из кластеров плотный, а другой относительно рыхлый.
labels = {' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9',' 10'};
plot(Y(:,1),Y(:,2),'bx');
axis(max(max(abs(Y))) * [-1.1,1.1,-1.1,1.1]); axis('square');
text(Y(:,1),Y(:,2),labels,'HorizontalAlignment','left');
line([-1,1],[0 0],'XLimInclude','off','Color',[.7 .7 .7])
line([0 0],[-1,1],'YLimInclude','off','Color',[.7 .7 .7])
С другой стороны, результаты cmdscale для следующей корреляционной матрицы указывает на гораздо другую структуру: среди переменных нет реальных групп. Скорее, существует своего рода «круговая» зависимость, где каждая переменная имеет пару «ближайших соседей», но менее хорошо коррелирована с остальными переменными.
Rho = ...
[1 0.7946 0.1760 0.2560 0.7818 0.4496 0.2732 0.3995 0.5305 0.2827;
0.7946 1 0.1626 0.4227 0.5674 0.6183 0.4004 0.2283 0.3495 0.2777;
0.1760 0.1626 1 0.2644 0.1864 0.1859 0.4330 0.4656 0.3947 0.8057;
0.2560 0.4227 0.2644 1 0.1017 0.7426 0.8340 0 0.0499 0.4853;
0.7818 0.5674 0.1864 0.1017 1 0.2733 0.1484 0.4890 0.6138 0.2025;
0.4496 0.6183 0.1859 0.7426 0.2733 1 0.6303 0.0648 0.1035 0.3242;
0.2732 0.4004 0.4330 0.8340 0.1484 0.6303 1 0.1444 0.1357 0.6291;
0.3995 0.2283 0.4656 0 0.4890 0.0648 0.1444 1 0.8599 0.3948;
0.5305 0.3495 0.3947 0.0499 0.6138 0.1035 0.1357 0.8599 1 0.3100;
0.2827 0.2777 0.8057 0.4853 0.2025 0.3242 0.6291 0.3948 0.3100 1 ];
[Y,eigvals] = cmdscale(1-Rho);
[eigvals eigvals./max(abs(eigvals))]ans = 10×2
1.1416 1.0000
0.7742 0.6782
0.0335 0.0294
0.0280 0.0245
0.0239 0.0210
0.0075 0.0066
0.0046 0.0040
-0.0000 -0.0000
-0.0151 -0.0132
-0.0472 -0.0413
plot(Y(:,1),Y(:,2),'bx'); axis(max(max(abs(Y))) * [-1.1,1.1,-1.1,1.1]); axis('square'); text(Y(:,1),Y(:,2),labels,'HorizontalAlignment','left'); line([0 0],[-1,1],'XLimInclude','off','Color',[.7 .7 .7]) line([-1,1],[0 0],'YLimInclude','off','Color',[.7 .7 .7])

Многомерное масштабирование чаще всего используется для визуализации данных, когда доступны только их расстояния или различия. Однако, когда исходные данные доступны, многомерное масштабирование можно также использовать в качестве метода уменьшения размеров, уменьшая данные до матрицы расстояний, создавая новую конфигурацию точек с использованием cmdscaleи сохраняя только первые несколько измерений этих точек. Это применение многомерного масштабирования во многом похоже на анализ основных компонентов, и фактически при вызове cmdscale используя евклидовы расстояния между точками, результаты идентичны РСА, вплоть до изменения знака.
n = 10; m = 5;
X = randn(n,m);
D = pdist(X,'Euclidean');
[Y,eigvals] = cmdscale(D);
[PC,Score,latent] = pca(X);
YY = 10×5
-1.4505 1.6602 0.8106 0.5834 0.5952
2.6140 -1.0513 -1.1962 0.7221 -0.2299
-2.2399 -1.6699 -0.7881 -0.6659 0.0398
-0.4956 0.2265 1.2682 -0.5123 -0.5702
0.1004 -2.3659 1.2672 0.4837 -0.2888
-2.5996 1.0635 -0.8532 0.1392 -0.1216
-1.5565 0.4215 -0.0931 0.2863 0.0299
0.4656 -0.6250 -0.7608 -0.3233 0.2786
2.3961 2.6933 -0.2020 -0.2572 -0.4374
2.7660 -0.3529 0.5474 -0.4560 0.7044
Score
Score = 10×5
-1.4505 1.6602 -0.8106 -0.5834 -0.5952
2.6140 -1.0513 1.1962 -0.7221 0.2299
-2.2399 -1.6699 0.7881 0.6659 -0.0398
-0.4956 0.2265 -1.2682 0.5123 0.5702
0.1004 -2.3659 -1.2672 -0.4837 0.2888
-2.5996 1.0635 0.8532 -0.1392 0.1216
-1.5565 0.4215 0.0931 -0.2863 -0.0299
0.4656 -0.6250 0.7608 0.3233 -0.2786
2.3961 2.6933 0.2020 0.2572 0.4374
2.7660 -0.3529 -0.5474 0.4560 -0.7044
Даже ненулевые собственные значения идентичны масштабному коэффициенту.
[eigvals(1:m) (n-1)*latent]
ans = 5×2
36.9993 36.9993
21.3766 21.3766
7.5792 7.5792
2.2815 2.2815
1.5981 1.5981