全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
8988 9
2014-12-30
如下两个数据框
> recommendation
   user item  val
1     1  104 30.5
2     1  105 12.5
3     1  106  7.5
4     2  105 13.0
5     2  106  9.0
6     3  103 24.5
7     3  106 10.5
8     3  102  8.0
9     4  105 22.0
10    4  102 20.5
11    4  106 12.5
12    5  102 16.0
> testing
   user item pref
11    3  107    5
15    4  106    4
17    5  102    3


现在要利用这两个数据框进行数据分析:
precision=推荐正确率 就是说  3  107 在recommendation中没有推荐 则0/3 (3是向user=3的用户推荐的item 数)
                                         4  106 在recommendation中有推荐 1/3
                                         5  102 在recommendation中有推荐1/1
                                        (4/3)/3(和除以测试用户数)=4/9
recall=喜好正确率 就是说 0+1(对于用户4来说,只喜欢106,也推荐了106,所以是1)+1(对于用户5来说,102同理)=2
                          2/3(和除以测试用户数)即r值
那么,请问这种怎么用r语言写出来,因为可能涉及循环(需要验证testing中的user、item是否属于recommendation),并不是特别懂,特来询问,望回复解答,非常感谢!
[precision&recall已经解决 非常感谢高手解答!]

还有一个问题求助:
还有一个值auc
auc=(testing在recommendation的序列/用户推荐长度)/测试用户总数
比如 3 107没有推荐 就是 0
       4 106 排第三个 就是 3/3
       5 102 排第一个 就是 1/1
然后加起来除以testing总数 这个序列又如何操作?
用一楼的大神代码:
each_precision =sapply(unique(m[,1]),function(x) nrow(subset(m,m[,1]==x&m[,2]==m[,4]))/sum(m[,1]==x))

#nrow是行数 所以只需要将行数 改成在m中的user索引序列
但是索引这边总出问题 还请高手回复
谢谢谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-12-30 09:28:04
复制代码
each_precision那一句应该可以借助melt后的功能更好得到,或者data.table包,我用的不熟
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-30 09:34:09
复制代码

m2即是测试与推荐达到吻合的地方
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-30 10:20:07
我觉得是可以通过merge函数来实现precision的计算的,因为你按照user and item合并后,设置all=TRUE,并且先在testing的数据集添加一列全部为1的常数量,合并后,只需要对这一列加总就可以看出有多少是匹配的了。
主要是楼主给的数据太少,我这种做法适合你给同一个user推荐多种商品的时候计算的。

再结合tapply和length函数,计算出每一个user推荐的产品数,就可以算precision了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-30 10:36:48
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-30 10:59:28
flg <- 1
recommendation <- data.frame(recommendation,flg)
flg <- 0
testing <- data.frame(testing,flg)
usercount <- data.frame(with(recommendation,table(user)))
recommendation1 <- rbind(recommendation[,c("user","item","flg")],testing[,c("user","item","flg")])
preList <- aggregate(recommendation1,by=list(recommendation1$user,recommendation1$item),FUN=sum)
pre <- merge(testing,preList,by.x=c("user","item"),by.y=c("Group.1","Group.2"))[,c(1,2,7)]
precision <- merge(pre,usercount)
precision <-  data.frame(precision,preci=precision$flg.y/precision$Freq)
precision[,c(1,2,5)]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群