亲和性分析
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开始计算)
-
流程概述:
-
分别为规则应验、规则无效及条件相同的规则数量创建三个字典
字典的键是由条件和结论组成的元组,元组元素为特征在特征列表中的索引值。如果某个个体的条件与结论均与给定规则相符,就表示给定规则对该个体使用;如果通过给定条件推出的结论与给定规则的结论不符,则表示给定规则对该个体无效。
这里字典创建使用defaultdict,好处是如果查找的键不存在,返回一个默认值。
-
遍历每条购买记录,若用户购买某个商品,记为前提(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
-
支持度、置信度计算。支持度即为规则应验字典,置信度为规则应验的键 / 规则应验前提条件对应的条件相同字典。
# 支持度字典设置 support = valid_rules # 置信度方法计算 # 置信度字典设置 confidence = defaultdict(float) # 遍历有效规则,将该规则应验值 / 前提条件共计出现次数值 for premise,conclusion in valid_rules.keys(): rule = (premise,conclusion) confidence[rule] = valid_rules[rule] / num_occurances[premise]
-
规则输出与规则遍历
# 规则输出函数 # 接收参数:前提条件特征索引值,结论特征索引值,支持度字典,置信度字典,特征列表 # 输出参数:每条规则以及其支持度和置信度 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)
-
导入operator.itemgetter函数,用于排序操作。
from operator import itemgetter
-
通过支持度字典进行排序
# 通过支持度字典进行排序 # 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)
-
通过置信度字典进行排序
# 通过置信度字典进行排序 # 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)
-
-