Этот пример показывает, как выполнить классическое многомерное масштабирование с помощью функции cmdscale
в Statistics and Machine Learning 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 = Columns 1 through 7 0 4.6900 6.7900 3.5000 3.1100 4.4600 5.5700 4.6900 0 2.1000 2.2700 2.6500 2.3600 1.9900 6.7900 2.1000 0 3.7800 4.5300 2.8300 2.4400 3.5000 2.2700 3.7800 0 1.9800 4.3500 2.0700 3.1100 2.6500 4.5300 1.9800 0 3.8000 3.3100 4.4600 2.3600 2.8300 4.3500 3.8000 0 4.3500 5.5700 1.9900 2.4400 2.0700 3.3100 4.3500 0 3.0000 1.7400 3.7900 0.5300 1.4700 3.8200 2.5700 Column 8 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 = 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 ];
Многомерное масштабирование часто считается путем к (ре) точки построения с помощью только попарные расстояния. Но это может также использоваться с мерами по несходству, которые являются более общими, чем расстояние, чтобы пространственно визуализировать вещи, которые не являются "точками на пробеле" в обычном смысле. Переменные, описанные Ро, являются примером, и можно использовать cmdscale
, чтобы построить визуальное представление их взаимозависимостей.
Корреляция на самом деле измеряет подобие, но легко преобразовать его к мере несходства. Поскольку все корреляции здесь положительны, можно просто использовать
D = 1 - Rho;
несмотря на то, что другой выбор может также быть целесообразным. Если бы Rho
содержал отрицательные корреляции, необходимо было бы решить, выбирают ли, например, корреляция-1 обозначенного более или менее несходства, чем корреляция 0, и преобразование соответственно.
Важно решить, возможна ли визуализация информации в корреляционной матрице даже, то есть, может ли количество размерностей быть сокращено от десять вниз к два или три. Собственные значения, возвращенные cmdscale
, дают вам способ решить. В этом случае график каменистой осыпи тех собственных значений показывает, что двух размерностей достаточно, чтобы представлять переменные. (Заметьте, что некоторые собственные значения в графике ниже являются отрицательными, но маленькими относительно первых двух.)
[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');
В более независимом наборе переменных может быть необходимо больше размерностей. Если больше чем три переменные необходимы, визуализация не все это полезное.
2D график настройки, возвращенной 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 = 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
с помощью Евклидовых расстояний между точками, результаты идентичны PCA до изменения в знаке.
n = 10; m = 5;
X = randn(n,m);
D = pdist(X,'Euclidean');
[Y,eigvals] = cmdscale(D);
[PC,Score,latent] = pca(X);
Y
Y = -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 = -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 = 36.9993 36.9993 21.3766 21.3766 7.5792 7.5792 2.2815 2.2815 1.5981 1.5981