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

时间:2015-12-29 13:11:57

标签: r cosine-similarity

这是我的数据框a:

                    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

我想在这里做的是计算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

但我想计算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

谁能告诉我怎么做?

1 个答案:

答案 0 :(得分:4)

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 

使用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

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

============================ update =====

结果矩阵就像,

      user1 **user2** user3 **user4**
user1   1    0 
user2        1
user3    ...       1
user4

其中,元素(i,j)表示用户i和用户j之间的相似性。 如果您的userid有2个用户说用户2和用户4。 然后,您希望找到这两个用户与其他用户之间的相似度。 这是整个相似性矩阵的子矩阵。 然后使用res [,c(2,4)]来获得所需的矩阵。