![](/img/trans.png)
[英]How to calculate cosine similarity between vector and each rows of data frame in 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
函數調用中的參數b
和my_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.