构建非常大的余弦矩阵

我需要为具有长度为500的89,000个矢量的矢量集创建一个余弦矩阵 (即每个矢量组合之间的余弦距离矩阵),从而形成最终的89,000x89,000矩阵。 我目前的方法似乎非常低效,导致处理时间很长(例如,使用52,000个向量长度为​​500的向量组需要约36小时来构建52,000x52,000矩阵)。

我目前的解决方案使用R版本3.0.1(2013-05-16),在Intel Core i7 4960X CPU @ 3.60GHz x 12平台和64GB RAM的64位版本的ubuntu 13.10上运行。 尽管我使用的是64位系统,但我仍然遇到从R中的本地子函数中抛出的向量长度错误(例如错误:...提取的索引太多(> 2 ^ 31-1)); 似乎没有解决这个问题的方法。 因此,我目前的解决方案使用bigmemory软件包中的big.matrix对象。 我也正在使用doParallel软件包来利用我的工作站上的所有12个处理器核心。

这是我目前使用的代码:

setSize <- nrow(vectors_gw2014_FREQ_csMns) #i.e. =89,095

COSmatrix <- filebacked.big.matrix(
        #set dimensions and element value type
        setSize, setSize, init=0,
        type="double",
        backingpath = './COSmatrices',
        backingfile    = "cosMAT_gw2014_VARppmi.bak", 
        descriptorfile = "cosMAT_gw2014_VARppmi.dsc" 
        )

#initialize progress bar
pb <- txtProgressBar(min = 0, max = setSize, style = 3)
feErr <- foreach(i=1:setSize) %dopar%  {
    COSmatrix <- attach.big.matrix("./COSmatrices/cosMAT_gw2014_FREQ_csMns.dsc")
    setTxtProgressBar(pb, i)
    for (j in 1:setSize)
    {   
        if (j < i) 
        {
            COSmatrix[i,j] <- cosine(   as.vector(vectors_gw2014_FREQ_csMns[i,],mode="numeric"),
                                        as.vector(vectors_gw2014_FREQ_csMns[j,],mode="numeric") )

            COSmatrix[j,i] <- COSmatrix[i,j]

        }
        else break
    }#FOR j
}#FOREACH DOPAR i
close(pb)

我怀疑我的代码的主要问题(即导致处理时间过长)是在main foreach循环的每次迭代中重新连接big.matrix对象的调用:

COSmatrix <- attach.big.matrix("./COSmatrices/cosMAT_gw2014_FREQ_csMns.dsc")

然而,这似乎是必要的,才能访问FOREACH中的big.matrix对象(即并行处理功能来自dopa parallel package)循环; 如果在主循环中没有这行代码,COSmatrix对象将无法访问(请参阅在foreach循环中使用big.matrix)。

我正在寻找任何关于简化此流程的建议,并将处理时间从几天缩短到几小时。 这意味着我可以使用其他方法,或者使用R(即使用bigmemory包的替代方法),或者使用完全不同的工具集(即python或C ++代码)。 请记住,许多(大多数?)常用的R函数不适用于这种大小的矩阵; 我已经探索了许多有希望的途径,只是遇到长矢量32/64位限制(即错误:...提取的索引太多(> 2 ^ 31-1);请参阅R中矢量的最大长度)。

干杯!

链接地址: http://www.djcxy.com/p/31859.html

上一篇: Building very large Cosine matrix

下一篇: R distance matrix and clustering for mixed and large dataset?