系列地址:https://www.cnblogs.com/xiaohuiduan/category/1661541.htmlhtml
该教程为入门教程,为博主学习数据挖掘的学习路径步骤。教程为入门教程,从最简单的开始。使用的编程语言为Python3.8.1,使用JupyterNotebook做为开发环境(使不使用JupyterNotebook都没有关系)。python
在学习本教程以前,你须要:git
什么是数据挖掘, 相信点击进入这篇博客的人都应该知道了吧。通俗的说就是挖掘数据所蕴含的含义,寻找数据之间的关系。github
下面将以最简单的亲和性分析来开始吧。编程
相信你们都据说过一个例子:编程语言
在美国的零售业有着这样一个传奇故事,沃尔玛百货将他们的纸尿裤和啤酒并排摆在一块儿销售,结果纸尿裤和啤酒的销量双双增加!ide
什么是亲和性分析呢?亲和性分析根据样本个体之间的关系,肯定它们关系的亲疏。举一个简单的应用:顾客去超市买了一个苹果,那么他会不会很大的可能性去买香蕉呢?svg
首先,咱们得有一个数据集:函数
这个是一个很简单的商品交易数据集,简单到它只有100条数据,尽管数据比较少,but咱们用来学习一下仍是能够的。学习
数据集的含义:
若是看一行的话,每一行如(0,1,0,0,1)能够表明每一条交易包含的商品,0表明没有购买,1表明购买。每一列表明一种商品。
那么咱们须要找出他的什么数据含义规则呢?“若是一个顾客购买了商品A,则他极可能购买商品B”。找到这种规则很简单,找出交易数据中同时购买A商品和B商品的记录,而后与总的交易数量相比较便可。
规则有优劣,这里有两种衡量标准,支持度
和置信度
。(若是商品交易数据)
使用的库以下:
数据集在这里: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数据挖掘入门与实践