社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

数据挖掘 | 利用Python进行商品的亲和性分析

大数据文摘 • 3 年前 • 462 次点击  
大数据文摘授权转载自菜J学Python
作者:J哥、小屁孩i

如今这个社会是一个数字社会,在各大领域里面最为显著的应该是数据吧。就目前而言,大数据已经越来越流行了,我们不管在什么领域上都能接触到数据的,并且现在很多企业已经累积了大量的数据。很多人开始朝向大数据开发以及大数据分析这两个方向发展了。

那么也许你会问,哪个方向更加值得转行呢?很多人也在这两个方向纠结,在这里我想告诉你们的是,没有什么是最优选择,你感兴趣的才是最好的选择。这边,我选择的是大数据分析!现在让我们进入数据分析的一个环节——数据挖掘。

数据挖掘简介


数据挖掘旨在让计算机根据已有数据做出决策。决策可以是预测明年的销量,人口的数目,拦截垃圾邮件,检测网站的语言。到目前为止,数据挖掘已经有很多的应用,即使这样很多新的应用领域也在不断出现。

数据挖掘涉及到算法,最优策略,统计学,工程学和计算机科学相关领域的知识。除此之外我们还会用到语言学,神经科学,城市规划等其他领域的概念或知识。想要充分发挥数据挖掘的威力,算法肯定是必备的。(在这里推荐读者去刷一刷LeetCode)

一般来说数据挖掘有这三个基本步骤:1、创建数据集。数据集能直接反应一些真实事件;2、选择算法。选择一个合适的算法才能更好的对数据进行处理;3、优化算法。每种数据挖掘算法都有参数,它们或是算法自身包含的,或是使用者添加的,这些参数会影响算法的具体决策。

亲和性分析案例


现在让我们用一个例子说明。不知道你逛超市的时候,是否发现超市里面基本上都是按照商品的种类来分区域的,然而有些东西是存在例外的,一件商品的旁边摆放着不一样种类的商品。不知道你是否有发现这个现象,有没有对此感到不解。这边我想跟你说的是,这种摆放也是有道理的,这个道理是商品之间的亲和性!

前置知识:

1)defaultdict(int):初始化为 0    2)defaultdict(float):初始化为 0.0   3)defaultdict(str):初始化为 ''

这里的defaultdict(function_factory)构建的是一个类似dictionary的对象其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例而且具有默认值。比如default(int)则创建一个类似dictionary对象里面任何的values都是int的实例,而且就算是一个不存在的key, d[key] 也有一个默认值,这个默认值是int()的默认值0。

代码实现


现在进行代码部分:

import  numpy as npfrom collections import defaultdictdataset_filename = "affinity_dataset.txt"features = ["bread","milk","cheese","apple","banana"]  #猜一下这个是干嘛用的X = np.loadtxt(dataset_filename)print(X[:5])   #打印前五行的购物信息


统计一下购买苹果和香蕉的人数:

num_apple_purchases = 0 # 初始化一个购买苹果人数的变量for sample in X:    if sample[3] == 1:        num_apple_purchases+=1print("{0} people bought Apples ".format(num_apple_purchases))num_banana_purchases = 0for sample in X:    if sample[4] == 1:        num_banana_purchases += 1print("{0} people bought banana".format(num_banana_purchases))



现在为了计算规则的置信度还有支持度,我们可以用字典的形式来存放计算结果:


valid_rules = defaultdict(int)invalid_rules = defaultdict(int)num_occurances = defaultdict(int)for sample in X:    for premise in range(4):        if sample[premise] ==0 :            continue        num_occurances[premise] +=1  #当顾客有购买物品时key对应的时value变为1        for conclusion in range(4):            if premise == conclusion:  #访问同一个key 的时候是没有意义的直接跳过                continue


    
            if sample[conclusion] == 1:                valid_rules[(premise,conclusion)] +=1            else:                invalid_rules[(premise,conclusion)] +=1

得到所有必要的统计量后,我们再来计算每条规则的支持度和置信度。如前所述,支持度就是规则应验的次数:

support = valid_rules#置信度的计算方法类似,遍历每条规则进行计算confidence = defaultdict(float)for premise,conclusion in valid_rules.keys():    rule = (premise,conclusion)    confidence[rule] = valid_rules[rule]/num_occurances[premise]

声明一个函数,接收的参数有:分别作为前提条件和结论的特征索引值、支持度字典、置信度字典以及特征列表。

def print_rule(premise, conclusion,support , confidence,features):    premise_name = features[premise]    conclusion_name = features[conclusion]    print("Rule:if a person buys {0} they will also buy {1} ".format(premise_name,conclusion_name))    print(" - Support : {0}".format(support[(premise,conclusion)]))    print(" - Confidence : {0:.3f}".format(confidence[(premise,conclusion)]))premise = 1conclusion = 3features = ["bread","milk","cheese","apple","banana"]print_rule(premise,conclusion,support,confidence,features)
from operator import itemgettersorted_support = sorted(support.items(),key=itemgetter(1),reverse=True)

排序完成后,就可以输出支持度最高的前5条规则:

for index in range(5):    print("Rule #{0}".format(index+1))    premise,conclusion = sorted_support[index][0]    print_rule(premise,conclusion,support,confidence,features)


以上就是我们这次所学的数据挖掘之商品亲和性分析了。


点「在看」的人都变好看了哦!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113917
 
462 次点击