亲和性分析
基础知识
定义:根据样本个体之间的相似度,判断亲疏关系。
应用:投放广告;推荐商品;基因寻亲。
评价标准:
-
支持度:规则应验的次数(本案例采用该方法)
-
置信度:规则应验的次数/符合规则条件(“如果”语句)的次数
示例
根据客户的购买记录,找到以往他们购买同样商品的交易数据,看看同时购买了什么,再把它们推荐给客户。这里只考虑客户一次只购买两件商品的情况。例如,人们去超市既买了面包,又买了牛奶。规则可归纳为:如果一个人买了商品X,那么他很有可能购买商品Y。
示例数据及答案在此处下载。
分析思路:
- 现已知数据:每行代表一次交易的购买情况,每列代表一种商品(分别为面包、牛奶、奶酪、苹果、香蕉)。数据值只有可能是1或0,1表示购买了该商品,0表示没有购买。例如第一行数据为(0,0,1,1,1),表示该次交易购买了奶酪、苹果、香蕉,没有买面包、牛奶。
- 根据上述评价标准,我们需要记录4类数据的变化,用字典表示。它们分别是:1. 购买X商品的次数;2. 同时购买X和Y的次数;3. 计算支持度; 4. 计算置信度。键为购买的商品(组合),值为购买实现(或未实现)的次数,可通过遍历过程累加。
- 逐行读取数据,当某列为0时,跳过该列读取下一列,当某列为1时,购买该商品的次数+1。
- 当另一列为1时,可以将两个商品组合设为键,该组合次数+1。
- 根据公式计算支持度、置信度
涉及知识点: 搭建环境;读取数据;计数;条件语句;for循环;字典;列表;占位符
代码演示及解析
import numpy as np
from collections import defaultdict
data = np.loadtxt('affinity_dataset.txt',dtype=int) #导入数据
n_sample,n_feature = np.shape(data) #数据形状为100*5,即n_sample=100个交易数据样本,n_feature=5种商品
features = ['bread','milk','cheese','apple','banana'] #在后面将数据列表的列维输出为文字时会用到
all_count = defaultdict(int) # 购买X商品的次数
valid_count = defaultdict(int) # 同时购买X和Y的次数
# invalid_count = defaultdict(int) # 购买了X,但未购买Y的次数(在本案例中没有用到)
for row in data: # 遍历行维
for X in np.arange(n_feature): # 遍历列维
if row[X]==0: # 某行某列的值为0时,跳过继续下一列
continue
all_count[X] += 1 # 某行某列的值为1时,购买X商品的次数+1
for Y in np.arange(n_feature): # 遍历列维,找第二样商品
if Y == X: # 每次同种商品只买一件,故舍弃跳过
continue
if row[Y] == 1: # 当购买了另一件商品时,同时购买X和Y的次数+1
valid_count[(X,Y)] += 1 # 注意:这里的键是两次购买的商品的组合
# else:
# invalid_count[(X,conclusion)] += 1
support = valid_count # 此案例中,支持度即购买X商品的次数
confidence = defaultdict(float) # 置信度
for X,Y in valid_count: # 根据公式计算每种商品组合的置信度
confidence[(X,Y)]=valid_count[(X,Y)]/all_count[X]
def print_result(X,Y,features,confidence,support):
X_name = features[X] # 将数据的列维标签转换为文字
Y_name = features[Y] #同上
print("Rule: If a person buy %s they will also buy %s" % (X_name,Y_name))
print("- Support: %d" % (support[(X,Y)]))
print("- Confidence: %.2f" % confidence[(X,Y)])
print("")
# 根据字典值排序
support_sort = sorted(support.items(),key=lambda x:x[1],reverse=True)
confidence_sort = sorted(confidence.items(),key=lambda x:x[1],reverse=True)
# 列出支持度Top5的规则
for index in np.arange(5,dtype=int):
print('Rule #%d' % (index+1))
(X,Y) = support_sort[index][0]
print_result(X,Y,features,confidence,support)
print('-----------------------------\n')
#列出置信度Top5的规则
for index in np.arange(5,dtype=int):
print('Rule #%d' % (index+1))
(X,Y) = confidence_sort[index][0]
print_result(X,Y,features,confidence,support)
# 注:以上代码还可以优化,详见标准答案