亲和性分析在商品推荐中的应用

Photo by Anne Preble

亲和性分析

基础知识

定义:根据样本个体之间的相似度,判断亲疏关系。

应用:投放广告;推荐商品;基因寻亲。

评价标准:

  • 支持度:规则应验的次数(本案例采用该方法)


  • 置信度:规则应验的次数/符合规则条件(“如果”语句)的次数


示例

根据客户的购买记录,找到以往他们购买同样商品的交易数据,看看同时购买了什么,再把它们推荐给客户。这里只考虑客户一次只购买两件商品的情况。例如,人们去超市既买了面包,又买了牛奶。规则可归纳为:如果一个人买了商品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)
    
# 注:以上代码还可以优化,详见标准答案
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据挖掘有个常见的应用场景,即顾客在购买一件商品时,商家可以趁机了解他们还想买什么,以便把多数顾客意愿同时购买的商...
    overad阅读 2,547评论 0 1
  • 在数据分析中,模型是非常有用和有效的工具和数据分析应用的场景,在建立模型的过程中,数据挖掘很多时候能够起到非常显著...
    keeya阅读 1,007评论 0 3
  • 【学员】15组|满 【日期】2019年4月22日 【作业】 阅读拆解埃里希·弗罗姆《父母与孩子之间的爱》 【时间管...
    满1018阅读 342评论 0 1
  • 人世间篇: 颜回曰:敢问心斋。仲尼曰:若一志,无听之以耳而听之以心,无听之以心而听之以气!听止于耳,心止于符。气也...
    王一姸阅读 382评论 0 1
  • 古罗马的斗兽场,角斗士的怒吼在天地回荡。观众席上的人们正在拼命鼓掌,向着角斗士投以崇拜的目光。角斗士孤零零地站在场...
    陈世俗陈阅读 517评论 0 0