zoukankan      html  css  js  c++  java
  • 数据挖掘——关联算法

    一、概念

    关联(Association)

    关联就是把两个或两个以上在意义上有密切联系的项组合在一起。

    关联规则(AR,Assocaition Rules)

    用于从大量数据中挖掘出有价值的数据项之间的相关关系。(购物篮分析)

    协同过滤(CF,Collaborative Filtering

    协同过滤常常被用于分辨某位特定顾客可能感兴趣的东西,这些结论来自于对其他相似顾客对哪些产品感兴趣的分析。(推荐系统)

    二、关联规则

    1、相关数据指标

    两个不相交的非空集合X、Y,如果X -> Y,就说X -> Y是一条关联规则。

    强度:支持度(Support):support({X -> Y}) = 集合X与集合Y中的项在一条记录中同时出现的次数 / 数据记录的个数

       自信度(Confidence):confidence({X -> Y})集合X与集合Y中的项在一条记录中同时出现的次数 / 集合X出现的次数

    效度:提升度(Lift):度量规则是否可用的指标,描述的是相对于不用规则,使用规则可以提高多少,提升度大于1,规则有效

              lift({X -> Y}) = confidence({X -> Y}) /  support({X -> Y})

    2、计算步骤

    • 扫描数据集,统计一级候选集出现的次数
    • 清除不满足条件的候选项集,得到一级项集
    • 从一级项集中国,组合二级候选项集,统计数据集中它们出现的次数
    • 清除不满足条件的候选项集,得到二级项集
    • 从二级项集中,组合三级候选项集,统计数据集中他们出现的次数
    • ……
    • 将得到的项集作为结果返回

    大致过程如下:

                         

      

    3、 使用python实现关联算法(apriori算法)

    !apriori 包不支持DataFrame的数据格式,需要将数据转化为array数组

    #导入如下格式的数据

    #变换数据格式,然后通过apriori方法进行处理

    transform = data.groupby(by='交易ID').apply(lambda x: list(x.购买商品)).values
    
    result = list(apriori(transform))

    输出result并观察,发现如下规律

    #该数据格式包含各种项集和所对应的支持度、自信度、提升度
    '''RelationRecord(
    items=frozenset({'可乐'}), 
    support=0.4, ordered_statistics=[OrderedStatistic(
    items_base=frozenset(), items_add=frozenset({'可乐'}),
    confidence=0.4,
    lift=1.0
    )
    ]
    )
    ''' #items = items_base + items_add

    #遍历result,得到每个项集(X 与 Y ,并得到相对应的支持度、自信度和提升度

    supports = []
    confidences = []
    lifts = []
    bases = []
    adds = []
    
    for i in result:
        supports.append(i.support)
        confidences.append(i.ordered_statistics[0].confidence)
        lifts.append(i.ordered_statistics[0].lift)
        bases.append(list(i.ordered_statistics[0].items_base))
        adds.append(list(i.ordered_statistics[0].items_add))
        
    #将结果转化为容易处理的数据框
    get_result = pd.DataFrame({
            'base': bases,
            'add': adds,
            'support': supports,
            'confidence': confidences,
            'lift': lifts})

    #得到如下的数据框,其中有不同项集及其对应结果,可通过关联规则得到符合的关联项

    三、 协同过滤

    1、 相关数据指标

    协同过滤简单来说就是利用某兴趣相投、拥有共同经验的群体的喜好来推荐用户感兴趣的信息。

    协同过滤主要收集每个用户对使用过的物品的评价(打分或星级等)。

    通过用户对各种商品评分的高低,得到用户的喜好并,根据相似喜好的用户历史数据,从而推荐一些信息

    优点:

    • 能够过滤机器难以自动分析的信息,如艺术品、音乐等
    • 共用其他人的讲演,避免了内容分析的不完全或不精确,能够基于一些复杂的,难以表述的概念(如个人品味)进行过滤
    • 有推荐新信息的能力,可以发现用户潜在的但自己尚未发现的兴趣偏好
    • 推荐个性化、自动化程度高,能够有效的利用其他相似用户的回馈信息,加快个性化学习的速度

    缺点:

    • 新用户在开始时推荐质量较差
    • 新项目的推荐难度大,因为推荐质量取决于历史数据集

    2、 计算步骤

    • 收集用户信息,必须数据基础:用户、商品、评分
    • 根据以上数据得到用户评分向量和商品评分向量(用户评分尽量使用标准化评分,消除用户因打分习惯而导致的差异)
    • 根据用户评分向量计算距离(如欧式距离)
    • 计算用户相似度
    • 两种方法计算相似邻居
      • A)固定数量的邻居(K-neighborhoods)
      • 不考虑邻居的距离差异,只取当前点最近的 K 个点作为其邻居
      • B)基于相似度门槛的邻居(Threshold-based neighborhoods)
      • 以当前点为中心,距离为 K 的区域内的所有点作为当前点的邻居

    3、 使用python实现协同过滤算法

    #导入如下数据,含用户ID,商品ID,用户评分

    #通过交叉表及变换形式得到用户评分矩阵

    userrate = data.pivot_table(index='UserID',
                                columns='ItemID',
                                aggfunc=sum,
                                fill_value=0)
    
    #将透视表转为数据框,优化列名
    userrate.columns = userrate.columns.droplevel(0)
    del userrate.columns.name

     #计算每个用户之间的距离和相似度

    #计算每个用户之间的距离
    dist = pd.DataFrame(euclidean_distances(userrate))
    dist.index = userrate.index
    dist.columns = userrate.index
    
    #计算每个用户之间的相似度
    sim = 1/(1+dist)

    #设置参数,获取相似用户

    #设置邻居个数为3  用户ID为1
    k = 3
    userId = 1
    
    #获取3个相似用户并得到其相似度
    simUserIds = sim.sort_values(userId, ascending=False)[userId].index[1:k+1]
    simUser = sim.ix[simUserIds, userId]

    #根据相似用户得到商品的推荐排序

    #根据相似用户,计算出每个物品的评分
    score = pd.DataFrame(np.dot(simUser,  userrate.ix[simUserIds]))
    
    #对结果排序,得到最终的结果
    result = userrate.columns[score.sort_values(0, ascending=False).index.values]
  • 相关阅读:
    javascript中!=、!==、==、===操作符总结
    轮询、长轮询与Web Socket的前端实现
    C#中Enum用法小结
    浅谈Javascript 中几种克隆(clone)方式
    JS数组sort比较函数
    为Jquery类和Jquery对象扩展方法
    自定义滚动条mCustomScrollbar
    T-SQL 控制流语句
    sql case 用法总结
    Selenium2+python自动化19-单选框和复选框(radiobox、checkbox)【转载】
  • 原文地址:https://www.cnblogs.com/rix-yb/p/9873983.html
Copyright © 2011-2022 走看看