基本概念:

根据样本个体之间的相似度

支持度support        置信度confident

示例:如果一个人买了商品X,那么他很有可能购买商品Y  (本例有两个特征值0和1,表示是否购买)

过程思路:

1、在numpy中加载数据集

  • numpy是二维数组,看上去像一张表。
  • 数组的每一项为个体的某项特征值。
  • 数据集与文件放在同一目录下
  • 输出前5行数据查看数据集

2、实现简单的排序

  • 找出“如果一个人买了商品X,那么他很有可能购买商品Y”这个规则,就要找出数据集中所有同时购买的两件商品
  • 规则:由前提条件和结论两部分组成
  • 规则常用的衡量方法:支持度和置信度
  • 支持度:在数据集中,规则中条件应验的次数(符合前提条件的数量)  P(X)
  • 置信度:规则中条件和结论同时应验的次数/支持度   P(Y|X)=P(XY)/P(X)
  • 统计所有规则的相关数据:规则应验、规则无效、条件相同的规则数量
  • 创建几个字典用于存放计算结果:用defaultdict(如果查找的键不存在,返回一个默认值)
  • 循环结构:依次对样本的每个个体及个体的每个特征值进行检测,看是否满足条件。如果满足,该条件出现的次数加1;不满足,继续检测下一个。   
  • 在遍历过程中跳过条件和结论相同的规则(即如果买了X,那么会买X)
  • 如果规则应验,规则应验的次数(即上面创建的字典中的元组)加1
  • 计算每一条规则的支持度和置信度得到字典,支持度就是上面统计的规则应验的次数,置信度类似
  • 声明函数接收参数:前提条件和结论的特征索引值、支持度字典、置信度字典、特征列表
  • 格式化输出支持度与置信度,把索引替换成相应的特征。

3、排序找出最佳规则

  • 根据支持度和置信度进行排序
  • 如找出支持度最高的规则置信度排序同理
  •  对支持度字典进行排序,字典的items()返回包含字典所有元素的列表;itemgetter()类作为键,对嵌套列表进行排序;itemgetter(1)表示以字典各元素的值作为排序依据,降序排列

 

1 import numpy as np
 2 
 3 #在numpy中加载数据集
 4 dataset_filename = "affinity_dataset.txt"  #要用到的数据文件名为"affinity_dataset.txt" ,注意:数据集文件与笔记本文件放到同一个目录下
 5 
 6 X=np.loadtxt(dataset_filename)        #文件内容赋值给一个数组
 7 
 8 print(X[:5])                          #打印数组内容
 9 
10 #实现简单的排序规则
11 num_apple_purchases = 0               #初始购买apple的人数为0
12 for sample in X:                      #遍历数组X中的每一行(sample)
13     if sample[3] == 1:                #如果第三列(apple)的值为1,即买了apple
14         num_apple_purchases += 1      #购买apple的人数加1
15 print("{0} people bought apples".format(num_apple_purchases)) #打印购买apple的总数
16 # format是格式化语法,{0}指定位置
17 
18 #变量说明
19 n_samples,n_features = X.shape    
20 #语法:shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。
21 features = ["bread","milk","cheese","apples","bananas"]   #列表
22 
23 from collections import defaultdict
24 #使用defaultdict创建相应的字典,好处是当查找的键不存在,返回一个默认值
25 valid_rules = defaultdict(int)        #统计规则应验的数量(买了一个同时买了另一个)
26 invalid_rules = defaultdict(int)      #统计规则无效的数量(买了一个却没有买另一个)
27 num_occurances = defaultdict(int)     #统计条件相同的规则数量(购买的个体的数量)
28 
29 #通过循环结构依次对个体及特征值进行处理,统计个体与个体之间的相关性   条件:如果顾客买了一种商品
30 for sample in X:                      #遍历每一行
31     for premise in range(5):          #遍历每一列
32         #判断是否买了该商品
33         if sample[premise] == 0:      #如果数组中的值为0(没有买该商品)
34             continue                  #跳过本次循环
35 
36         num_occurances[premise] += 1           #条件相同的规则数量+1(买了该商品)
37 
38         for conclusion in range(n_features):  #遍历结论
39             if premise == conclusion:         #如果条件和结论相同(如果买了苹果,那么买了苹果)
40                 continue                      #跳过本次循环
41 
42         if sample[premise] == 1:                      #条件满足,顾客买了一种商品
43             valid_rules[(premise,conclusion)] += 1    #规则应验的数量加1
44 
45         else:                                         #以上条件均不满足,无效规则
46             invalid_rules[(premise,conclusion)] += 1  #规则无效的数量加1
47 
48     #计算支持度support和置信度confidence
49 support = valid_rules                                  #p(x)所有买X的人数
50 confidence = defaultdict(float)
51 for premise,conclusion in valid_rules.keys():          #遍历有效规则中的条件和结论
52     rule = (premise,conclusion)                        #定义规则的形
53     confidence[rule] = valid_rules[rule]/num_occurances[premise]   #p(Y|X)=所有买X和Y的人数/所有买X的人数
54 
55     #声明一个函数用于接收参数
56 def print_rule(premise,conclution,support,confidence,features):   #features是特征列表的索引
57     #把索引替换成相应的特征
58     premise_name = features[premise]
59     conclusion_name = features[conclusion]
60     #输出想要的结果
61     print("rule:if a person buys {0} they will also buy {1}".format(premise_name,conclusion_name))
62     print("-suppotr:{0}".format(support[(premise,conclusion)]))
63     print("-confidence:{0:.3f}".format(confidence[(premise,conclusion)]))  #.3f保留3位小数点
64 
65 
66 #代码测试:尝试更换条件和结论,看看输出结果如何
67 premise=1
68 conclusion=3
69 print(premise,conclusion,support,confidence,features)
70 
71 #排序找出最佳的规则
72 from operator import itemgetter                                          #itemgetter可以对嵌套的列表进行排序
73 sorted_support = sorted(support.items(),key=itemgetter(1),reverse=True)  #sorted排序
74 #items()函数返回包含字典所有元素的列表,item getter(1)表示以字典各元素的值(support)作为排序依据,reverse = True表示降序排列
75 
76 #输出支持度最高的前五条规则
77 for index in range(5):
78     print("rule #{0}".format(index+1))
79     premise,conclusion = sorted_support[index][0]  #索引
80     print_rule(premise,conclusion,support,confidence,features)
81 
82 #同理输出置信度最高的规则
83 sorted_confidence = sorted(confidence.items(),key=itemgetter(1),reverse = True)
84 
85 for index in range(5):
86     print("rule #{0}".format(index + 1))
87     premise, conclusion = sorted_confidence[index][0]
88     print_rule(premise, conclusion, support, confidence, features)