数据挖掘入门系列教程(一)之亲和性分析

数据挖掘入门系列教程(一)之亲和性分析

教程系列简介

系列地址:https://www.cnblogs.com/xiaohuiduan/category/1661541.html

该教程为入门教程,为博主学习数据挖掘的学习路径步骤。教程为入门教程,从最简单的开始。使用的编程语言为Python3.8.1,使用JupyterNotebook作为开发环境(使不使用JupyterNotebook都没有关系)。

在学习本教程之前,你需要:

  • 有一点python编程基础
  • 会用百度 or 谷歌
  • 数学知识还是要一点的(但是要多少呢?我也不知道,我也是刚开始学)

什么是数据挖掘, 相信点击进入这篇博客的人都应该知道了吧。通俗的说就是挖掘数据所蕴含的含义,寻找数据之间的关系。

下面将以最简单的亲和性分析来开始吧。

亲和性分析

相信大家都听说过一个例子:

在美国的零售业有着这样一个传奇故事,沃尔玛百货将他们的纸尿裤和啤酒并排摆在一起销售,结果纸尿裤和啤酒的销量双双增长!

什么是亲和性分析呢?亲和性分析根据样本个体之间的关系,确定它们关系的亲疏。举一个简单的应用:顾客去超市买了一个苹果,那么他会不会很大的可能性去买香蕉呢?

首先,我们得有一个数据集:

这个是一个很简单的商品交易数据集,简单到它只有100条数据,尽管数据比较少,but我们用来学习一下还是可以的。

数据集的含义:

如果看一行的话,每一行如(0,1,0,0,1)可以代表每一条交易包含的商品,0代表没有购买,1代表购买。每一列代表一种商品。

那么我们需要找出他的什么数据含义规则呢?“如果一个顾客购买了商品A,则他很可能购买商品B”。找到这种规则很简单,找出交易数据中同时购买A商品和B商品的记录,然后与总的交易数量相比较即可。

规则有优劣,这里有两种衡量标准,支持度置信度。(如果商品交易数据)

  • 支持度:支持度指的是数据集中规则应验的次数。(商品交易中同时买A商品和B商品的交易数量【支持度也可以为次数/交易总量】)
  • 置信度:置信度代表的是规则的准确性如何。(以例子来说,就是如果既买A商品又买B商品的数量除以买A商品的数量)

代码实现

使用的库如下:

  • numpy
  • collections

数据集在这里:data

首先我们需要加载数据集,数据的文件名为affinity_dataset.txt

import numpy as np
data_filename = "affinity_dataset.txt"
datas = np.loadtxt(data_filename)
# 列的属性
features = ["面包", "牛奶", "黄油", "苹果", "香蕉蕉"]

数据集我们已经加载完毕,为了得到商品A和商品B的数据,在python中也就是(商品A,商品B)元组,我们需要进行遍历,然后将数据保存下来。

现在让我们来计算置信度。我们使用valid_rules字典来保存商品A和商品B同时存在的记录,使用invalid_rules来保存当商品A存在时,但是商品B不存在的记录。

valid_rules = defaultdict(int)
invalid_rules = defaultdict(int)

我们使用defaultdict来创建字典而不是使用常用的方式是因为:

这样的好处是即使在没有这个key的时候,它也会返回默认的值0。

我们定义一个方法,目的是为了统计A,B之间的关系。

# A 和 B之间的联系,返回购买A商品的数量
def connect(indexA, indexB):
    buy_A_num = 0
    for sample in datas:
        if sample[indexA] == 0:
            continue
        buy_A_num += 1

        if(sample[indexB] == 1):
            valid_rules[(indexA, indexB)] += 1
        else:
            invalid_rules[(indexA, indexB)] += 1
    return buy_A_num
         

方法,我们就可以获得需要的数据,现在我们可以计算置信度了。


def get_confidence():
    confidence = defaultdict(float)
    for premise, feature in valid_rules.keys():
        rule = (premise, feature)
        confidence[rule] = valid_rules[rule] / (valid_rules[rule]+invalid_rules[rule])
        print("购买{0}后同时{1}的置信度为:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))
    return confidence

当然支持度怎么算,这个就太简单了,就是valid_rules里面的value除以数据总量即可,就不展示了。

运行代码,使用for循环将所有的关系都找出来,然后计算置信度:

if __name__ == "__main__":
    for i in range(len(features)):
        for j in range(len(features)):
            if(i == j):
                continue
            connect(i,j)
    confidence = get_confidence()

最后结果如下所示:

同样我们可以对置信度进行排序,字典的items()函数返回包含字典所有元素的列表。itemgetter(1)表示以字典各元素的值(这里为置信度)作为排序依据,reverse=True表示降序排列。

from operator import itemgetter
    sort_dict = sorted(confidence.items(),key=itemgetter(1),reverse=True)
    for index in range(5):
        rule = sort_dict[index][0]
        print("购买{0}后同时{1}的置信度为:{2:0.3f}".format(features[rule[0]],features[rule[1]],confidence[rule]))

结果如下图所示:

项目地址:github

参考书籍:Python数据挖掘入门与实践

原文地址:https://www.cnblogs.com/xiaohuiduan/p/12419410.html

时间: 2024-10-06 21:19:55

数据挖掘入门系列教程(一)之亲和性分析的相关文章

数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST

目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 在本章节中,并不会对神经网络进行介绍,因此如果不了解神经网络的话,强烈推荐先去看<西瓜书>,或者看一下我的上一篇博客:数据挖掘入门系列教程(七点五)之神经网络介绍 本来是打算按照<Python数据挖掘入门与实践>

数据挖掘入门系列教程(八点五)之SVM介绍以及从零开始推导公式

目录 SVM介绍 线性分类 间隔 最大间隔分类器 拉格朗日乘子法(Lagrange multipliers) 拉格朗日乘子法推导 KKT条件(Karush-Kuhn-Tucker Conditions) 拉格朗日乘子法对偶问题 Slater 条件 最大间隔分类器与拉格朗日乘子法 核技巧 核函数 软间隔 软间隔支持向量机推导 SMO算法 SMO变量的选择方法 总结 参考 还是老规矩,这一篇博客是对SVM进行介绍,下一篇博客就是使用SVM进行具体的使用. SVM介绍 首先介绍SVM是什么,SVM(s

[大数据从入门到放弃系列教程]第一个spark分析程序

文章施工中,由于部分网站会在我还没有写完就抓取到这篇文章,导致你看到的内容不完整,请点击这里: 或者复制访问 http://www.cnblogs.com/blog5277/p/8580007.html 来查看更完整的内容 [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 *********************分割线******************

Android视频录制从不入门到入门系列教程(三)————视频方向

运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子的: 就是说,即使你是竖着拿手机的,Camera提供给你的视频图像的方向还是上图那样横着的图片. 我们可以通过下述方向改变Camera提供的视频图像的方法: camera.setDisplayOrientation(90); 让图像顺时针旋转90度,视频图像的方向就正常的. 本篇文章DEMO下载.

Angular2入门系列教程-服务

上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得我们可以很优雅得做到这一点.这里简单描述下,依赖注入可以使我们在编写代码的时候不用使用new 去生成一个类,这样就达到了解耦的目的,更多关于依赖注入的知识我觉得不应该在这里讲解 和其他方式类似,Angular2使用的是装饰器@Injectable()来描述以一个类是否可注入,我们本篇文章的目的,就是

Provisioning Services 7.8 入门系列教程之八 自动添加设备

续Provisioning Services 7.8 入门系列教程之七 批量导入设备 对于批量导入设备,其最大的缺点是在导入前,必须准确记录所有设备的MAC地址.当然,这种方式也有许多方便之处,如可以将不同的设备添加到不同地站点.不同的集合. 下面介绍第三种方式:通过自动添加向导完成设备的添加 使用自动添加向导 自动添加向导可以自动配置各种规则,以便利用自动添加功能将新的目标设备自动添加到 Provisioning Services 数据库中. 可以在场.站点.集合或设备级别启动自动添加向导.

Provisioning Services 7.8 入门系列教程之十 通过类自动更新虚拟磁盘

续Provisioning Services 7.8 入门系列教程之九 手动更新虚拟磁盘 本文中介绍的自动更新虚拟磁盘这种更新方法,和前面介绍的手动更新虚拟磁盘的方法一样,也需要通过复制虚拟磁盘副本产生更新后的虚拟磁盘. 本文将重点介绍更新磁盘产生后,如何应用到设备. 在实际生产环境中,有些用户的PVS应用环境可以规模很大,有很多站点,每个站点下有很多设备集合.同时,很难有一时刻所有的计算机都关机,这样给应用更新磁盘代来了很大难度. 再者,管理员在实际更新中,可能会这样的一种需要,对某一些设备需

Provisioning Services 7.8 入门系列教程之十二 实现高可用性

续Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘 在实际生产环境,保障系统的稳定运行,防止故障出现时系统瘫痪,因此故障转移.高可性尤为重要. 从PVS的部署中涉及的组件来看,要实现可用性需要从以下几个方面 1.活动目录DC 2.DHCP服务器 3.数据库SQL 4.网络 5.PVS服务器(TFTP服务器) 6.存储 对于活动目录.DHCP以及数据库服务器,可以通过故障转移群集来实现 Windows Server 2008 R2 之二十九故障转

Provisioning Services 7.8 入门系列教程之三 安装并配置 Provisioning Services

续Provisioning Services 7.8 入门系列教程之二 基础环境安装续 Provisioning Services 解决方案 Provisioning Services 流技术推送技术允许从单个共享磁盘映像实时地置备或重新置备计算机. 在这一过程中,管理员完全无需管理和修补各个系统, 所有映像管理均在主映像上完成. 每个系统的本地硬盘可以用来实现运行时数据缓存,在某些情况下,还可以完全从系统中移除,从而降低电力消耗.系统故障率和安全风险.Provisioning Services