美文网首页生活不易 我用python大数据程序员
亲和性分析在商品推荐中的应用

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

作者: Lion_Kiss_Deer | 来源:发表于2018-03-08 00:47 被阅读34次
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)
    
# 注:以上代码还可以优化,详见标准答案

后记:本人于2018年3月6日开始学习《Python数据挖掘入门与实践》。在这之前的一年时间里,零零散散的学完了Python基础教程,尝试写过简单的爬虫脚本、抢票脚本。但是,这都仅限于在网上copy别人的代码,然后再自己根据实际需求改一改,并没有太深入的研究,因此进步并不明显。于是乎,我就想借着这次机会,把自己学习的笔记、思路、总结都放到网上。一方面能督促自己抓紧时间机遇,一方面和大家分享交流。虽然我写的这些东西又简单又粗糙,但我希望这些笔记能够帮助和鼓励到其他跟我水平差不多的菜鸟们。共勉!

相关文章

网友评论

    本文标题:亲和性分析在商品推荐中的应用

    本文链接:https://www.haomeiwen.com/subject/mzkefftx.html