这是我的数据框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
谁能告诉我怎么做?
答案 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)]来获得所需的矩阵。