推荐系统是一种信息过滤系统,用于预测用户对物品的评分或偏好。解决的是信息过载和长尾问题(长尾理论)。它的本质是通过一定的方式将用户和物品联系起来。推荐系统在为用户推荐物品时通常有两种方式:1.评分预测2.TopN推荐
主流的推荐系统算法可以分为协同过滤推荐(CollaborativeFilteringRecommendation)、基于内容推荐(Content-basedRecommendation)和混合推荐等。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。主要包括基于邻域的方法(neighborhood-based)、隐语义模型(latentfactormodel)、基于图的随机游走算法(randomwalkongraph)等。而基于邻域的方法主要包含基于用户的协同过滤算法和基于物品的协同过滤算法。
基于用户的协同过滤算法主要包括两个步骤。(1)找到和目标用户兴趣相似的用户集合。(2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户步骤(1)的关键就是计算两个用户的兴趣相似度。可以通过Jaccard(杰卡德)公式或者通过余弦相似度计算Jaccard(杰卡德)公式:
余弦相似度:
基于物品的协同过滤(item-basedcollaborativefiltering)算法是目前业界应用最多的算法。基于物品的协同过滤算法主要分为两步。(1)计算物品之间的相似度。(2)根据物品的相似度和用户的历史行为给用户生成推荐列表
UserCF和ItemCF的综合比较
核心思想是通过隐含特征(latentfactor)联系用户兴趣和物品,找出潜在的主题和分类。LFM(latentfactormodel)通过如下公式计算用户u对物品i的兴趣:
定义P矩阵是user-class矩阵,矩阵值\(P_{ij}\)表示的是useri对classj的兴趣度;Q矩阵式class-item矩阵,矩阵值Qij表示的是itemj在classi中的权重,权重越高越能作为该类的代表。那么,用户U对物品I的兴趣度为:
使用LFM后,我们不需要关心分类的角度,结果都是基于用户行为统计自动聚类的;不需要关心分类粒度的问题,通过设置LFM的最终分类数就可控制粒度,分类数越大,粒度约细在user-item集K={(U,I)},其中如果(U,I)是正样本,则RUI=1,否则RUI=0。损失函数如下所示:
对\(p_{u,k}\),\(q_{k,i})\)分别求偏导数,根据随机梯度下降法,将参数沿着最速下降方向向前推进
优点:
缺点:
其中,r是m+n行,1列的矩阵,每一行代表该顶点对固定顶点的PR值;是m+n行,1列的矩阵,负责选取某一个顶点作为固定顶点,其数值只有1行为1,其余为0。M是m+n行,m+n列的矩阵,是转移矩阵,其值\(M_{ij}=\frac{1}{out(i)},j\inout(i)\else\0\),即为顶点的出度倒数,若没有连接边则为0。上式可转换为:
其中,\((E-\alphaM^T)^{-1}\)可以看做所有顶点的推荐结果,每一列代表一个顶点项,对该顶点的PR值。
协同过滤算法优缺点:
矩阵分解乃是实现隐语义模型的基石。矩阵分解根据用户对物品的评分,推断出用户和物品的隐语义向量,然后根据用户和物品的隐语义向量来进行推荐。推荐系统用到的数据可以有显式评分和隐式评分.显式评分时用户对物品的打分,显式评分矩阵通常非常稀疏.隐式评分是指用户的浏览,购买,搜索等历史记录,表示的是用户行为的有无,所以是一个密集矩阵。矩阵分解也有FunkSVD,BiasSVD,SVD++等常用形式,三种形式的差别就是在不同的预置Bias做了不同考虑
奇异值分解(SVD)原理与主要应用在数据降维中,可以将这个用户物品对应的m×n矩阵M进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维API:sklearn.decomposition.importTruncatedSVD问题:1.基于稠密向量分解,稀疏向量无法计算2.O(n^3)的计算计算复杂度,计算复杂,智能用在简单数据降维,不可用在大数据推荐
ALS是交替最小二乘的简称,在机器学习上下文中,ALS特指使用交替最小二乘求解的一个协同过滤推荐算法。它通过观察到的所有用户给物品的打分,来推断每个用户的喜好并向用户推荐合适的物品。例如:将用户(user)对商品(item)的评分矩阵分解为两个矩阵:一个是用户对商品隐含特征的偏好矩阵,另一个是商品所包含的隐含特征的矩阵。在这个矩阵分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户最商品推荐了。API:pyspark.mllib.recommendationimportALS说明:1,利用了梯度下降求解,考虑了正则化过拟合2.没解决样本偏差
在LFM中提到的\(\hat{r_{u,i}}\)中加入偏置项,即得到SVD模型。
其中\(\mu\)表示训练集中物品的所有评分的平均值,\(b_u\)是用户偏置项,表示一个用户评分的平均值,\(b_i\)是物品偏置项,表示一个物品被评分的平均值。偏置项是固有属性,每个用户和物品都有自己的值,代表该物品被大众喜爱程度或某个用户对物品的苛刻程度。新的代价函数为:
通过随机梯度下降,可以得到
说明:1,利用了梯度下降求解,正在了正则化,增加了偏置项2,没有解决反馈回执
SVD++算法就是在BiasSVD算法上进一步做优化,增加考虑用户的隐式反馈。
我们从上一步的BiasLFM(即SVD)继续演化就可以得到SVD++。SVD++在前面的基础上增加了隐式反馈和用户属性等基本信息,在学习的过程中又多了两个向量:隐式反馈的物品向量,用户属性的特征向量。假设某个用户对某个物品进行了评分,这样的行为事实上蕴含了一定的信息,从侧面反映了用户的喜好,可以将这样的反映通过隐式参数的形式体现在模型中,从而得到一个更为精细的模型
主要的优势如下:
矩阵分解的不足主要有:
常用的频繁项集的评估标准有支持度,置信度和提升度三个
该算法主要包含两个步骤:首先找出数据集中所有的频繁项集,这些项集出现的频繁性要大于或等于最小支持度;然后根据频繁项集产生强关联规则,这些规则必须满足最小支持度和最小置信度。算法原理:如果一个项集是频繁项集,则它的所有子集都是频繁项集如果一个集合不是频繁项集,则它的所有父集(超集)都不是频繁项集关联分析的目标:发现频繁项集:发现满足最小支持度的所有项集发现关联规则:从频繁项集中提取所有高置信度的规则Apriori算法采用了迭代的方法1.先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。2.对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集,3.以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果
在FP-growth算法中,通过两次扫描事务数据库,把每个事务所包含的频繁项目按其支持度降序压缩存储到FP—tree中。在以后发现频繁模式的过程中,不需要再扫描事务数据库,而仅在FP-Tree中进行查找即可,并通过递归调用FP-growth的方法来直接产生频繁模式,因此在整个发现过程中也不需产生候选模式。该算法克服了Apriori算法中存在的问颢.在执行效率上也明显好于Apriori算法。FP-growth算法通过构建FP-tree来压缩事务数据库中的信息,从而更加有效地产生频繁项集。FP-tree其实是一棵前缀树,按支持度降序排列,支持度越高的频繁项离根节点越近,从而使得更多的频繁项可以共享前缀。
关于嵌入维度数量(NewEmbedding维度)的一般经验法则:embedding_dimensions=number_of_categories**0.25