用关联算法做协同过滤:

一般我们可以找出用户购买的所有去拼数据里频繁出现的项集序列,然后做频繁集挖掘,找到满足支持度阈值的关联去拼的频繁N项集或者序列。如果用户购买了频繁项集N项集或者序列里的部分商品,那么我们就可以将频繁序列或频繁项集里的其他物品按移动的评分规则推荐给用户,这个评分规则可以包括支持度、置信度和提升度等。

  • 关联规则常用的算法有:
  1.  Apriori算法
  2. FP Tree(FP-Growth)算法
  3.  PrefixSpan算法

    

1、Apriori算法

首先,先理解上面提到的评分规则:

支持度:几个关联的数据在数据集中出现的次数占总数据集的比重。

置信度:一个数据出现后,另一个数据出现的概率

提升度:提升度表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比。

对于Apriori算法,我们使用支持度来作为我们判断频繁项集的标准。Apriori算法的目标是找到最大的K项频繁集。这里有两层意思,首先,我们要找到符合支持度标准的频繁集。但是这样的频繁集可能有很多。第二层意思就是我们要找到最大个数的频繁集。

Apriori算法采用了迭代的方法,先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集,以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。

如果某一个项集是频繁项集,那么他的所有子集也是频繁项集,反过来就是说:如果一个项集是非频繁项集那么他的所有超集也是非频繁的。

算法步骤:

输入:数据集合D,支持度阈值αα

输出:最大的频繁k项集

    1)扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。

    2)挖掘频繁k项集   

      a) 扫描数据计算候选频繁k项集的支持度

      b) 去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。

      c) 基于频繁k项集,连接生成候选频繁k+1项集。

    3) 令k=k+1,转入步骤2。

  从算法的步骤可以看出,Aprior算法每轮迭代都要扫描数据集,因此在数据集很大,数据种类很多的时候,算法效率很低。

2、FP Tree(FP-Growth)算法

  主要三个部分:

    项头表    里面记录了所有的1项频繁集出现的次数,按照次数降序排列

    FP Tree     将我们的原始数据集映射到了内存中的一颗FP树

    节点链表    所有项头表里的1项频繁集都是一个节点链表的头,它依次指向FP树中该1项频繁集出现的位置。

(1)项表头的建立

我们第一次扫描数据,得到所有频繁一项集的的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。接着第二次也是最后一次扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。

(2)FP Tree的建立

有了项头表和排序后的数据集,我们就可以开始FP树的建立了。开始时FP树没有数据,建立FP树时我们一条条的读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。

(3) FP Tree的挖掘

得到了FP树和项头表以及节点链表,我们首先要从项头表的底部项依次向上挖掘。对于项头表对应于FP树的每一项,我们要找到它的条件模式基。所谓条件模式基是以我们要挖掘的节点作为叶子节点所对应的FP子树。得到这个FP子树,我们将子树中每个节点的的计数设置为叶子节点的计数,并删除计数低于支持度的节点。从这个条件模式基,我们就可以递归挖掘得到频繁项集了。

FP Tree的步骤:

    1)扫描数据,得到所有频繁一项集的的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。

    2)扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。

    3)读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。

    4)从项头表的底部项依次向上找到项头表项对应的条件模式基。从条件模式基递归挖掘得到项头表项项的频繁项集。

    5)如果不限制频繁项集的项数,则返回步骤4所有的频繁项集,否则只返回满足项数要求的频繁项集。

3、PrefixSpan算法

在Apriori和FP Tree算法中我们也已经看到过了,每个项集数据由若干项组成,这些项没有时间上的先后关系。序列数据则不一样,它是由若干数据项集组成的序列。比如第一个序列<a(abc)(ac)d(cf)>,它由a,abc,ac,d,cf共5个项集数据组成,并且这些项有时间上的先后关系。对于多于一个项的项集我们要加上括号,以便和其他的项集分开。同时由于项集内部是不区分先后顺序的,为了方便数据处理,我们一般将序列数据内所有的项集内部按字母顺序排序。

(1)子序列与频繁序列

子序列和我们数学上的子集的概念很类似,也就是说,如果某个序列A所有的项集在序列B中的项集都可以找到,则A就是B的子序列。

频繁序列则和我们的频繁项集很类似,也就是频繁出现的子序列。

(2)PrefixSpan的一些概念

PrefixSpan算法的全称是Prefix-Projected Pattern Growth,即前缀投影的模式挖掘。里面有前缀和投影两个词。那么我们首先看看什么是PrefixSpan算法中的前缀prefix。

在PrefixSpan算法中的前缀prefix通俗意义讲就是序列数据前面部分的子序列。比如对于序列数据B=<a(abc)(ac)d(cf)>,而A=<a(abc)a>,则A是B的前缀。当然B的前缀不止一个,比如<a>, <aa>, <a(ab)> 也都是B的前缀。

看了前缀,我们再来看前缀投影,其实前缀投影这儿就是我们的后缀,有前缀就有后缀嘛。前缀加上后缀就可以构成一个我们的序列。下面给出前缀和后缀的例子。对于某一个前缀,序列里前缀后面剩下的子序列即为我们的后缀。如果前缀最后的项是项集的一部分,则用一个“_”来占位表示。

下面这个例子展示了序列<a(abc)(ac)d(cf)>的一些前缀和后缀,还是比较直观的。要注意的是,如果前缀的末尾不是一个完全的项集,则需要加一个占位符。

在PrefixSpan算法中,相同前缀对应的所有后缀的结合我们称为前缀对应的投影数据库。

(3)PrefixSpan算法思想

现在我们来看看PrefixSpan算法的思想,PrefixSpan算法的目标是挖掘出满足最小支持度的频繁序列。那么怎么去挖掘出所有满足要求的频繁序列呢。回忆Aprior算法,它是从频繁1项集出发,一步步的挖掘2项集,直到最大的K项集。PrefixSpan算法也类似,它从长度为1的前缀开始挖掘序列模式,搜索对应的投影数据库得到长度为1的前缀对应的频繁序列,然后递归的挖掘长度为2的前缀所对应的频繁序列,。。。以此类推,一直递归到不能挖掘到更长的前缀挖掘为止。

(4)算法步骤

    输入:序列数据集S和支持度阈值αα

    输出:所有满足支持度要求的频繁序列集

    1)找出所有长度为1的前缀和对应的投影数据库

    2)对长度为1的前缀进行计数,将支持度低于阈值αα的前缀对应的项从数据集S删除,同时得到所有的频繁1项序列,i=1.

    3)对于每个长度为i满足支持度要求的前缀进行递归挖掘:

      a) 找出前缀所对应的投影数据库。如果投影数据库为空,则递归返回。

      b) 统计对应投影数据库中各项的支持度计数。如果所有项的支持度计数都低于阈值αα,则递归返回。

      c) 将满足支持度计数的各个单项和当前的前缀进行合并,得到若干新的前缀。

      d) 令i=i+1,前缀为合并单项后的各个前缀,分别递归执行第3步。

参考:https://www.cnblogs.com/pinard/p/6349233.html

原文地址:https://www.cnblogs.com/spp666/p/11252866.html

时间: 2024-10-18 10:13:35

用关联算法做协同过滤:的相关文章

数据挖掘算法修炼--协同过滤Collaborative Filtering

从外部看协同过滤 从互联网上寻找有用的信息越来越难,这催生了三类方法:信息检索.信息过滤和推荐系统.信息检索是指Google.百度这样的搜索引擎,这是一种被动的方式:信息过滤是指先对信息进行分类,再根据用户的偏好进行过滤,比如我们注册知乎/豆瓣/微博等时都会要求选择感兴趣的领域,之后会对我们选定领域的内容进行推送:推荐系统根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品,推荐方法有基于内容的推荐.基于模型的推荐.关联规则以及协同过滤等等. 从内部看协同过滤 核心思想 协同过滤算法的

推荐算法:协同过滤算法的介绍

一.什么是推荐算法 互联网的出现和普及给用户带来了大量的信息,满足了用户在信息时代对信息的需求,但随着网络的迅速发展而 带来的网上信息量的大幅增长,使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,对信息 的使用效率反而降低了,这就是所谓的信息超载(informationoverload)问题.解决信息超载问题的一个办法 是推荐系统. 推荐系统,就是通过分析用户的行为,兴趣偏好,进行个性化计算,由系统发现用户的兴趣点,最终将用户感兴 趣的信息.产品等推荐给用户的个性化信息推荐系统.

推荐算法:协同过滤中的 交替最小二乘法

1. 基础回顾 特别详细的总结,参考 http://blog.csdn.net/wangzhiqing3/article/details/7446444 矩阵的奇异值分解 SVD 矩阵与向量相乘的结果与特征值,特征向量有关. 数值小的特征值对矩阵-向量相乘的结果贡献小 1)低秩近似 2)特征降维 2.

协同过滤推荐算法总结

推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究.推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型的协同过滤推荐算法做原理总结. 一.推荐算法概述 推荐算法是非常古老的,在机器学习还没有兴起的时候就有需求和应用了.概括来说,可以分为以下5种: 1)基于内容的推荐:这一类一般依赖于自然语言处理NLP的一些知识,通过挖掘文本的TF-IDF特征向量,来得到用户的偏好,进而做推荐.这类推荐算法可以找到用

SimRank协同过滤推荐算法

在协同过滤推荐算法总结中,我们讲到了用图模型做协同过滤的方法,包括SimRank系列算法和马尔科夫链系列算法.现在我们就对SimRank算法在推荐系统的应用做一个总结. 1. SimRank推荐算法的图论基础 SimRank是基于图论的,如果用于推荐算法,则它假设用户和物品在空间中形成了一张图.而这张图是一个二部图.所谓二部图就是图中的节点可以分成两个子集,而图中任意一条边的两个端点分别来源于这两个子集.一个二部图的例子如下图.从图中也可以看出,二部图的子集内部没有边连接.对于我们的推荐算法中的

探秘推荐引擎之协同过滤算法小综述

数学大神.统计学大神和数据挖掘推荐大神请关注. 一.数学期望的理解 早些时候,法国有两个大数学家,一个叫做布莱士·帕斯卡,一个叫做费马.帕斯卡认识两个赌徒,这两个赌徒向他提出了一个问题.他们说,他俩下赌金之后,约定谁先赢满5局,谁就获得全部赌金.赌了半天,A赢了4局,B赢了3局,时间很晚了,他们都不想再赌下去了.那么,这个钱应该怎么分?是不是把钱分成7份,赢了4局的就拿4份,赢了3局的就拿3份呢?或者,因为最早说的是满5局,而谁也没达到,所以就一人分一半呢?这两种分法都不对.正确的答案是:赢了4

一个简单的协同过滤推荐算法

1.推荐系统简介 个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品. 2.推荐系统分类 2.1基于内容的推荐(Content-based Recommendation) 基于内容的推荐系统的核心思想是挖掘被推荐对象的信息.基于内容的推荐算法的前提假设是:如果用户喜欢物品a,那么用户也应该会喜欢与a类似的物品.由于笔者的目的是侧重于介绍协同过滤推荐算法,所以对基于内容的推荐算法举个简单的例子一带而过: 假设一首歌有:名称.歌手.风格.作曲人这4个属性.如果用户Alice对

推荐引擎算法学习导论:协同过滤、聚类、分类

作者:July.出处:结构之法算法之道 本文转自互联网,仅供学习收藏只用,如有侵权,请联系本人删除. 引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了.于是昨天下午开始到今天凌晨3点,便研究了一下推荐引擎,做了初步了解.日后,自会慢慢深入仔细研究(日后的工作亦与此相关).当然,此文也会慢慢补充完善. 本文作为对推荐引擎的初步介绍的一篇导论性的文章,将略去大部分的具体细节,侧重用最简单的语言简要介绍推荐引擎的工作原理以及其相关算法思想,且为了着重浅显易懂有些援引自本人1月7

矩阵分解在协同过滤推荐算法中的应用

在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结.(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章) 1. 矩阵分解用于推荐算法要解决的问题 在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户.比如下面的用户物品评分表: 用户\物品 物品1 物品2 物品