R:创建相似度矩阵的有效方法

时间:2014-05-12 15:31:03

标签: r dataframe similarity

所以我有一个庞大的数据矩阵,并希望创建一个相似性矩阵。我知道有不同的功能可供使用(相关,余弦,互信息等),但我的问题是有效的实现。例如,可能正在利用data.frame,

所以这里是一个示例代码到目前为止,我只计算矩阵的一半的相似性,

#rm(list = ls())

load(iris)# the real data is 15K*300
tt = iris[c(1:5),1:4]

similarity_matrix_cor = matrix(data = 0, nrow = nrow(tt), ncol = nrow(tt))

for (cnt.1 in 1:nrow(tt))
{   
    print(cnt.1)
    for (cnt.2 in cnt.1:nrow(tt))
    {
        similarity_matrix_cor[cnt.1, cnt.2] = cor(as.numeric(tt[cnt.1,]), as.numeric(tt[cnt.2,]))
    }

}

complete_mat = function(tt) # eventually I add the other half of the matrix
{
    return(t(tt) + tt - diag(diag(tt),nrow=nrow(tt),ncol=ncol(tt)))
}

matrix_cor = complete_mat(similarity_matrix_cor)

1 个答案:

答案 0 :(得分:1)

你可以试试这样的事情

#helper function to access row pairs
matab<-Vectorize(
    function(a,b,fun,data) {
        fun(data[a,],data[b,])
    }, vectorize.args=list("a","b")
)

然后使用outer()创建所有巴黎

outer(1:nrow(x),1:nrow(x),matab,fun=cor,data=as.matrix(x))

只需将fun=cor替换为您喜欢的功能。它将接收您的数据行作为输入。此解决方案不假设您的函数是对称的,因此fun(a,b)的结果可能与fun(b,a)不同