2013-06-18 19 views
1

这可能是一个相当深奥的问题。R有效索引匹配元素,集群评估

我试图实施一些关于空间聚类算法的Albatineh et al(2006)(DOI:10.1007/s00357-006-0017-z)的想法。基本思想是评估聚类结果稳定性的一种方法是检查观察对在相同类中的结果。在一个明确的解决方案中,观察对通常应该在同一组中结束。

挑战在于,在一个大型数据集中有n^2个可能的配对(并且大多数不会发生)。我们的输出结构如下:

A B C C A 
B A A A B 
A B C C A 

其中列索引是观察ID,每行表示聚类算法的运行。在这个例子中有5个观测值,算法运行了3次。群集标签A:C在运行之间基本上是任意的。我想一个有效的方式来计算是这样的:

ID1 ID2 
1 5 
2 
3 4 
4 3 
5 1 
1 2 
2 3 
2 4 
... 

这实现了我的目标,但慢,尤其是对大型数据帧:

testData <- matrix(data=sample(x=c("A", "B", "C"), 15, replace=TRUE), nrow=3) 

cluPr <- function(pr.obs){ 
    pairs <- data.frame() 
    for (row in 1:dim(pr.obs)[1]){ 
     for (ob in 1:dim(pr.obs)[2]){ 
      ob.pairs <- which(pr.obs[row,] %in% pr.obs[row,ob], arr.ind=TRUE) 
      pairs <- rbind(pairs, cbind(ob, ob.pairs)) 
     } 

    } 
    return(pairs) 
} 

cluPr(testData) 
+0

也许是因为,我不是一个集群精通,但在这里重读OP很多次,我不明白你在问什么。我很困惑。 – agstudy

+0

我已经添加了一些代码来澄清。 – GeoSS

+0

嗨@GeoSS,如果您认为您的问题得到满意的回答,您能否考虑接受以下答案之一? :-) –

回答

1

这里有一个比较快速的方法使用combn()函数。我假定你的矩阵的名字是m

results <- t(combn(dim(m)[2], 2, function(x) c(x[1], x[2], sum(m[, x[1]] == m[, x[2]])))) 
results2 <- results[results[, 3]>0, ] 
+0

这是真正有用的,但仍然是慢:
>米< - reg.trt [1,] >结果< - T(combn(暗(M)[2],2,函数(X)C( x [1],x [2],sum(m [,x [1]] == m [,x [2]])))) > system.time(results <-t(combn(dim(m )[2],2,function(x)c(x [1],x [2],sum(m [,x [1]] == m [,x [2]]))))) user系统经过 42.698 0.176 42.527 > system.time(cluPr(reg.trt [1,2])) 用户系统经过 23.376 0.120 23.368 – GeoSS

+0

抱歉在注释的格式。这真的很有帮助,但这需要大约40秒来处理大约1000个观察值(ID)的单行。 – GeoSS

+0

这是你正在使用的典型维度吗?我使用30行×50列矩阵比较了速度,'combn()'函数速度更快。 '> system.time(cluPr(testData)) 已过期用户系统 3.98 0.02 3.99 > system.time(new(testData)) 用户系统已过期 0.02 0.00 0.01' –

0

试试这个:

clu.pairs <- function(k, row) 
{ 
    w <- which(row==k) 

    expand.grid(w, w) 
} 

row.pairs <- function(row) 
{ 
    do.call(rbind, lapply(unique(row), function(k) clu.pairs(k, row))) 
} 

full.pairs <- function(data) 
{ 
    do.call(rbind, lapply(seq_len(nrow(data)), function(i) row.pairs(data[i,]))) 
} 

并使用full.pairs(testData)。结果与您的结果不一样,但相同。

0

我的第一个实现(不是在R中,我的代码在Java中快得多)是使用有序生成器,然后采用合并排序的方式计算交集。它的运行时间依然为O(n^2),但内存使用量却低得多。

但是,您需要意识到您的不需要需要知道确切的配对。您只需要交叉点中的数量,并且可以从交集矩阵直接计算,就像大多数其他相似性度量一样。如果您只需要计算设定的相交大小,则速度会快得多;与散列表,设置交集应在O(n)

我没有时间查看;指标和视觉支持

数据工程(ICDE),2012 IEEE第28届国际会议上

埃尔克Achtert,萨沙 - 但我们可以在

聚类评价的讨论已触及此GOLDHOFER汉斯 - 彼得·克里格尔,埃里希·舒伯特,亚瑟Zimek

在这里我们展示了一个可视化工具来探索对计数基础的措施,也适用于两种以上的集群解决方案(不幸的是,目视检查主要适用于玩具数据集,而不适用于通常太杂乱和高维度的实际数据)。

粗暴地说:请尝试使用您提到的出版物303页上的公式计算值,而不是计算,然后数着对作为直觉/动机解释!