R中存在哪些技术来形象化“距离matrix”?
我想在我正在写的一篇文章中提出一个距离matrix ,我正在寻找一个良好的可视化。
到目前为止,我遇到了气球图(我在这里使用它,但我不认为它会在这种情况下),heatmaps(这里是一个很好的例子 ,但他们不允许在表中显示数字,正确如果我错了,也许一半的表颜色和一半的数字会很酷),最后是相关的椭圆图(这里是一些代码和例子 – 这是很酷的使用形状,但我不知道如何使用它这里)。
也有各种聚类方法,但他们会汇总数据(这不是我想要的),而我想要的是呈现所有的数据。
示例数据:
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") dist(nba[1:20, -1], )
我很乐意提供想法。
塔尔
Tal,这是在热图上叠加文本的一种快速方法。 请注意,这依赖于image
而不是heatmap
因为后者抵消了情节,使得将文本置于正确的位置变得更加困难。
说实话,我认为这个图表显示了太多的信息,使得读起来有些困难…你可能只想写出特定的值。
另外,另一个更快捷的select是将图表保存为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)
Voronoi图 (Voronoi分解图)是直观表示距离matrix(DM)的一种方法。
使用R创build和绘图也很简单 – 您可以在一行R代码中执行这两个操作。
如果你不像计算几何的这个方面,两者之间的关系(VD&DM)是直接的,尽pipe一个简短的总结可能是有帮助的。
距离matrix – 即表示点与其他点之间的距离的二维matrix,是在kNN计算期间的中间输出(即,k-最近邻,机器学习algorithm,其预测给定数据点的值,基于其“k”个最近邻的加权平均值,距离方式,其中“k”是某个整数,通常在3和5之间)
kNN在概念上非常简单 – 训练集中的每个数据点本质上都是某个n维空间中的“位置”,因此下一步是使用某个距离度量(例如,计算每个点与每个其他点之间的距离,欧几里得,曼哈顿等)。 虽然训练步骤 – 即构build距离matrix – 很简单,但使用它来预测新数据点的值实际上受到数据检索的阻碍 – find几千或几百万个中最接近的3或4个点分散在n维空间中。
通常使用两种数据结构来解决这个问题:kd-trees和Voroni分解(又名“Dirichlet tesselation”)。
Voronoi分解(VD)由距离matrix唯一确定 – 即有1:1的映射; 所以它确实是一个距离matrix的视觉表示,虽然这又不是它们的目的 – 它们的主要目的是有效存储用于基于kNN的预测的数据。
除此之外,以这种方式表示距离matrix是否是一个好主意可能最依赖于你的观众。 大多数情况下,VD与先行距离matrix之间的关系并不直观。 但是这并不是不正确的 – 如果没有任何统计学培训的人想知道两个人群是否有类似的概率分布,而你给他们展示了一个QQ情节,他们可能会认为你没有接受他们的问题。 所以对于那些知道他们在看什么的人来说,VD是一个DM的紧凑,完整和准确的表示。
那么你如何制作一个?
Voronoi分解是通过从训练集内select(通常是随机的)点的一个子集来构造的(这个数目因情况而异,但是如果我们有1,000,000个点,那么对于这个子集是100是一个合理的数目)。 这100个数据点是Voronoi中心(“VC”)。
Voronoi数据库背后的基本思想是,不必筛选1,000,000个数据点来查找最近的邻居,只需要查看这100个数据,一旦find最近的VC,就可以search最近的邻居仅限于该Voronoi单元内的点。 接下来,对于训练集中的每个数据点,计算它最接近的VC。 最后,对于每个VC及其关联点,从概念上计算凸包,就是VC所分配的最远离VC的点所形成的外边界。 Voronoi中心周围的这个凸包形成一个“Voronoi细胞”。 完整的VD是将这三个步骤应用于训练集中的每个VC的结果。 这将给你一个完美的表面tesselation(见下图)。
要计算R中的VD,请使用tripack软件包。 关键函数是“voronoi.mosaic”,您只需在x和y坐标中分别传递 – 原始数据, 而不是 DM – 然后您可以将voronoi.mosaic传递给“plot”。
library(tripack) plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))
您可能需要考虑查看matrix的二维投影(多维缩放)。 这里是如何在R中做的链接 。
否则,我认为你是在热点地图正确的轨道上。 你可以添加你的号码,没有太多的困难。 例如,build立closures学习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))))
您也可以使用强制导向的graphics绘制algorithm来显示距离matrix,例如
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()
-
基于层次聚类分析的树状图可能是有用的: http : //www.statmethods.net/advstats/cluster.html
-
R中的二维或三维多维尺度分析: http : //www.statmethods.net/advstats/mds.html
-
如果你想进入3维以上,你可能想要探索ggobi / rggobi: http ://www.ggobi.org/rggobi/
在Borcard等人的“数值生态学”一书中, 2011他们使用了一个名为* coldiss.r *的函数,你可以在这里find它: http ://ichthyology.usm.edu/courses/multivariate/coldiss.R
它通过不同的颜色来编码距离甚至命令logging。
另一个好的包是系列包。
参考文献:Borcard,D.,Gillet,F.&Legendre,P.(2011)数值生态学与R. Springer。
使用多维缩放的解决scheme
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)