数据挖掘——亲和性分析

亲和性分析

1. 应用场景

  • 向网站用户提供多样化的服务或投放定向广告
  • 为了向用户推荐电影或商品
  • 根据基因寻找有亲缘关系的人

2. 商品推荐实例

2.1. 数据集概述

import numpy as np
dataset_filename = "D:\Google\MOOF\Learning_Data_Mining_With_Python\Code_REWRITE\Chapter 1\\affinity_dataset.txt"
# np.loadtxt()读取目标txt文件
# x 行代表交易数据所包含的商品(0:购买,1:未购买)
# x 列代表一种商品
x = np.loadtxt(dataset_filename)

2.2. 简单排序规则概述

  • 目标:如果找到顾客购买商品X,那么他们可能愿意购买商品Y

  • 简单方法:找出数据集中同时所有同时购买的两件商品

  • 规则优劣评判标准

    • 支持度(support)

      支持度指数据集中规则应验的次数,有时还需要对支持度进行规范化(即再除以规则有效前提下的总数量)。支持度衡量的是给定规则应验的比例。

    • 置信度(confidence)

      置信度衡量的是规则准确率如何。即符合给定条件的所有规则里,跟当前规则结论一致的比例。计算方法为首先统计当前规则的出现次数,再用它来除以条件相同的规则数量。

  • 测试例题

    • 测试目标:如果顾客购买了列3,那么他们也会购买列4(列从0开始计算)

    • 流程概述:

      1. 分别为规则应验、规则无效及条件相同的规则数量创建三个字典

        字典的键是由条件和结论组成的元组,元组元素为特征在特征列表中的索引值。如果某个个体的条件与结论均与给定规则相符,就表示给定规则对该个体使用;如果通过给定条件推出的结论与给定规则的结论不符,则表示给定规则对该个体无效。

        这里字典创建使用defaultdict,好处是如果查找的键不存在,返回一个默认值。

      2. 遍历每条购买记录,若用户购买某个商品,记为前提(premise)并在条件相同处加一,随后遍历该用户的其他购买商品,若有另一个商品也购买了(conclusion),在规则应验字典中加一;反之在规则无效字典中加一。

        # 遍历每个购买记录
        for sample in x:
            # 条件1,顾客购买了某个商品
            # 因要求判断购买X的同时愿意购买Y,只需遍历到。。。
            # premise:前提
            for premise in range(4):
                # 判断该商品是否被购买,未购买跳至下一件商品
                if sample[premise] == 0:
                    continue
                # 该商品被购买,条件1满足,该条件出现次数加1
                num_occurances[premise] += 1
                # 当用户购买前提达成后,遍历查询是否购买另一个商品
                # conclusion:结果
                for conclusion in range(x_features):
                    # 判断列为同一列,跳过
                    if premise == conclusion:
                        continue
                    # 用户购买premise时也购买conclusion,规则应验加一
                    # 用户购买premise时未购买conclusion,规则无效加一
                    if sample[conclusion] == 1:
                        valid_rules[(premise,conclusion)] += 1
                    else:
                        invalid_rules[(premise,conclusion)] += 1     
        
      3. 支持度、置信度计算。支持度即为规则应验字典,置信度为规则应验的键 / 规则应验前提条件对应的条件相同字典。

        # 支持度字典设置
        support = valid_rules
        # 置信度方法计算
        # 置信度字典设置
        confidence = defaultdict(float)
        # 遍历有效规则,将该规则应验值 / 前提条件共计出现次数值
        for premise,conclusion in valid_rules.keys():
            rule = (premise,conclusion)
            confidence[rule] = valid_rules[rule] / num_occurances[premise]
        
      4. 规则输出与规则遍历

        # 规则输出函数
        # 接收参数:前提条件特征索引值,结论特征索引值,支持度字典,置信度字典,特征列表
        # 输出参数:每条规则以及其支持度和置信度
        def print_rule(premise,conclusion,support,confidence,features):
            premise_name = features[premise]
            conclusion_name = features[conclusion]
            print("Rule: If a person buys 【{0}】 they will also buy 【{1}】".format(premise_name,conclusion_name))
            print("\t - confidence:{0:.3f}".format(confidence[(premise,conclusion)]))
            print("\t - support:{0}\n".format(support[(premise,conclusion)]))
        # 规则遍历输出
        for permise,conclusion in support:
            print_rule(permise,conclusion,support,confidence,features)
        
      5. 导入operator.itemgetter函数,用于排序操作。

        from operator import itemgetter
        
      6. 通过支持度字典进行排序

        # 通过支持度字典进行排序
        # support.items() 函数以列表返回可遍历的(键, 值) 元组数组。
        # itemgetter(1)表示以字典各元素的值(这里为支持度support)作为排序依据
        # reverse=True 表示为降序排序
        sorted_support = sorted(support.items(), key=itemgetter(1), reverse=True)
        for index in range(5):
            print("Rule #{0}".format(index + 1))
            premise,conclusion = sorted_support[index][0]
            print(sorted_support[index][0])
            print(premise,conclusion)
            print_rule(premise,conclusion,support,confidence,features)
        
      7. 通过置信度字典进行排序

        # 通过置信度字典进行排序
        # support.items() 函数以列表返回可遍历的(键, 值) 元组数组。
        # itemgetter(1)表示以字典各元素的值(这里为支持度confidence)作为排序依据
        # reverse=True 表示为降序排序
        sorted_confidence = sorted(confidence.items(), key=itemgetter(1), reverse=True)
        for index in range(5):
            print("Rule #{0}".format(index + 1))
            premise,conclusion = sorted_confidence[index][0]
            print(sorted_support[index][0])
            print(premise,conclusion)
            print_rule(premise,conclusion,support,confidence,features)
        
上一篇:WARN: Establishing SSL connection without server's identity verification is not recommended.


下一篇:从零开始学VUE之Vue CLI(全局安装cli-init)