Какие методы существуют в R для визуализации «матрицы расстояний»? - PullRequest
52 голосов
/ 21 июня 2010

Я хочу представить матрицу расстояний в статье, которую я пишу, и я ищу хорошую визуализацию для нее.

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

Существуют также различные методы кластеризации, но они агрегируют данные (а это , а не , что я хочу), в то время как я хочу представить все данные.

Пример данных:

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist(nba[1:20, -1], )

Я открыт для идей.

Ответы [ 7 ]

20 голосов
/ 21 июня 2010

A Диаграмма Вороного (график разложения Вороного) - это один из способов визуального представления матрицы расстояний (DM).

Их также просто создавать и создавать с помощью R - вы можете сделать оба в одной строке кода R.

Если вы не знакомы с этим аспектом вычислительной геометрии, отношения между ними (VD & DM) просты, хотя краткое резюме может быть полезным.

Матрицы расстояний - то есть двумерная матрица, показывающая расстояние между точкой и любой другой точкой, является промежуточным выходным сигналом при вычислении kNN (т. Е. K-ближайший сосед, алгоритм машинного обучения, который прогнозирует значение заданных данных точка, основанная на средневзвешенном значении ближайших соседей «k», по расстоянию, где «k» - некоторое целое число, обычно от 3 до 5.)

kNN концептуально очень прост - каждая точка данных в вашем тренировочном наборе, по сути, является «позицией» в некотором n-мерном пространстве, поэтому следующим шагом является вычисление расстояния между каждой точкой и каждой другой точкой с использованием некоторого расстояния метрика (например, евклидова, манхэттенская и т. д.). Хотя этап обучения, т. Е. Построение матрицы расстояний, является простым, его использование для прогнозирования значения новых точек данных практически обременено поиском данных - нахождение ближайших 3 или 4 точек из нескольких тысяч или нескольких миллионов разбросаны в n-мерном пространстве.

Для решения этой проблемы обычно используются две структуры данных: kd-деревья и разложения Ворони (т. Е. «Тесселяция Дирихле»).

Разложение Вороного (VD) однозначно определяется матрицей расстояний - то есть, есть карта 1: 1; действительно, это визуальное представление матрицы расстояний, хотя, опять же, это не является их целью - их основная цель - эффективное хранение данных, используемых для прогнозирования на основе kNN.

Кроме того, будет ли хорошей идеей представлять матрицу расстояний таким образом, вероятно, больше всего зависит от вашей аудитории. Для большинства связь между VD и предшествующей матрицей расстояний не будет интуитивной. Но это не делает его неверным - если кто-то без какой-либо подготовки по статистике хотел знать, имеют ли две группы населения одинаковое распределение вероятностей, и вы показали им график Q-Q, они, вероятно, подумали бы, что вы не ответили на их вопрос. Поэтому для тех, кто знает, на что они смотрят, VD - это компактное, полное и точное представление DM.

Так, как вы делаете один?

Декомпозиция Вороного строится путем выбора (обычно случайным образом) поднабора точек из обучающего набора (это число варьируется в зависимости от обстоятельств, но если у нас было 1 000 000 баллов, то 100 является разумным числом для этого поднабора). Эти 100 точек данных являются центрами Вороного («ВК»).

Основная идея, лежащая в основе декомпозиции Вороного, заключается в том, что вместо того, чтобы просеивать 1 000 000 точек данных, чтобы найти ближайших соседей, вам нужно только взглянуть на эти 100, а затем, как только вы найдете ближайший виртуальный канал, ваш поиск фактического ближайшие соседи ограничены только точками в этой ячейке Вороного. Затем для каждой точки данных в обучающем наборе рассчитайте VC, к которому он ближе всего. Наконец, для каждого VC и связанных с ним точек, вычислите выпуклый корпус - концептуально, только внешнюю границу, образованную назначенными точками этого VC, которые находятся дальше всего от VC. Эта выпуклая оболочка вокруг центра Вороного образует «ячейку Вороного». Полный VD является результатом применения этих трех шагов к каждому VC в вашем тренировочном наборе. Это даст вам идеальную мозаику поверхности (см. Диаграмму ниже).

Чтобы рассчитать VD в R, используйте пакет tripack . Ключевой функцией является voronoi.mosaic, которой вы просто передаете координаты x и y отдельно - необработанные данные, , а не DM - тогда вы можете просто передать voronoi.mosaic в «plot» .

library(tripack)
plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))

enter image description here

19 голосов
/ 15 июня 2016

Вы также можете использовать алгоритмы рисования с применением силы для визуализации матрицы расстояний, например,

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist_m <- as.matrix(dist(nba[1:20, -1]))
dist_mi <- 1/dist_m # one over, as qgraph takes similarity matrices as input
library(qgraph)
jpeg('example_forcedraw.jpg', width=1000, height=1000, unit='px')
qgraph(dist_mi, layout='spring', vsize=3)
dev.off()

19 голосов
/ 21 июня 2010

Тал, это быстрый способ наложения текста на тепловую карту. Обратите внимание, что это зависит от image, а не heatmap, так как последний смещает график, затрудняя размещение текста в правильном положении.

Если честно, я думаю, что этот график показывает слишком много информации, что делает его немного трудным для чтения ... вы можете захотеть записать только определенные значения.

также, другой более быстрый вариант - сохранить график в формате PDF, импортировать его в Inkscape (или аналогичное программное обеспечение) и вручную добавить текст, где это необходимо.

Надеюсь, это поможет

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")

dst <- dist(nba[1:20, -1],)
dst <- data.matrix(dst)

dim <- ncol(dst)

image(1:dim, 1:dim, dst, axes = FALSE, xlab="", ylab="")

axis(1, 1:dim, nba[1:20,1], cex.axis = 0.5, las=3)
axis(2, 1:dim, nba[1:20,1], cex.axis = 0.5, las=1)

text(expand.grid(1:dim, 1:dim), sprintf("%0.1f", dst), cex=0.6)

enter image description here

15 голосов
/ 21 июня 2010

Возможно, вы захотите посмотреть на 2-мерную проекцию вашей матрицы (многомерное масштабирование). Вот ссылка на то, как это сделать в R .

В противном случае, я думаю, что вы на правильном пути с тепловыми картами. Вы можете добавить в свои номера без особых затруднений. Например, построение off Learn R :

library(ggplot2)
library(plyr)
library(arm)
library(reshape2)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)
nba.m <- ddply(nba.m, .(variable), transform,
rescale = rescale(value))
(p <- ggplot(nba.m, aes(variable, Name)) + geom_tile(aes(fill = rescale),
colour = "white") + scale_fill_gradient(low = "white",
high = "steelblue")+geom_text(aes(label=round(rescale,1))))

enter image description here

9 голосов
/ 21 июня 2010
  1. Дендрограмма, основанная на иерархическом кластерном анализе, может быть полезна: http://www.statmethods.net/advstats/cluster.html

  2. Двухмерный или трехмерный анализ многомерного масштабирования в R: http://www.statmethods.net/advstats/mds.html

  3. Если вы хотите перейти в 3+ измерения, вы можете изучить ggobi / rggobi: http://www.ggobi.org/rggobi/

7 голосов
/ 18 сентября 2012

В книге "Численная экология" Borcard et al.В 2011 году они использовали функцию, называемую * coldiss.r *, которую вы можете найти здесь: http://ichthyology.usm.edu/courses/multivariate/coldiss.R

это цвет кодирует расстояния и даже упорядочивает записи по разнице.

другим хорошим пакетом будет пакет seriation .

Ссылка: Borcard, D., Gillet, F. & Legendre, P. (2011) Числовая экология с RСпрингер.

enter image description here

3 голосов
/ 05 июля 2016

Решение с использованием многомерного масштабирования

data = read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")
dst = tcrossprod(as.matrix(data[,-1]))
dst = matrix(rep(diag(dst), 50L), ncol = 50L, byrow = TRUE) + 
  matrix(rep(diag(dst), 50L), ncol = 50L, byrow = FALSE) - 2*dst

library(MASS)
mds = isoMDS(dst)
#remove {type = "n"} to see dots
plot(mds$points, type = "n", pch = 20, cex = 3, col = adjustcolor("black", alpha = 0.3), xlab = "X", ylab = "Y") 
text(mds$points, labels = rownames(data), cex = 0.75)

enter image description here

...