Skalowanie nie-metryczne
W ogólnym przypadku macierz podobieństw może być wyznaczana w dowolny sposób. Mogą być to subiektywnie wyznaczane podobieństwa, oparte o subiektywne rankingi, pomiary odległości pomiędzy napisami, sekwencjami DNA, strukturami przestrzennymi białek, zdjęciami, dowolnymi obiektami.
W wielu sytuacjach podobieństwa mają na celu wyłącznie uporządkowanie obiektów ale nie mają samodzielnej interpretacji. Przykładowo, jeżeli porównujemy owoce, można określić, że jabłko jest bardziej podobne do gruszki niż do jagody. Takie względne podobieństwo możemy zapisać liczbami, ale wartość tych liczb nie musi mieć znaczenia, znaczenie będzie miało wyłącznie uporządkowanie.
Skalowanie nie-metryczne pozwala na znalezienie reprezentacji, która odwzorowuje kolejność odległości pomiędzy parami obiektów a nie odległość pomiędzy obiektami.
Wprowadźmy następującą funkcję zniekształcenia (tzw. funkcję ang. stress).
We wzorze powyżej oznacza monotoniczną rosnącą funkcję przekształcającą odległości pomiędzy obiektami ale zachowującą ich kolejność. Ta funkcja jest również optymalizowana w procesie minimalizacji współczynnika .
Ogólny schemat algorytmu skalowania nie-metrycznego jest następujący.
- Wyznacz początkowa konfigurację (może być losowa, lub oparta o skalowanie klasyczne),
- Wyznacz macierz odległości pomiędzy obiektami w bieżącej konfiguracji ,
- Wykonaj regresję odległości na oryginalne odległości , Zamiast przeprowadzać regresję monotoniczną (ang. isotonic regression) można też estymować parametrycznie, na bazie tej regresji wyznacz ,
- Wyznacz bieżącą wartość funkcji
- Na bazie gradientu funkcji uaktualnij współrzędne reprezentacji .
Jak przeprowadzić skalowanie nie-metryczne w R?
Funkcja isoMDS()
z pakietu MASS
wyznacza skalowanie niemetryczne.
Poniżej zastosujemy ją na tych samych danych co w poprzednim rozdziale.
library(ggplot2)
library(ggrepel)
library(MASS)
library(cluster)
glosowania <- archivist::aread("pbiecek/Przewodnik/arepo/3eab62451d26be6d14fe99dda69675ca")
podobienstwa <- daisy(glosowania[,-(1:2)])
mds2 <- isoMDS(podobienstwa, k = 2)
## initial value 11.618214
## iter 5 value 6.680174
## iter 10 value 5.892581
## iter 15 value 5.805270
## final value 5.776026
## converged
projekcja <- as.data.frame( mds2$points )
projekcja$klub <- glosowania[,2]
projekcja$imie <- glosowania[,1]
ggplot(projekcja, aes(V1, V2, label=imie)) +
geom_point(aes(color=klub)) +theme_bw()
Zaznaczmy na tym wykresie pozycje liderów klubów.
ggplot(projekcja, aes(V1, V2, label=imie)) +
geom_point(aes(color=klub)) +
geom_text_repel(data=projekcja[c(268, 348, 139, 259, 168, 309, 223),]) +theme_bw()
Inne materiały
- Sameer Agarwal i inni o Generalized Non-metric Multidimensional Scaling https://homes.cs.washington.edu/~sagarwal/nmds.pdf