繁体   English   中英

如何计算矩阵的第一行与R中的每一行之间的余弦相似度?

[英]How can I calculate cosine similarity between first row of my matrix with each other rows in R?

这是my_matrix:

ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704   194907960 196950156 194139014 153444738 192982501 192891196
1 237      0.00      0.00      0.00      0.00      0.00      0.00         0      0.01         0         0         0         0         0
2 261      0.01      0.00      0.00      0.00      0.00      0.00         0      0.00         0         0         0         0         0
3 290      0.00      0.00      0.01      0.01      0.00      0.00         0      0.00         0         0         0         0         0
4 483      0.00      0.00      0.00      0.00      0.00      0.01         0      0.00         0         0         0         0         0
5 533      0.00      0.01      0.00      0.00      0.00      0.00         0      0.00         0         0         0         0         0
6 534      0.00      0.00      0.00      0.00      0.01      0.00         0      0.00         0         0         0         0         0

这些是我的代码如下:

b=my_matrix[1,2:length(my_matrix)]

for (i in nrow(my_matrix)) {
 res[i]=cosine(b,my_matrix[i,2:length(my_matrix)])
}

我使用“lsa”包,我想获得一个余弦相似度矩阵,用矩阵a中的每个其他向量计算b向量,但是我的代码会抛出一个错误,表示:

argument mismatch. Either one matrix or two vectors needed as input.

我该怎么做才能解决我的问题? 提前谢谢了

包“isa”,不适用于R版本3.2.2,不是必需的。 只是自己动手,使用余弦相似度的定义

my_matrix <- as.matrix(my_matrix)  # Make sure that "my_matrix" is indeed a "matrix".
v <- as.vector(my_matrix[1,-1])
M <- my_matrix[-1,-1]
cosSim <- ( M %*% v ) / sqrt( sum(v*v) * rowSums(M*M) )

仅当my_matrix不是matrix而是data.frame才需要第一行。

问题中显示的原始错误消息的可能解释:

我想问题中出现的代码中使用的对象my_matrix的类并导致错误消息

论证不匹配。 需要一个矩阵或两个向量作为输入。

data.frame ,而不是matrix 如果是这样,则cosine函数调用中的参数bmy_matrix[i,2:length(my_matrix)]也是data.frames,而不是exspected的向量和矩阵。

作为旁白:

即使my_matrix被强制转换为matrix ,问题中的代码也会引发错误按摩,因为length(my_matrix)大于列数,因此my_matrix[i,2:length(my_matrix)]选择未定义的列。 没有第一列的my_matrix的第i行是my_matrix[i,2:ncol(my_matrix)]或更短的my_matrix[i,-1]

你可以试试这个:

A <- my_matrix[, -1]
b <- A[1,]
res <- apply(A[-1, ], 1, cosine, y=b)

执行此代码时没有错误:

d <- read.table(skip=1, text="ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704   194907960 196950156 194139014 153444738 192982501 192891196
1 237      0.00      0.00      0.00      0.00      0.00      0.00         0      0.01         0         0         0         0         0
2 261      0.01      0.00      0.00      0.00      0.00      0.00         0      0.00         0         0         0         0         0
3 290      0.00      0.00      0.01      0.01      0.00      0.00         0      0.00         0         0         0         0         0
4 483      0.00      0.00      0.00      0.00      0.00      0.01         0      0.00         0         0         0         0         0
5 533      0.00      0.01      0.00      0.00      0.00      0.00         0      0.00         0         0         0         0         0
6 534      0.00      0.00      0.00      0.00      0.01      0.00         0      0.00         0         0         0         0         0")

my_matrix <- as.matrix(d)[,-1]  # without rownumbers.

library(lsa)
A <- my_matrix[, -1]  
b <- A[1,]
res <- apply(A[-1, ], 1, cosine, y=b)

但结果是所有值为0的向量(即第一行与其他行正交)。 这取决于您的数据,在这种情况下很容易看到。

lsa包中的余弦函数计算矩阵的所有列向量之间的余弦度量,因此:

cosine(t(my_matrix[,2:ncol(my_matrix)]))

将返回一个矩阵,其中第一列是my_matrix的第一个数据行(在您的示例中为b)与所有其他行之间的余弦度量向量。

如果只想要第一行的余弦相似度向量:

as.vector(cosine(t(my_matrix[,2:ncol(my_matrix)]))[,1])

该向量的第n个元素是原始矩阵的第一行和第n行之间的余弦相似度。

v为1×m向量, M为 m×n矩阵

for (i in 1:dim(M)[2]){
  sim_cos_v[i] <- (v%*%as.vector(M[,i])) / (norm(as.matrix(v), "f")*norm(as.matrix(M[,i]), "f"))
}
sim_cos_v

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM