代码之家  ›  专栏  ›  技术社区  ›  Tal Galili

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

  •  50
  • Tal Galili  · 技术社区  · 15 年前

    我想提出一个建议 distance matrix 在我写的一篇文章中,我正在为它寻找良好的视觉效果。

    到目前为止,我发现气球图(我用它) here a nice example some code and example -这是很酷的使用形状,但我不知道如何使用它在这里)。

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

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

    我乐于接受意见。

    7 回复  |  直到 7 年前
        1
  •  21
  •   David Arenburg Ulrik    9 年前

    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

        2
  •  23
  •   SuperBiasedMan Jayesh Kalkani    9 年前

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

    如果你不熟悉计算几何的这一方面,那么这两者之间的关系(VD&DM)是直截了当的,尽管简短的总结可能会有所帮助。

    距离矩阵——也就是说,一个显示一个点和其他每一个点之间距离的2D矩阵,是kNN计算过程中的中间输出(也就是说,k-最近邻,一种机器学习算法,它根据给定数据点的“k”最近邻的加权平均值,按距离预测给定数据点的值,其中“k”是一个整数,通常在3到5之间。)

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

    两种数据结构通常用于解决这个问题:kd树和Voroni分解(也称为“Dirichlet细分”)。

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

    那你怎么做呢?

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

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

    要计算R中的VD,请使用 包裹。关键函数是“voronoi.mosaic”,你只需分别传递x和y坐标——原始数据, DM——然后你可以把voronoi.mosaic传递给“plot”。

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

    enter image description here

        3
  •  23
  •   jmb    9 年前

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

        4
  •  17
  •   David Arenburg Ulrik    9 年前

    您可能需要考虑查看矩阵的二维投影(多维缩放)。 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))))
    

    enter image description here

        6
  •  7
  •   Wes McClintick    11 年前

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

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

    另一个好的方案是 系列化 包裹。

    参考文献: Borcard,D.,Gillet,F&勒让德,P(2011)数字生态学与R。斯普林格。

    enter image description here

        7
  •  4
  •   catastrophic-failure    9 年前

    一种多维尺度的求解方法

    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