生活不易 我用python大数据程序员

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

2018-03-08  本文已影响34人  Lion_Kiss_Deer
Photo by Anne Preble

亲和性分析

基础知识

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

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

评价标准:

示例

根据客户的购买记录,找到以往他们购买同样商品的交易数据,看看同时购买了什么,再把它们推荐给客户。这里只考虑客户一次只购买两件商品的情况。例如,人们去超市既买了面包,又买了牛奶。规则可归纳为:如果一个人买了商品X,那么他很有可能购买商品Y。

示例数据及答案在此处下载。

分析思路:

涉及知识点: 搭建环境;读取数据;计数;条件语句;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别人的代码,然后再自己根据实际需求改一改,并没有太深入的研究,因此进步并不明显。于是乎,我就想借着这次机会,把自己学习的笔记、思路、总结都放到网上。一方面能督促自己抓紧时间机遇,一方面和大家分享交流。虽然我写的这些东西又简单又粗糙,但我希望这些笔记能够帮助和鼓励到其他跟我水平差不多的菜鸟们。共勉!

上一篇 下一篇

猜你喜欢

热点阅读