Подтвердить что ты не робот

Какие методы существуют в R для визуализации "матрицы расстояния"?

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

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

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

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

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

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

Таль

4b9b3361

Ответ 1

Таль, это быстрый способ перекрытия текста над платой. Обратите внимание, что это зависит от 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)

введите описание изображения здесь

Ответ 2

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

Они также просты в создании и построении с использованием R - вы можете сделать это как в одной строке R-кода.

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

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

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

Для решения этой проблемы обычно используются две структуры данных: kd-деревья и разложения Voroni (также называемые "Teselation Dirichlet" ).

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

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

Итак, как вы это делаете?

. Разбивка Voronoi строится путем выбора (обычно случайным образом) подмножества точек из набора тренировок (это число зависит от обстоятельств, но если у нас было 1,000,000 очков, то 100 - разумное число для этого подмножества). Эти 100 точек данных являются центрами Вороного ( "VC" ).

Основная идея разворота Voronoi заключается в том, что вместо того, чтобы просеивать через 1,000,000 точек данных, чтобы найти ближайших соседей, вам нужно только посмотреть эти 100, а затем, когда вы найдете ближайший VC, ваш поиск фактического ближайшие соседи ограничены только точками внутри этой ячейки Вороного. Затем, для каждой точки данных в обучающем наборе, вычислите 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

Ответ 3

Возможно, вам захочется рассмотреть двухмерную проекцию вашей матрицы (многомерное масштабирование). Вот ссылка на то, как это сделать в 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))))

введите описание изображения здесь

Ответ 4

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

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()

Ответ 5

Ответ 6

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

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

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

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

enter image description here

Ответ 7

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

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)

введите описание изображения здесь