1.基本原理
假设 商场考虑摆放 面包 牛奶 奶酪 苹果 香蕉的摆放位置。肯定要遵循一些规则,比如 顾客买完面包后,很大可能会买一些牛奶,所以就让面包和牛奶放在一起。任何一个规则都由前提和结论组成,上例中,前提就是顾客买卖面包,结论就是顾客很大程度上买牛奶。
评价规则的好坏,就是他发生的可能性的大小,越大,说明人群中符合这个规则的人越多。通常判断规则的好坏的指标有 支持度和置信度。支持度代表 规则有效的数目,置信度指的是 有效的规则所占的比例。
2.数据集affinity_dataset.txt
0 1 1 0 1
0 1 0 0 0
0 0 1 1 1
0 0 1 1 1
0 1 0 1 0
1 1 1 1 1
0 0 1 1 0
1 0 1 0 1
0 1 0 0 1
0 0 1 1 1
1 1 0 0 0
0 0 0 1 0
0 0 1 1 1
0 0 1 0 1
1 0 0 0 1
0 1 0 0 0
0 1 0 1 0
1 1 0 0 0
1 1 0 0 0
0 1 1 1 0
1 0 0 0 0
1 1 0 0 0
0 1 0 1 0
0 1 1 0 1
1 0 0 0 1
0 0 1 1 0
0 1 0 1 1
1 0 1 0 0
1 0 0 0 1
0 0 1 0 1
0 1 1 0 0
0 0 1 0 1
0 1 0 0 0
0 0 1 0 1
1 1 0 1 1
1 0 0 1 0
1 0 0 0 0
1 1 0 0 0
1 1 1 1 0
1 1 0 0 0
0 0 1 1 1
1 1 0 0 1
1 1 0 0 1
0 0 0 0 1
0 0 0 1 1
1 0 0 0 1
1 0 0 1 1
0 0 1 0 1
0 0 0 1 1
1 0 0 0 1
1 1 0 0 1
1 1 0 1 0
0 0 1 1 1
0 0 1 0 1
0 0 1 1 1
1 1 0 0 1
0 1 1 1 1
0 0 1 0 1
1 0 0 0 0
1 1 0 0 0
1 1 0 0 0
1 1 0 0 1
1 1 0 1 1
0 0 0 1 1
0 1 0 0 1
0 1 0 0 0
0 1 0 1 0
0 0 0 1 1
0 1 0 0 1
1 0 0 0 1
0 0 1 0 1
0 1 0 1 1
1 0 0 0 1
0 0 1 1 1
0 0 0 0 1
0 0 1 1 1
1 0 0 0 0
1 1 0 0 1
0 0 1 0 1
0 0 0 0 1
1 1 0 1 0
0 1 0 0 0
0 0 1 1 1
0 0 1 1 0
0 1 1 0 1
1 0 0 1 0
0 1 0 0 1
1 1 0 0 0
1 0 0 0 0
1 1 0 1 0
1 0 0 0 0
0 0 1 1 1
0 1 0 0 0
0 0 1 1 1
1 0 0 1 1
0 1 0 0 0
0 0 1 0 1
1 0 0 0 1
0 0 1 0 1
1 1 0 0 1
3.源码实现
import numpy as np
from collections import defaultdict
from operator import itemgetter
data_filename = "affinity_dataset.txt"
datas = np.loadtxt(data_filename)
#列的属性
features = ["面包", "牛奶", "黄油", "苹果", "香蕉"]
valid_rules = defaultdict(int)
invalid_rules = defaultdict(int)
#统计A和B之间的联系
def connect(indexA, indexB):
buy_A_num = 0
for sample in datas:
if sample[indexA] == 0:
continue
buy_A_num += 1
if(sample[indexB] == 1):
valid_rules[(indexA, indexB)] += 1
else:
invalid_rules[(indexA, indexB)] += 1
return buy_A_num
#计算置信度
def get_confidence():
confidence = defaultdict(float)
for premise, feature in valid_rules.keys():
rule = (premise, feature)
confidence[rule] = valid_rules[rule] / (valid_rules[rule] + invalid_rules[rule])
print("同时购买{0}和{1}的置信度为: {2:0.3f}".format(features[rule[0]], features[rule[1]], confidence[rule]))
print("同时购买{0}和{1}的支持度为: {2}".format(features[rule[0]], features[rule[1]], valid_rules[rule]))
return confidence
#计算所有置信度
for i in range(len(features)):
for j in range(len(features)):
if(i == j):
continue
connect(i, j)
confidence = get_confidence()
print("---------------------------------------------------------")
#按置信度排序
sort_dict = sorted(confidence.items(), key=itemgetter(1), reverse=True)
for index in range(5):
rule = sort_dict[index][0]
print("同时购买{0}和{1}的置信度为: {2:0.3f}".format(features[rule[0]], features[rule[1]], confidence[rule]))
print("---------------------------------------------------------")
#按支持度排序
sort_dict = sorted(valid_rules.items(), key=itemgetter(1), reverse=True)
for index in range(5):
rule = sort_dict[index][0]
print("同时购买{0}和{1}的支持度为: {2:0.3f}".format(features[rule[0]], features[rule[1]], valid_rules[rule]))
4.运行及其结果
$ python3 example.py
同时购买面包和牛奶的置信度为: 0.535
同时购买面包和牛奶的支持度为: 23
同时购买面包和黄油的置信度为: 0.093
同时购买面包和黄油的支持度为: 4
同时购买面包和苹果的置信度为: 0.256
同时购买面包和苹果的支持度为: 11
同时购买面包和香蕉的置信度为: 0.488
同时购买面包和香蕉的支持度为: 21
同时购买牛奶和面包的置信度为: 0.500
同时购买牛奶和面包的支持度为: 23
同时购买牛奶和黄油的置信度为: 0.174
同时购买牛奶和黄油的支持度为: 8
同时购买牛奶和苹果的置信度为: 0.326
同时购买牛奶和苹果的支持度为: 15
同时购买牛奶和香蕉的置信度为: 0.435
同时购买牛奶和香蕉的支持度为: 20
同时购买黄油和面包的置信度为: 0.111
同时购买黄油和面包的支持度为: 4
同时购买黄油和牛奶的置信度为: 0.222
同时购买黄油和牛奶的支持度为: 8
同时购买黄油和苹果的置信度为: 0.528
同时购买黄油和苹果的支持度为: 19
同时购买黄油和香蕉的置信度为: 0.806
同时购买黄油和香蕉的支持度为: 29
同时购买苹果和面包的置信度为: 0.282
同时购买苹果和面包的支持度为: 11
同时购买苹果和牛奶的置信度为: 0.385
同时购买苹果和牛奶的支持度为: 15
同时购买苹果和黄油的置信度为: 0.487
同时购买苹果和黄油的支持度为: 19
同时购买苹果和香蕉的置信度为: 0.615
同时购买苹果和香蕉的支持度为: 24
同时购买香蕉和面包的置信度为: 0.344
同时购买香蕉和面包的支持度为: 21
同时购买香蕉和牛奶的置信度为: 0.328
同时购买香蕉和牛奶的支持度为: 20
同时购买香蕉和黄油的置信度为: 0.475
同时购买香蕉和黄油的支持度为: 29
同时购买香蕉和苹果的置信度为: 0.393
同时购买香蕉和苹果的支持度为: 24
---------------------------------------------------------
同时购买黄油和香蕉的置信度为: 0.806
同时购买苹果和香蕉的置信度为: 0.615
同时购买面包和牛奶的置信度为: 0.535
同时购买黄油和苹果的置信度为: 0.528
同时购买牛奶和面包的置信度为: 0.500
---------------------------------------------------------
同时购买黄油和香蕉的支持度为: 29.000
同时购买香蕉和黄油的支持度为: 29.000
同时购买苹果和香蕉的支持度为: 24.000
同时购买香蕉和苹果的支持度为: 24.000
同时购买面包和牛奶的支持度为: 23.000
网友评论