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