推荐系统是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程。个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品。
在日常生活中我们常用的推荐系统有两种,一种是非定制的推荐系统(Non-personalized recommendation),另一种是定制的推荐系统(Personal recommendation)。
非定制的推荐系统
非个性化推荐,顾名思义就是不会去考虑每个用户特性以及用户的历史行为,比较简单粗暴的推荐给用户销量可观(近期热销商品)的商品数据。也就是每个用户在同一时间段收到的推送基本上相差不大。
定制的推荐系统
定制的推荐系统也称个性化推荐系统,顾名思义就是根据用户特有属性(历史行为、相关偏好等)来挖掘用户可能感兴趣的信息数据来完成实时性的推送。个性化推荐的效果基本也决定了整个推荐系统的推荐效果,我们在日常遇到的推荐系统(如淘购物、音乐、学习平台等)基本也都是个性化推荐系统,其中个性化推荐系统最常用的两种方法:一种是协同过滤(collaborative filtering) ,另外一种是基于内容的推荐(content-based recommendation)。下面重点讲述以下协同过滤的相关思想以及算法。
协同过滤
协同过滤算法算得上是推荐系统里使用的相对较早的一种算法,但至今此算法的思想仍然在使用,可见此算法是一种非常经典、稳定的算法。
协同过滤的主要思想就是找相似,正如“物以类聚,人以群分”,此算法的目的找到物品之间、用户之间的相似性,如在购物平台,我们购买了机器学习的相关书籍,当我们下次再打开同一APP时,系统可能会给我们推荐类似的算法书或者编程书,因为这两样物品很相似,这就是基于物品的协同过滤算法(ItemCF));再或者两个都爱看恐怖电影人,当其中一个人通过某个APP观看了一部恐怖电影,那么另外一个人打开同一个APP时,可能系统会给他推荐同一部电影,因为这两个人很‘相似’,这就是基于用户的协同过滤算法(UserCF)。
协同过滤算法主要分为以下三步:
Step1:收集用户历史偏好数据
Step2:通过相似度量方法找到相似的人或者物品
Step3:基于相似度量值排序后进行个性化推荐
其中最重要的一步就是寻找相似的度量方法。
协同过滤中常用的相似度量方法
- Pearson相关系数
Pearson系数(Pearson Correlation Coefficient)表示两个用户之间相关性时,取值范围为[-1,+1],其中-1表示完全负相关,+1表示完全正相关,0表示不相关。
u、v表示两个用户,表示相关系数,c表示某一物品,表示用户u对物品c的评分,表示用户u对所有物品的评分的均值,、类似。
特别提醒:注意使用皮尔逊相关系数的条件!!
当计算出用户的相关性后,就可以选择出最相似的N个近邻用户计算对物品的评分预测值,也就是说N个近邻用户对物品均有评分值,评分预测公式如下:
- Jaccard相似系数
Jaccard相似系数(Jaccardsimilarity coefficient)是衡量两个集合的相似度一种指标。两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
通常会用 Jaccard相似系数来评估用户是否会对某商品进行打分,而不用于用户对某商品的打分多少,因为 Jaccard相似系数无法反映出用户的评分喜爱信息。
- 余弦相似度
我们都知道,坐标里面的两个点,如果他们的夹角越小,那么这两个点越相近。因此在基于物品的最近邻推荐算法中通常采用余弦相似度来计算两个物品之间的相似度,相似度取值范围为[0,1],值越接近1,相似度也就越高。为考虑用户评分平均值之间的差异性,一般都使用改进余弦相似度公式来计算相似度,通过改进余弦相似度来在评分值中减去平均值,这样使得最终的取值范围跟皮尔逊相关系数的取值范围一致,也为[-1,+1]。改进余弦相似度公式如下:
其中c1、c2表示两个物品,其余参数和上面意义类似。
另外,常用的还有通过距离(欧氏距离)、K-means等来进行相似度的计算。
实例:下表为用户评分矩阵,数据分别表示五个用户对五个物品的喜爱程度,我们来基于这个评分矩阵计算出用户User1对于物品ItemE的评分:
| 用户 | ItemA | ItemB | ItemC | ItemD | ItemE |
|---|---|---|---|---|---|
| User1 | 5 | 3 | 4 | 4 | ? |
| User2 | 3 | 2 | 2 | 3 | 3 |
| User3 | 4 | 3 | 4 | 3 | 5 |
| User4 | 3 | 3 | 1 | 5 | 4 |
| User5 | 1 | 5 | 5 | 2 | 1 |
首先分别基于用户和物品分别计算相似度,此例使用的是Pearson相关系数。
# 计算用户间相似度 默认是列
user_similar = df.T.corr()
print("用户之间的相似度")
print(user_similar.round(4))
# 计算商品间相似度默认是列
item_similar = df.corr()
print("物品之间的相似度")
print(item_similar.round(4))
用户之间的相似度为:
物品之间的相似度为:
通过用户之间的相关系数矩阵,可以找到与User1用户的相关性最大的两个用户,代码如下:
item = "ItemE"
user = "User1"
_df = user_similar.loc[user].drop(user)
_df_sorted = _df.sort_values(ascending = False)
sim_users = list(_df_sorted.index[:2])
print("User1最相似的两个用户")
pprint(sim_users)
结果:User1最相似的两个用户为User2和User3。
基于用户之间的相关性预测User1对ItemE的评分
sum1 = 0
sum2 = 0
for sim_user in sim_users:
sum1 += df.loc[sim_user].loc[item] * user_similar.loc[user].loc[sim_user]
sum2 += user_similar.loc[user].loc[sim_user]
print("使用用户间的相似度进行预测:Use1给ItemE打分结果:")
print(sum1/sum2)
结果:使用用户间的相似度进行预测,Use1给ItemE打分为3.9066。
同理可以基于商品之间的相似性预测用户User1对商品ItemE的评分,代码如下:
#基于商品评分
_df = item_similar.loc[item].drop(item)
_df_sorted = _df.sort_values(ascending = False)
sim_items = list(_df_sorted.index[:2])
print("ItemE最相似的两个商品")
pprint(sim_items)
sum1 = 0
sum2 = 0
for sim_item in sim_items:
sum1 += df.loc[user].loc[sim_item] * item_similar.loc[item].loc[sim_item]
sum2 += item_similar.loc[item].loc[sim_item]
print("使用商品间的相似度进行预测:Use1给ItemE打分结果:")
print(sum1/sum2)
结果:ItemE最相似的两个商品为ItemA、ItemD。使用商品间的相似度进行预测,Use1给ItemE打分为4.625
这样就通过计算用户之间的相似度和商品之间的相似度预测出某个用户对商品的喜爱程度,对多个商品进行预测排序后,选出打分结果在某一阈值之上的商品,就可以对用户进行个性化的推荐了。
这只是推荐系统中最简单的思想和例子,需要的同学可以思考一下,这种简单的协同过滤的算法其优点和缺点以及适用情形。另外,读者也可以思考一下,真实情况下,样本数据的维度较大,如何改进协同过滤的算法,如引入降维方法、新的相关性的计算方法、结合ItemCF与UserCF的结果进行再学习等。
扫描下方的二维码进入ChallengeHub粉丝群,也可以添加管理员微信回复研究方向或专业拉您入群。
与爱好AI的朋友们共同成长
ChallengeHub粉丝群
管理员微信
