Многомерное масштабирование ( $MDS$ ) - это средство визуализации уровня сходства отдельных объектов в наборе данных. $MDS$ используется для перевода информации о попарных« расстояниях между $n$ объектами в наборе данных в конфигурацию $n$ точек, отображаемых в абстрактное декартово пространство. С технической точки зрения, $MDS$ относится к набору связанных методов ординации , используемых при визуализации информации , в частности, для отображения информации, содержащейся в матрице расстояний . Это форма нелинейного уменьшения размерности. Учитывая матрицу расстояний расстояниями между каждой парой объектов в наборе данных, и выбрав число измерений $N$ , $MDA$ алгоритм помещает каждый объект в $N$ - мерном пространстве (низкоразмерное представление), так что между объектами расстояния сохранялись как можно лучше. Для N = 1, 2 и 3 полученные точки можно визуализировать на диаграмме рассеяния .
Формально можно задачу многомерного шкалирования сформулировать следующим образом. Имеется обучающая выборка объектов ${\bf X}^p = \{ x_1 ,...,x_p \} \subset {\bf X}$. Заданы расстояния $R_{ij} = \rho (x_i ,x_j )$ для некоторых пар обучающих объектов $(i,j) \in D$ Требуется для каждого объекта $x_i \in {\bf X}^p$ построить его признаковое описание вектор $x_i = (x_i^1 ,...,x_i^n )$ в евклидовом пространстве $\Re ^n$ так, чтобы евклидовы расстояния $d_{ij}$ между объектами $x_i$ и $x_j$:
$$d_{ij}^2 = \sum\limits_{d = 1}^n {(x_i^d } - x_j^d )^2 {\rm \;\;\;\;(1)}$$как можно точнее приближали исходные расстояния $R_{ij}$ для всех $(i,j) \in D$.
Данное требование можно формализовать по-разному; один из наиболее распространённых способов через минимизацию функционала, называемого стрессом:
$$S({\bf X}^p ) = \sum\limits_{(i,j) \in D} {w_{ij} (d_{ij} } - R_{ij} )^2 \to \min {\rm \;\;\;\;(2)}$$где минимум берётся по совокупности $pn$ переменных $(x_i^d )_{i = 1,p}^{d = 1,n}$
Размерность n обычно задаётся небольшая. В частности, при $n = 2$ многомерное шкалирование позволяет отобразить выборку в виде множества точек на плоскости. Плоское представление, как правило, искажено ($S > 0$), но в целом отражает основные структурные особенности многомерной выборки, в частности, её кластерную структуру. Поэтому двумерное шкалирование часто используют как инструмент предварительного анализа и понимания данных.
Веса $w_{ij}$ задаются исходя из целей шкалирования. Обычно берут $w_{ij} = (R_{ij} )^\gamma$. При $\gamma < 0$ приоритет отдаётся более точному приближению малых расстояний; при $\gamma > 0$ больших расстояний. Наиболее адекватным считается значение $\gamma = -2$, когда функционал стресса приобретает физический смысл потенциальной энергии системы $p$ материальных точек, связанных упругими связями; требуется найти равновесное состояние системы, в котором потенциальная энергия минимальна. Функционал стресса $S({\bf X}^p )$ сложным образом зависит от $pn$ переменных, имеет огромное количество локальных минимумов, и его вычисление довольно трудоёмко.Поэтому многие алгоритмы многомерного шкалирования основаны на итерационном размещении объектов по одному. На каждой итерации оптимизируются евклидовы координаты только одного из объектов, а координаты остальных объектов, вычисленные на предыдущих итерациях, полагаются фиксированными. Кратко формально опишим варианты реализации MDS
$MDS$ также известен как масштабирование Торгерсона – Гауэра. Он, как уже говорилось выше, принимает входную матрицу, определяющую различия между парами элементов, и выводит координатную матрицу, конфигурация которой минимизирует функцию потерь, называемую деформацией. На практике $MDS$ стремится аппроксимировать исходное пространство данных его представлением пространством более низкой размерности, минимизируя функцию потерь. Общие формы функций потерь называются напряжением на расстоянии $MDS$ и деформацией в классической $MDS$. Напряжение определяется:
$$S_{train_D } (x_1 ,x_2 ,...,x_N ) = (\frac{{\sum\nolimits_{i,j} {(b_{ij} - {\bf x}_i^T {\bf x}_j )^2 } }}{{\sum\nolimits_{i,j} {b_{ij}^2 } }})^{1/2} {\rm \;\;\;\;(3)}$$где ${\bf x}_i$ вектор в $N$ - мерном пространстве; ${{\bf x}_i^T {\bf x}_j }$ - скалярное произведение векторов ${\bf x}_i$ и ${\bf x}_j$; $b_{ij}$ - элементы матрицы ${\bf B}$ определенные на шаге 2 следующего алгоритма, которые вычисляются из расстояний.
Шаги классического алгоритма $MDS$:
Классическая $MDS$ использует тот факт, что координатная матрица ${\bf X}$ сможет быть получена разложением на собственные значения из ${\bf B} = {\bf XX}^T$. Матрица ${\bf B}$ получается из матрицы ,близости ${\bf D}$ с помощью двойного центрирования.
Получить квадратную матрицу близости ${\bf D}^{(2)} = [d_{ij}^2 ]$.
Применить двойное центрирование: ${\bf B} = \frac{1}{2}{\bf CD}^{(2)}$, здесь ${\bf C} = {\bf I} - \frac{1}{p}{\bf J}_p$ где $p$ - количество объектов; ${\bf I}$ -это единичная матрица размерности $p \times p$; ${\bf J}_p$ также единичная матрица размерности $p \times p$.
Из матрицы ${\bf B}$ получаем $m$ наибольших собственных значений $\lambda _1 ,\lambda _2 ,...,\lambda _m$ и соответствующие собственные вектора ${\bf e}_1 ,{\bf e}_2 ,...,{\bf e}_m$ ($m$ - требуемая размерность редуцированного пространства объектов).
Получение ${\bf X} = {\bf E}_m {\bf \Lambda }_m^{1/2}$ , где ${\bf E}_m$ матрица их $m$ собственных векторов; ${\bf \Lambda }_m$ -диагональная матрица из $m$ собственных значений матрицы ${\bf B}$
Классическая $MDS$ предполагает евклидовы расстояния.
Это надмножество классической MDS, которое обобщает процедуру оптимизации на множество функций потерь и входных матриц известных расстояний с весами и т. Д. Полезная функция потерь в этом контексте называется стрессом (см. выше) , который часто минимизируется с помощью процедуры, называемой мажоризацией стресса . Метрика MDS минимизирует функцию затрат, называемую «стресс», которая представляет собой остаточную сумму квадратов:
$$S_{tress_D } (x{}_1,x{}_2,...,x_N ) = (\sum\limits_{i \ne j = 1,...N} {(d_{ij} - \left\| {{\bf x}_i - {\bf x}_j } \right\|} )^2 )^{1/2} {\rm \;\;\;\;(4)}$$При масштабировании показателей используется преобразование степени с показателем степени, управляемым пользователем. $\gamma$ :$d_{ij}^{\gamma}$ и $d_{ij}^{2\gamma}$.В классическом масштабировании $\gamma =1$.
В отличие от метрической $MDS$, неметрическая $MDS$ находит как непараметрическую монотонную связь между различиями в матрице элемент-элемент и евклидовыми расстояниями между элементами, так и расположением каждого элемента в низкоразмерном пространстве. Взаимосвязь обычно определяется с помощью изотонической регрессии : пусть ${\bf x}$ обозначим вектор близости, ${\bf f}({\bf x})$ монотонное преобразование ${\bf x}$, а также $d$ точечные расстояния; затем необходимо найти координаты, которые минимизируют так называемое напряжение:
$$S_{tress} = \sqrt {\frac{{\sum {({\bf f}({\bf x}) - d)^2 } }}{{\sum {d^2 } }}} {\rm \;\;\;\;(5)}$$Существует несколько вариантов этой функции затрат. Программы $MDS$ автоматически минимизируют стресс, чтобы получить решение. Ядро неметрического алгоритма $MDS$ - это двойной процесс оптимизации. Сначала нужно найти оптимальное монотонное преобразование близости. Во-вторых, точки конфигурации должны быть расположены оптимальным образом, чтобы их расстояния как можно ближе соответствовали масштабируемой близости. Основные шаги неметрического алгоритма $MDS$:
Найдти случайную конфигурацию точек, например, путем выборки из нормального распределения.
Вычислить расстояния $d$ между точками.
Найдти оптимальное монотонное преобразование близости, чтобы получить оптимально масштабированные данные ${\bf f}({\bf x})$.
Минимизировать напряжение между оптимально масштабированными данными и расстояниями, найдя новую конфигурацию точек.
Сравнить напряжение с некоторым критерием. Если напряжение достаточно мало, выйдти из алгоритма, иначе вернуться к 2.
Анализ наименьшего пространства ($SSA$) Луи Гутмана является примером неметрической процедуры $MDS$.
Расширение метрического многомерного масштабирования, в котором целевым пространством является произвольное гладкое неевклидово пространство. В случаях, когда различия - это расстояния на поверхности, а целевое пространство - это другая поверхность, GMDS позволяет найти вложение одной поверхности в другую с минимальным искажением.
Анализируемые данные представляют собой совокупность $M$ объектов, для которых определена функция расстояния, $d_ {i, j}$: дистанция между $i$-тым и $j$-ым объекектами. Эти расстояния являются элементами матрицы несходства $D$.
Целью $MDS$ является зная $D$, найти $M$ векторов ${\bf x}{}_1,...{\bf x}{}_M \in \Re ^N$ таких,что $\left\| {{\bf x}{}_i - {\bf x}{}_j} \right\| \approx d_{ij}$ для всех $i,j \in 1,...M$
где $\left\| . \right\|$ - векторная норма. В классическом $MDS$ эта норма является евклидовым расстоянием, но, в более широком смысле, это может быть метрическая или произвольная функция расстояния.
Другими словами, $MDS$ пытается найти отображение $M$ объектов в $\Re ^N$ таким образом, что расстояния сохраняются.
Если размер $N$ выбран 2 или 3, то можно построить вектора ${{\bf x}{}_i}$ чтобы получить визуализацию сходства между $M$ объекты. При этом важно, что эти векторы не уникальны пр данном евклидовым расстоянием они могут произвольно перемещаться, вращаться и отражаться, поскольку эти преобразования не изменяют попарные расстояния $\left\| {{\bf x}{}_i - {\bf x}{}_j}\right\|$
Существуют различные подходы к определению векторов ${{\bf x}{}_i}$.Обычно МДС формулируется как задача оптимизации,где ${\bf x}{}_1,...{\bf x}_M$ достовляют минимум некоторой функции стоимости:
$$\mathop {\arg \min }\limits_{{\bf x}_1 ,....,{\bf x}_M } \sum\limits_{i < j} {(\left\| {{\bf x}_i - {\bf x}_j } \right\|} - d_{ij} )^2 {\rm \;\;\;\;(6)}$$Затем решение может быть найдено с помощью методов численной оптимизации. Для некоторых специально выбранных функций стоимости минимизаторы могут быть сформулированы аналитически в терминах разложения собственных матриц.
$\href{https://en.wikipedia.org/wiki/Multidimensional_scaling}{originalsource}$
Для рачетов использовались данный о Российских регионах. В $python$ реализации исходным было $3D$ пространство, регионы размечены на три класса. Для R реализаци исходное пространство $4D$, а регионы размечены на четыре класса. В scikit-learn мы задаем два параметра n_components = 2 (размерность выходного редуцируемого пространства) и metric = True (метрический MDS) или False (неметрический MDS) остальные параметры принимаются по умолчанию
Код $python$ :
import warnings
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
from pandas import Series, DataFrame
import pandas as pd
from sklearn.manifold import MDS
warnings.simplefilter('ignore')
result =pd.read_table('dan04.txt',sep='\s+')
print(result)
X =DataFrame(result, columns=['P10','P11','P14'])
X=np.array (X)
SUMX=X[:,0] +X[:,1] + X[:,2]
X[:,0] =X[:,0] /SUMX
X[:,1] =X[:,1] /SUMX
X[:,2] =X[:,2] /SUMX
YT=result['P18']
y=np.array(YT)
XX1=result.query("P18 in [0]")
XX2=result.query("P18 in [1]")
XX3=result.query("P18 in [2]")
XX1 =DataFrame(XX1, columns=['P10','P11','P14'])
XX1=np.array (XX1)
XX2 =DataFrame(XX2, columns=['P10','P11','P14'])
XX2=np.array (XX2)
XX3 =DataFrame(XX3, columns=['P10','P11','P14'])
XX3=np.array (XX3)
SUMX1=XX1[:,0] +XX1[:,1] + XX1[:,2]
XX1[:,0] =XX1[:,0] /SUMX1
XX1[:,1] =XX1[:,1] /SUMX1
XX1[:,2] =XX1[:,2] /SUMX1
SUMX2=XX2[:,0] +XX2[:,1] + XX2[:,2]
XX2[:,0] =XX2[:,0] /SUMX2
XX2[:,1] =XX2[:,1] /SUMX2
XX2[:,2] =XX2[:,2] /SUMX2
SUMX3=XX3[:,0] +XX3[:,1] + XX3[:,2]
XX3[:,0] =XX3[:,0] /SUMX3
XX3[:,1] =XX3[:,1] /SUMX3
XX3[:,2] =XX3[:,2] /SUMX3
# Преобразование данных, уменьшающее размерность до 2
mod_mds = MDS(n_components=2, metric = True)
X_mds = mod_mds .fit_transform(X)
X_mds.shape
XI =DataFrame(X_mds, columns=['1','2'])
XI = XI.join(YT)
XI1=XI.query("P18 in [0]")
XI2=XI.query("P18 in [1]")
XI3=XI.query("P18 in [2]")
XI1 =DataFrame(XI1, columns=['1','2'])
XI1=np.array (XI1)
XI2 =DataFrame(XI2, columns=['1','2'])
XI2=np.array (XI2)
XI3 =DataFrame(XI3, columns=['1','2'])
XI3=np.array (XI3)
#построение исходного графика 3 D
fig = plt.figure(1, figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
xs1 = XX1[:,0]
ys1 = XX1[:,1]
zs1 = XX1[:,2]
xs2 = XX2[:,0]
ys2 = XX2[:,1]
zs2 = XX2[:,2]
xs3 = XX3[:,0]
ys3 = XX3[:,1]
zs3 = XX3[:,2]
ax.scatter(xs1, ys1, zs1,c='g', cmap=plt.cm.nipy_spectral, edgecolor='k',s=80,label='A')
ax.scatter(xs2, ys2, zs2,c='r', cmap=plt.cm.nipy_spectral, edgecolor='k',s=80,label='P')
ax.scatter(xs3, ys3, zs3,c='b', cmap=plt.cm.nipy_spectral, edgecolor='k',s=80,label='D')
ax.set_title("Исходное пространство предикторов",fontsize=16, fontweight='bold')
ax.set_xlabel('P10',fontsize=14, fontweight='bold')
ax.set_ylabel('P11',fontsize=14, fontweight='bold')
ax.set_zlabel('P14',fontsize=14, fontweight='bold')
ax.legend(loc="best")
y = np.choose(y, [1, 2, 0]).astype(np.float)
fig = plt.figure(2,figsize=(10, 8))
plt.clf()
plt.cla()
plt.scatter(XI1[:, 0], XI1[:, 1], c='g', cmap=plt.cm.nipy_spectral, edgecolor='k',s=100,label='A')
plt.scatter(XI2[:, 0], XI2[:, 1], c='r', cmap=plt.cm.nipy_spectral, edgecolor='k',s=100,label='P')
plt.scatter(XI3[:, 0], XI3[:, 1], c='b', cmap=plt.cm.nipy_spectral, edgecolor='k',s=100,label='D')
plt.title("Снижение размерности методом MDS",fontsize=16, fontweight='bold')
plt.xlabel("MDS1",fontsize=14, fontweight='bold')
plt.ylabel("MDS2",fontsize=14, fontweight='bold')
plt.legend(loc='best')
plt.show()
P10 P11 P14 P16 P18 0 148863.0 710829 257038 336148.5 0 1 262.0 218544 85146 253157.2 0 2 5005.0 448428 29651 225731.2 1 3 7726.0 448223 219151 552288.4 0 4 972.0 152792 16085 164827.4 0 .. ... ... ... ... ... 76 1016799.0 60300 11147 148497.4 2 77 10330.0 6632 5772 24075.7 2 78 67502.0 1055 1334 9573.8 2 79 1808823.0 6413663 7308 4798454.0 2 80 24035.0 2615910 0 1412406.0 1 [81 rows x 5 columns]
Как видно из графиков реализованный в sklearn.manifold модуль MDS при заданных параметрах в метрическом варианте гораздо лучше сохраняет топологию объектов, чем неметрический вариант многомерного масштабирования.
Код R :
options(warn=-1)
library(gmodels)
library(lattice)
library(vegan)
library(grDevices)
library(reshape2)
library(ggplot2)
library(ggthemes)
library(psych)
library(caret)
load("xRegion.RData")
#ФОРМИРОВАНИЕ data.frame ОСНОВНЫЕ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ РЕГИОНОВ РФ
xreg <-data.frame(P1=x$Pok_001,P2=x$Pok_002,P3=x$Pok_003,P4=x$Pok_004,
P5=x$Pok_005,P6=x$Pok_006,P7=x$Pok_007,P8=x$Pok_008,P9=x$Pok_009,P10=x$Pok_010,
P11=x$Pok_011,P12=x$Pok_012,P13=x$Pok_013,P14=x$Pok_014,P15=x$Pok_015,P16=x$Pok_016,
P17=x$Pok_017,P18=x$Pok_018)
#xreg
#Формирование фактора тип экономики региона
xreg_f <- as.factor(x$Pok_018)
#выбор исследуемого подмножества показателей регионов
w=c(10,11,14,16)
reg.ekon <-xreg[,w]
valreg <-rowSums(reg.ekon)
xreg_nor <-reg.ekon/valreg
Y <- xreg_nor
X=Y
X <- as.matrix(X)
#Метод nMDS ==================================================
#метрики "euc", "man", "bray", "jac", "kul"
x.mds = metaMDS(X, distance = "euc")
x.mds
#plot(x.mds)
data.scores = as.data.frame(scores(x.mds))
y.MDS <-data.frame(y1=data.scores[,1],y2=data.scores[,2],Econ=xreg_f)
#График регионов по классам в двухмерном пространстве NMDS
x11()
g4 <-ggplot(data= y.MDS, aes(x=y1,y=y2,colour = Econ),
colors = "Accent")
g4 <-g4 +geom_point(size=4)
g4 <-g4 +labs(title ="Регионы в пространсте двух компонент nMDS",
x="Компонента 1", y="Компонента 2",colour = "Классы")
g4 <-g4 + theme_fivethirtyeight() + scale_colour_manual( values = c('darkgoldenrod4',
'blue','red','green'))
#g4 <-g4 + theme_stata() + scale_colour_stata()
g4
# mMDS ====================================================
df.mds <- cmdscale(dist(X), eig = TRUE, k = 2)
df.mds$eig
#plot(df.mds$points[, 1], df.mds$points[, 2], col = xreg_f)
y2.MDS <-data.frame(y1=df.mds$points[, 1],y2=df.mds$points[, 2],Econ=xreg_f)
x11()
g4 <-ggplot(data= y2.MDS, aes(x=y1,y=y2,colour = Econ),
colors = "Accent")
g4 <-g4 +geom_point(size=4)
g4 <-g4 +labs(title ="Регионы в пространсте двух компонент mMDS",
x="Компонента 1", y="Компонента 2",colour = "Классы")
g4 <-g4 + theme_fivethirtyeight() + scale_colour_manual( values = c('darkgoldenrod4',
'blue','red','green'))
#g4 <-g4 + theme_stata() + scale_colour_stata()
g4
Run 0 stress 0.05334588 Run 1 stress 0.05407445 Run 2 stress 0.05337012 ... Procrustes: rmse 0.002337508 max resid 0.01975344 Run 3 stress 0.05407445 Run 4 stress 0.05431067 Run 5 stress 0.1001254 Run 6 stress 0.05334588 ... New best solution ... Procrustes: rmse 5.862565e-06 max resid 3.716492e-05 ... Similar to previous best Run 7 stress 0.1661277 Run 8 stress 0.05407445 Run 9 stress 0.05427941 Run 10 stress 0.05360541 ... Procrustes: rmse 0.004116064 max resid 0.02642924 Run 11 stress 0.05427942 Run 12 stress 0.09988802 Run 13 stress 0.09988797 Run 14 stress 0.05431066 Run 15 stress 0.05334588 ... New best solution ... Procrustes: rmse 5.255521e-06 max resid 3.990065e-05 ... Similar to previous best Run 16 stress 0.05431065 Run 17 stress 0.05363038 ... Procrustes: rmse 0.003230515 max resid 0.02591398 Run 18 stress 0.05337012 ... Procrustes: rmse 0.002337145 max resid 0.01975183 Run 19 stress 0.05334589 ... Procrustes: rmse 8.284833e-06 max resid 4.470167e-05 ... Similar to previous best Run 20 stress 0.09975054 *** Solution reached
Call: metaMDS(comm = X, distance = "euc") global Multidimensional Scaling using monoMDS Data: X Distance: euclidean Dimensions: 2 Stress: 0.05334588 Stress type 1, weak ties Two convergent solutions found after 20 tries Scaling: centring, PC rotation Species: expanded scores based on 'X'
В R метрический и неметрический методы реализованы в разных пакетах. Результаты работы метрического и неметрического методов практически совпадают. Здесь оба подхода к многомерному шкалированию хорошо сохраняют топологию регионов в редудицированном пространстве 2D.