R中存在哪些技术来可视化“距离矩阵”?

Posted

技术标签:

【中文标题】R中存在哪些技术来可视化“距离矩阵”?【英文标题】:What techniques exists in R to visualize a "distance matrix"? 【发布时间】:2011-03-06 02:17:24 【问题描述】:

我希望在我正在写的一篇文章中展示一个distance matrix,我正在为它寻找良好的可视化效果。

到目前为止,我遇到了气球图(我使用了它here,但我认为它在这种情况下不起作用)、热图(这里是 a nice example,但它们不允许显示数字在表格中,如果我错了,请纠正我。也许一半的颜色和一半的数字会很酷)最后是相关椭圆图(这里是some code and example - 使用形状很酷,但我不确定如何在这里使用它)。

还有各种聚类方法,但它们会聚合数据(这不是我想要的),而我想要的是呈现所有数据。

示例数据:

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

我对想法持开放态度。

【问题讨论】:

请拿出一些虚拟数据,很难理解你想要得到什么......我发现(经过非常简短的头脑风暴会议)相关图可能就足够了?在lower.tri 上可以放散点图,在upper.tri 上可以放相关系数……但你已经知道了,对……O_o 热图和图例有什么问题?您真的需要评论距离矩阵中的所有值吗?难道你不能在之后的情节上叠加 crucial 值吗? 嗨 aL3xa - 相关图将聚合数据 - 我试图尽可能避免这种情况(但感谢您的建议 :))。 .... 亲爱的 Nico - 这是一个很好的问题。如果我可以选择只覆盖部分数据,我可能会使用它。再一次,我需要一些帮助来编写这样的代码 - 谢谢 :) 这里不需要'dummy'数据——OP选择了正确的抽象级别来呈现这个问题。数据不会以任何有意义的方式澄清问题(除非有人不知道距离矩阵是什么,也不知道如何计算)。这个问题与任何距离矩阵有关,我们在 R 中生成一个比从 OP 中复制它要快。 不是距离本身,而是多维缩放呢? 【参考方案1】:

使用多维缩放的解决方案

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)

【讨论】:

X和Y是什么意思?他们的计量单位是什么? @FaCoffee 距离矩阵的主成分(在 MDS 的普通公式中)。【参考方案2】:

您还可以使用力导向的图形绘制算法来可视化距离矩阵,例如

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

【讨论】:

我非常喜欢这个方案,因为它实际上代表了距离。你真的想要倒数 1/dist 吗?为什么不是 1-dist?据我所知,dist 永远不会 > 1。 行“dist_mi 【参考方案3】:

您可能需要考虑查看矩阵的二维投影(多维缩放)。 Here is a link to how to do it in R.

否则,我认为您在热图方面是正确的。您可以毫不费力地添加您的号码。例如,构建关闭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】:

Tal,这是一种在热图上重叠文本的快速方法。请注意,这依赖于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)

【讨论】:

【参考方案5】:

Voronoi 图(Voronoi 分解图)是一种直观地表示距离矩阵 (DM) 的方法。

使用 R 创建和绘制它们也很简单——您可以在一行 R 代码中完成这两项工作。

如果您不熟悉计算几何的这一方面,两者(VD 和 DM)之间的关系是直截了当的,但简要总结可能会有所帮助。

距离矩阵——即显示点与其他点之间距离的二维矩阵,是 kNN 计算期间的中间输出(即 k-最近邻,一种预测给定数据值的机器学习算法点基于其“k”个最近邻居的加权平均值,距离,其中“k”是某个整数,通常在 3 到 5 之间。)

kNN 在概念上非常简单——训练集中的每个数据点本质上都是某个 n 维空间中的“位置”,因此下一步是使用某个距离计算每个点与其他每个点之间的距离公制(例如,欧几里得、曼哈顿等)。虽然训练步骤(即构造距离矩阵)很简单,但使用它来预测新数据点的值实际上会受到数据检索的阻碍——从几千或几百万中找到最接近的 3 或 4 个点分散在 n 维空间中。

两种数据结构通常用于解决该问题:kd-trees 和 Voroni 分解(又名“Dirichlet tesselation”)。

Voronoi 分解 (VD) 由距离矩阵唯一确定 - 即,存在 1:1 映射;所以它确实是距离矩阵的视觉表示,尽管这又不是他们的目的——他们的主要目的是有效存储用于基于 kNN 的预测的数据。

除此之外,以这种方式表示距离矩阵是否是一个好主意可能主要取决于您的受众。对大多数人来说,VD 和先行距离矩阵之间的关系并不直观。但这并不意味着它是错误的——如果没有接受过任何统计培训的人想知道两个总体是否具有相似的概率分布,并且你向他们展示了一个 QQ 图,他们可能会认为你没有回答他们的问题。因此,对于那些知道自己在看什么的人来说,VD 是 DM 的紧凑、完整和准确的表示。

那么你是怎么做的呢?

Voronoi decomp 是通过从训练集中选择(通常是随机的)一个点子集来构建的(这个数字因情况而异,但如果我们有 1,000,000 个点,那么 100 是这个子集的合理数字)。这 100 个数据点就是 Voronoi 中心(“VC”)。

Voronoi decomp 背后的基本思想是,不必筛选 1,000,000 个数据点来找到最近的邻居,您只需查看这 100 个,然后一旦找到最近的 VC,您就可以搜索实际的最近的邻居仅限于该 Voronoi 单元内的点。接下来,对于训练集中的每个数据点,计算它最接近的 VC。最后,对于每个 VC 及其关联点,计算凸包——从概念上讲,只是由该 VC 分配的离 VC 最远的点形成的外边界。这个围绕 Voronoi 中心的凸包形成了一个“Voronoi 单元”。完整的 VD 是将这三个步骤应用于训练集中的每个 VC 的结果。这将为您提供完美的曲面细分(参见下图)。

要在 R 中计算 VD,请使用 trippack 包。关键功能是“voronoi.mosaic”,您只需将 x 和 y 坐标分别传递给它——原始数据,而不是DM——然后你可以将 voronoi.mosaic 传递给“绘图” '。

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

【讨论】:

您好,Doug,如果我理解正确,那么这就是我所希望的 - 谢谢!我查看了该功能,并想看看我是否了解我需要做什么。我需要把距离矩阵,转成长格式,然后在上面运行代码?我查看了您的解释和有关该主题的 wiki 页面,但仍然不确定如何解释距离矩阵的图。进一步澄清将是很好的。再次非常感谢您的领导!贝斯特,塔尔。 Tal——实际上比这更容易(我根据您上面的评论编辑了我的答案)。函数 'voronoi.mosaic' 接受两个参数,一个 x 坐标向量和一个 y 坐标向量。这些是您的 Voronoi 中心——例如,从您的初始数据集中随机选择的 100 个数据点。 voronoi.mosaic 不直接接受 DM(尽管它显然是中间步骤的结果)。然后,当您制作此图表时,如果您愿意,可以使用“点”功能对其余数据点进行分层。 您好,Doug,感谢您的回复。我打算在其上运行它的数据集只有 50 个数据点(项目)。但是,对于它,我只能生成距离矩阵(我没有项目存在的多维矩阵)。所以我的问题是,鉴于我只有一个(比方说)50 个项目的距离矩阵 - 我可以从中生成一个 voronoi 图吗?谢谢您的帮助!塔尔【参考方案6】:

在 Borcard 等人的《数值生态学》一书中。 2011 他们使用了一个名为 *coldiss.r * 的函数 你可以在这里找到它:http://ichthyology.usm.edu/courses/multivariate/coldiss.R

它对距离进行颜色编码,甚至按不同程度对记录进行排序。

另一个不错的包是 seriation 包。

参考: Borcard, D.、Gillet, F. 和 Legendre, P. (2011) R. Springer 的数值生态学。

【讨论】:

【参考方案7】:

    基于层次聚类分析的树状图可能很有用: http://www.statmethods.net/advstats/cluster.html

    R 中的 2-D 或 3-D 多维缩放分析: http://www.statmethods.net/advstats/mds.html

    如果你想进入 3+ 维度,你可能想探索 ggobi / rggobi: http://www.ggobi.org/rggobi/

【讨论】:

您好杰罗米,感谢您的回复。我不知道第 2 节中的链接,所以遇到很有趣。但是,我正在寻找一种在不降低维度的情况下表示我的数据的方法。无论如何谢谢:)! 在 MSE 的意义上,MDS 在数学上对于这个问题是最优的。然而,有时结果中有非常密集的集群,这在数学上是“正确的”,但对于可视化来说并不“合适”。你对此有什么想法吗?

以上是关于R中存在哪些技术来可视化“距离矩阵”?的主要内容,如果未能解决你的问题,请参考以下文章

[读书笔记]机器学习:实用案例解析

有哪些关于 R 语言的书值得推荐

如何使用R语言进行交互数据可视化

R语言使用car包的crPlots函数可视化成分残差图(也称偏残差图)来寻找因变量和自变量之间是否存在非线性关系的证据是否满足回归模型的Linearity(线性度)

R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的AUC值并可视化多个标记物在相同时间下的ROC值多指标的ROC曲线

阅读丨大数据可视化项目的难点有哪些?