开源推荐系统crab里面的一处bug

作为一款python写的开源推荐系统,crab总体还是很不错的。它最大的特色在于很好的实现了协同过滤算法,包括基于用户的协同过滤和基于物品的协同过滤。在阅读源码的过程中发现基于用户的协同过滤算法部分有一处bug,对最后的推荐结果影响非常的大,这里特意指出来。
基于用户的协同过滤算法步骤大致包含:
1、基于用户对物品的行为构建用户物品评分矩阵;
2、基于评分矩阵计算用户的相似度;
3、根据相似度找n个最近邻;
4、基于用户的最近邻及最近邻对物品的评分,通过评分预测公式预测用户对物品的评分。

对应到crab,主要就是recommenders/knn/class.py中的UserBasedRecommender类。其中方法:estimate_preference就是预测评分。其中有一段代码:

similarities = np.array([self.similarity.get_similarity(user_id, to_user_id)
                for to_user_id in nearest_neighbors]).flatten()

 prefs = np.array([self.model.preference_value(to_user_id, item_id)
                 for to_user_id in nearest_neighbors])

 prefs = prefs[~np.isnan(prefs)]
similarities = similarities[~np.isnan(prefs)]

第一行代码为得到用户和他的最近邻各自的相似度,按从大到小排序
第二行代码为找出最近邻中哪些之前有评价过物品item_id。
假如最近邻为A,B,C,相似度分布为[0.7,0.6,0.4]。其中B和C评价过物品item_id。那第二行的prefs应该类似[nan,1.,1.]。
这时,如果再执行第三行(prefs = prefs[~np.isnan(prefs)])。prefs就会变成[1.,1.]。
然后在执行最后一行。毕竟会警示:VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 3 but corresponding boolean dimension is 2。similarities也会为[0.7,0.6]。而这是A,B的相似度,而实际是要去B和C的相似度。所以是错误的。
修改方法:直接去掉第三行就行了。

在源码中已经修改,大家可以关注我的分支:https://github.com/aturbofly/crab
或直接:git clone https://github.com/aturbofly/crab.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值