这是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.
我该怎么做才能解决我的问题? 非常感谢提前
答案 0 :(得分:3)
套件" isa",不适用于R版本3.2.2,不是必需的。只需使用definition余弦相似度自己动手:
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
。如果是这样,b
函数调用中的参数my_matrix[i,2:length(my_matrix)]
和cosine
又是data.frames,而不是exspected的向量和矩阵。
暂且不说:
即使my_matrix
被强制转换为matrix
,问题中的代码也会引发错误按摩,因为length(my_matrix)
大于列数,因此my_matrix[i,2:length(my_matrix)]
选择未定义的列。
没有第一列的i
第my_matrix
行为my_matrix[i,2:ncol(my_matrix)]
或更短my_matrix[i,-1]
。
答案 1 :(得分:2)
你可以试试这个:
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的向量(即第一行与其他行正交)。这取决于您的数据,在这种情况下很容易看到。
答案 2 :(得分:2)
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行之间的余弦相似度。
答案 3 :(得分:1)
让 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