经过编辑,以提高Spacedman收到的(完全合适的)打屁股的质量问题!
我有一个k近邻对象(igraph),我是这样创建的,使用我上传的文件here:
我对数据执行了以下操作,以便创建观察之间距离的邻接矩阵:
W <- read.csv("/path/sim_matrix.csv")
W <- W[, -c(1,3)]
W <- scale(W)
sim_matrix <- dist(W, method = "euclidean", upper=TRUE)
sim_matrix <- as.matrix(sim_matrix)
mygraph <- nng(sim_matrix, k=10)
这给了我一个很好的顶点列表及其十个最近的邻居,下面是一个小样本:
1 -> 25 26 28 30 32 144 146 151 177 183 2 -> 4 8 32 33 145 146 154 156 186 199
3 -> 1 25 28 51 54 106 144 151 177 234 4 -> 7 8 89 95 97 158 160 170 186 204
5 -> 9 11 17 19 21 112 119 138 145 158 6 -> 10 12 14 18 20 22 147 148 157 194
7 -> 4 13 123 132 135 142 160 170 173 174 8 -> 4 7 89 90 95 97 158 160 186 204
到目前为止一切顺利。
然而,我正在努力的是如何访问我可以进行有意义计算的顶点之间的权重值。难道不是这么难,这是图表中常见的东西,不是吗?
查看文档,我试过了:
degree(mygraph)
给出了每个节点的权重之和。但我不想要总和,我想要原始数据,所以我可以自己计算。
我试过
get.data.frame(mygraph,"E")[1:10,]
但这没有节点之间的距离:
from to
1 1 25
2 1 26
3 1 28
4 1 30
5 1 32
6 1 144
7 1 146
8 1 151
9 1 177
10 1 183
我试图获取图形对象的顶点 out 之间的权重值,我可以使用它,但没有运气。
如果有人对如何接近这个有任何想法,我将不胜感激。感谢。
答案 0 :(得分:1)
从您的问题中不清楚您是从数据集开始,还是使用距离矩阵,例如: nng(x=mydata,...)
或nng(dx=mydistancematrix,...)
,所以这里有解决方案。
library(cccd)
df <- mtcars[,c("mpg","hp")] # extract from mtcars dataset
# knn using dataset only
g <- nng(x=as.matrix(df),k=5) # for each car, 5 other most similar mpg and hp
V(g)$name <- rownames(df) # meaningful names for the vertices
dm <- as.matrix(dist(df)) # full distance matrix
E(g)$weight <- apply(get.edges(g,1:ecount(g)),1,function(x)dm[x[1],x[2]])
# knn using distance matrix (assumes you have dm already)
h <- nng(dx=dm,k=5)
V(h)$name <- rownames(df)
E(h)$weight <- apply(get.edges(h,1:ecount(h)),1,function(x)dm[x[1],x[2]])
# same result either way
identical(get.data.frame(g),get.data.frame(h))
# [1] TRUE
因此,这些方法确定从每个顶点到其五个最近邻居的距离,并将边weight
属性设置为这些值。有趣的是,plot(g)
工作正常,但plot(h)
失败。我认为这可能是cccd
的情节方法中的一个错误。
如果你想知道的是从每个顶点到最近邻居的距离,下面的代码不需要包cccd
。
knn <- t(apply(dm,1,function(x)sort(x)[2:6]))
rownames(knn) <- rownames(df)
这里,矩阵knn
每个顶点都有一行,列指定从该顶点到它的最近邻居的距离。但是,它没有告诉你那些邻居是什么。
答案 1 :(得分:0)
好的,我在nng
包中找到了cccd
个功能。是吗?如果是这样..那么mygraph
只是一个igraph
对象,你可以E(mygraph)$whatever
来获取边缘属性的名称。
按照cccd
示例中的一个创建G1
,您可以获得所有边和属性的数据框:
get.data.frame(G1,"E")[1:10,]
您可以使用E(g)$whatever
获取/设置单个边缘属性:
> E(G1)$weight=1:250
> E(G1)$whatever=runif(250)
> get.data.frame(G1,"E")[1:10,]
from to weight whatever
1 1 3 1 0.11861240
2 1 7 2 0.06935047
3 1 22 3 0.32040316
4 1 29 4 0.86991432
5 1 31 5 0.47728632
这就是你追求的吗?任何igraph
包教程都会告诉您更多信息!