如何计算R中向量与数据帧每行之间的余弦相似度?

Ozg*_*kın 1 r cosine-similarity

这是我的数据框:

                    ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704 194907960 196950156 194139014 153444738
1 56320e0e55e89c3e14e26d3d      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.01     0.000         0         0
2 563734c3b65dd40e340eaa56      0.01      0.00      0.00      0.00      0.00      0.00      0.00      0.00     0.000         0         0
3 563e12657d4c410c5832579c      0.00      0.00      0.01      0.01      0.00      0.00      0.00      0.00     0.000         0         0
4 565181854c24b410e4891e11      0.00      0.00      0.00      0.00      0.00      0.01      0.00      0.00     0.000         0         0
5 5651b53fec231f1df8482d23      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00     0.027         0         0
6 56548df4b84c321fe4cdfb8f      0.00      0.01      0.00      0.00      0.00      0.00      0.00      0.00     0.000         0         0
7 56549946735e782a885957e6      0.00      0.00      0.00      0.00      0.08      0.00      0.00      0.00     0.000         0         0
8 56549f9bb84c321fe4ce7a37      0.00      0.01      0.00      0.00      0.00      0.00      0.00      0.00     0.000         0         0
9 5654a35a735e782a8859a053      0.00      0.00      0.00      0.00      0.00      0.00      0.01      0.00     0.000         0         0
Run Code Online (Sandbox Code Playgroud)

我在这里想做的是计算 useridvector 和数据帧 a 的每一行之间的余弦相似度,但没有第一列(ui) 到目前为止我已经尝试过以下代码:

  user_id=actions_slippers$ui[i]#user_id is coming from another dataframe called action_slippers
  useridvector=a[a$ui %in% user_id, ]
  p=as.vector(cosine(t(a[,2:ncol(a)]))[,1])# this measures cosine similarity between first row of dataframe a and each other of rows from dataframe a
Run Code Online (Sandbox Code Playgroud)

但我想计算 useridvector 和没有第一列的数据帧 a 的每一行之间的余弦相似度。useridvector 看起来像这样:

 ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704 194907960 196950156 194139014 153444738
 5651b53fec231f1df8482d23         0         0         0         0         0        0         0         0     0.027         0         0
Run Code Online (Sandbox Code Playgroud)

谁能告诉我该怎么做?

Dyl*_*lan 5

cosine{lsa}作品。我想分享我的尝试。

假设您将数据保存为dataframe

> data
                        ui X194635691 X194153563 X177382028 X177382031 X195129144 X196972549 X196258704 X194907960 X196950156 X194139014 X153444738
1 56320e0e55e89c3e14e26d3d       0.00       0.00       0.00       0.00       0.00       0.00       0.00       0.01      0.000          0          0
2 563734c3b65dd40e340eaa56       0.01       0.00       0.00       0.00       0.00       0.00       0.00       0.00      0.000          0          0
3 563e12657d4c410c5832579c       0.00       0.00       0.01       0.01       0.00       0.00       0.00       0.00      0.000          0          0
4 565181854c24b410e4891e11       0.00       0.00       0.00       0.00       0.00       0.01       0.00       0.00      0.000          0          0
5 5651b53fec231f1df8482d23       0.00       0.00       0.00       0.00       0.00       0.00       0.00       0.00      0.027          0          0
6 56548df4b84c321fe4cdfb8f       0.00       0.01       0.00       0.00       0.00       0.00       0.00       0.00      0.000          0          0
7 56549946735e782a885957e6       0.00       0.00       0.00       0.00       0.08       0.00       0.00       0.00      0.000          0          0
8 56549f9bb84c321fe4ce7a37       0.00       0.01       0.00       0.00       0.00       0.00       0.00       0.00      0.000          0          0
9 5654a35a735e782a8859a053       0.00       0.00       0.00       0.00       0.00       0.00       0.01       0.00      0.000          0          0 
Run Code Online (Sandbox Code Playgroud)

使用data[,-1]subset.data.frame(data, select = names(data)[-1]消除第一列,然后转换为矩阵并使用cosine{lsa}

> res <- lsa::cosine(t(as.matrix(data[, -1])))
> res
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    0    0    0    0    0    0    0    0
 [2,]    0    1    0    0    0    0    0    0    0
 [3,]    0    0    1    0    0    0    0    0    0
 [4,]    0    0    0    1    0    0    0    0    0
 [5,]    0    0    0    0    1    0    0    0    0
 [6,]    0    0    0    0    0    1    0    1    0
 [7,]    0    0    0    0    0    0    1    0    0
 [8,]    0    0    0    0    0    1    0    1    0
 [9,]    0    0    0    0    0    0    0    0    1
Run Code Online (Sandbox Code Playgroud)

PS:安装lsa包并查看?cosine详细信息

=============================更新=====

结果矩阵就像,

      user1 **user2** user3 **user4**
user1   1    0 
user2        1
user3    ...       1
user4
Run Code Online (Sandbox Code Playgroud)

其中element(i,j)表示用户i和用户j之间的相似度。如果您userid有 2 个用户,即用户 2 和用户 4。那么您想要找到这 2 个用户与其他用户之间的相似性。它是整个相似度矩阵的子矩阵。然后使用 res[, c(2,4)] 获得所需的矩阵。