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

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)
    
# 注:以上代码还可以优化,详见标准答案
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

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