Python数据挖掘学习——亲和性分析

最近了解了一些Python数据挖掘方面的内容,主要学习了《Python数据挖掘入门与实践》这本书的内容,在这里对书中的内容以及我遇到的一些问题进行整理。

数据挖掘旨在让计算机根据已有的数据作出决策。

数据挖掘的第一步一般是创建数据集,数据集主要包括:

(1)样本:表示真实世界中的物体

(2)特征:描述数据集中样本

学习的第一步接触的就是亲和性分析,亲和性分析是通过样本个体之间的相似度确定它们之间关系的亲疏。

这个例子中采用商品购买的一个数据集,商品共有:面包,牛奶,奶酪,苹果,香蕉这几种。

这里每个特征都有且只可能有0或者1两个值——表示是否购买该商品,而非购买的数量。

在得到样品及特征后,我们要找出规则,比如“购买了X,那么可能会购买Y”

找出规则后还需要判断其优劣,这里涉及到两个指标——支持度和置信度。

代码如下:

"""
《Python数据挖掘入门与实践》
亲和性分析
数据集每一列代表:是否购买——面包、牛奶、奶酪、苹果、香蕉
支持度support——规则应验的次数
置信度confidence——规则应验的比例
"""
import numpy as np
from collections import defaultdict #默认字典——如果没有对应的键,返回默认值0
from operator import itemgetter #针对字典进行排序


dataset_filename = r'F:\Python\pycharm\DataAnalysis_test\data\affinity_dataset.txt'
X = np.loadtxt(dataset_filename)
# print(X[:15])#显示前15行数据
features = ["bread", "milk", "cheese", "apple", "banana"]#特征列表

"""查看有多少人购买了苹果"""
# num_apple_buy = 0
# for sample in X:
#     if sample[3] == 1:
#         num_apple_buy +=1
# print("{0} people bought Apples".format(num_apple_buy))

"""构建规则字典"""
valid_rules = defaultdict(int)#规则应验
invalid_rules = defaultdict(int)#规则无效
num_occurances = defaultdict(int)#符合A条件(如果。。。)的所有情况
n_features = 5#共有几项特征
for sample in X:
    for premise in range(n_features):
        if sample[premise] == 0:
            continue
        else:
            num_occurances[premise] += 1#符合A条件的情况+1
            for conclusion in range(n_features):
                if premise == conclusion:
                    continue
                else:
                    if sample[conclusion] == 1:
                        valid_rules[(premise, conclusion)] +=1 #规则应验
                    else:
                        invalid_rules[(premise, conclusion)] +=1 #规则无效

#计算每条规则的置信度(confidence规则的准确率如何)和支持度(support规则应验的次数)
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("置信度confidence: {0:.3f}".format(confidence[(premise, conclusion)]))
    print("支持度support:{0}".format(support[(premise, conclusion)]))


"""排序找出最佳规则"""
def best_rule():
    sorted_support = sorted(support.items(),
                            key=itemgetter(1), #以字典的值的次序进行排序
                            reverse=True)#降序
    sorted_confidence = sorted(confidence.items(), key=itemgetter(1), reverse=True)
    for index in range(5):#输出排序最高的五个规则
        print("RULE #{0}".format(index + 1))
        premise, conclusion = sorted_support[index][0]
        print_rule(premise, conclusion, support, confidence, features)

if __name__ == '__main__':
    premise = 2
    conclusion = 4
    # print_rule(premise, conclusion, support, confidence, features)
    best_rule()
    # print(valid_rules)

输出结果为规则的评价结果:

RULE #1
rule: if a person buys cheese they will also buy banana
置信度confidence: 0.659
支持度support:27
RULE #2
rule: if a person buys banana they will also buy cheese
置信度confidence: 0.458
支持度support:27
RULE #3
rule: if a person buys apple they will also buy cheese
置信度confidence: 0.694
支持度support:25
RULE #4
rule: if a person buys cheese they will also buy apple
置信度confidence: 0.610
支持度support:25
RULE #5
rule: if a person buys banana they will also buy apple
置信度confidence: 0.356
支持度support:21

 这个例子中的数据集下载链接:商品购买数据集下载

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值