1、亲和性分析示例

基本概念:

根据样本个体之间的相似度

支持度support        置信度confident

示例:如果一个人买了商品X,那么他很有可能购买商品Y  (本例有两个特征值0和1,表示是否购买)

过程思路:

1、在numpy中加载数据集

  • numpy是二维数组,看上去像一张表。
  • 数组的每一项为个体的某项特征值。
  • 数据集与文件放在同一目录下
  • 输出前5行数据查看数据集

2、实现简单的排序

  • 找出“如果一个人买了商品X,那么他很有可能购买商品Y”这个规则,就要找出数据集中所有同时购买的两件商品
  • 规则:由前提条件和结论两部分组成
  • 规则常用的衡量方法:支持度和置信度
  • 支持度:在数据集中,规则中条件应验的次数(符合前提条件的数量)  P(X)
  • 置信度:规则中条件和结论同时应验的次数/支持度   P(Y|X)=P(XY)/P(X)
  • 统计所有规则的相关数据:规则应验、规则无效、条件相同的规则数量
  • 创建几个字典用于存放计算结果:用defaultdict(如果查找的键不存在,返回一个默认值)
  • 循环结构:依次对样本的每个个体及个体的每个特征值进行检测,看是否满足条件。如果满足,该条件出现的次数加1;不满足,继续检测下一个。
  • 在遍历过程中跳过条件和结论相同的规则(即如果买了X,那么会买X)
  • 如果规则应验,规则应验的次数(即上面创建的字典中的元组)加1
  • 计算每一条规则的支持度和置信度得到字典,支持度就是上面统计的规则应验的次数,置信度类似
  • 声明函数接收参数:前提条件和结论的特征索引值、支持度字典、置信度字典、特征列表
  • 格式化输出支持度与置信度,把索引替换成相应的特征。

3、排序找出最佳规则

  • 根据支持度和置信度进行排序
  • 如找出支持度最高的规则置信度排序同理
    • 对支持度字典进行排序,字典的items()返回包含字典所有元素的列表;itemgetter()类作为键,对嵌套列表进行排序;itemgetter(1)表示以字典各元素的值作为排序依据,降序排列
 1 import numpy as np
 2
 3 #在numpy中加载数据集
 4 dataset_filename = "affinity_dataset.txt"  #要用到的数据文件名为"affinity_dataset.txt" ,注意:数据集文件与笔记本文件放到同一个目录下
 5
 6 X=np.loadtxt(dataset_filename)        #文件内容赋值给一个数组
 7
 8 print(X[:5])                          #打印数组内容
 9
10 #实现简单的排序规则
11 num_apple_purchases = 0               #初始购买apple的人数为0
12 for sample in X:                      #遍历数组X中的每一行(sample)
13     if sample[3] == 1:                #如果第三列(apple)的值为1,即买了apple
14         num_apple_purchases += 1      #购买apple的人数加1
15 print("{0} people bought apples".format(num_apple_purchases)) #打印购买apple的总数
16 # format是格式化语法,{0}指定位置
17
18 #变量说明
19 n_samples,n_features = X.shape
20 #语法:shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。
21 features = ["bread","milk","cheese","apples","bananas"]   #列表
22
23 from collections import defaultdict
24 #使用defaultdict创建相应的字典,好处是当查找的键不存在,返回一个默认值
25 valid_rules = defaultdict(int)        #统计规则应验的数量(买了一个同时买了另一个)
26 invalid_rules = defaultdict(int)      #统计规则无效的数量(买了一个却没有买另一个)
27 num_occurances = defaultdict(int)     #统计条件相同的规则数量(购买的个体的数量)
28
29 #通过循环结构依次对个体及特征值进行处理,统计个体与个体之间的相关性   条件:如果顾客买了一种商品
30 for sample in X:                      #遍历每一行
31     for premise in range(5):          #遍历每一列
32         #判断是否买了该商品
33         if sample[premise] == 0:      #如果数组中的值为0(没有买该商品)
34             continue                  #跳过本次循环
35
36         num_occurances[premise] += 1           #条件相同的规则数量+1(买了该商品)
37
38         for conclusion in range(n_features):  #遍历结论
39             if premise == conclusion:         #如果条件和结论相同(如果买了苹果,那么买了苹果)
40                 continue                      #跳过本次循环
41
42         if sample[premise] == 1:                      #条件满足,顾客买了一种商品
43             valid_rules[(premise,conclusion)] += 1    #规则应验的数量加1
44
45         else:                                         #以上条件均不满足,无效规则
46             invalid_rules[(premise,conclusion)] += 1  #规则无效的数量加1
47
48     #计算支持度support和置信度confidence
49 support = valid_rules                                  #p(x)所有买X的人数
50 confidence = defaultdict(float)
51 for premise,conclusion in valid_rules.keys():          #遍历有效规则中的条件和结论
52     rule = (premise,conclusion)                        #定义规则的形
53     confidence[rule] = valid_rules[rule]/num_occurances[premise]   #p(Y|X)=所有买X和Y的人数/所有买X的人数
54
55     #声明一个函数用于接收参数
56 def print_rule(premise,conclution,support,confidence,features):   #features是特征列表的索引
57     #把索引替换成相应的特征
58     premise_name = features[premise]
59     conclusion_name = features[conclusion]
60     #输出想要的结果
61     print("rule:if a person buys {0} they will also buy {1}".format(premise_name,conclusion_name))
62     print("-suppotr:{0}".format(support[(premise,conclusion)]))
63     print("-confidence:{0:.3f}".format(confidence[(premise,conclusion)]))  #.3f保留3位小数点
64
65
66 #代码测试:尝试更换条件和结论,看看输出结果如何
67 premise=1
68 conclusion=3
69 print(premise,conclusion,support,confidence,features)
70
71 #排序找出最佳的规则
72 from operator import itemgetter                                          #itemgetter可以对嵌套的列表进行排序
73 sorted_support = sorted(support.items(),key=itemgetter(1),reverse=True)  #sorted排序
74 #items()函数返回包含字典所有元素的列表,item getter(1)表示以字典各元素的值(support)作为排序依据,reverse = True表示降序排列
75
76 #输出支持度最高的前五条规则
77 for index in range(5):
78     print("rule #{0}".format(index+1))
79     premise,conclusion = sorted_support[index][0]  #索引
80     print_rule(premise,conclusion,support,confidence,features)
81
82 #同理输出置信度最高的规则
83 sorted_confidence = sorted(confidence.items(),key=itemgetter(1),reverse = True)
84
85 for index in range(5):
86     print("rule #{0}".format(index + 1))
87     premise, conclusion = sorted_confidence[index][0]
88     print_rule(premise, conclusion, support, confidence, features)

原文地址:https://www.cnblogs.com/wcy-going/p/11637940.html

时间: 2024-08-05 03:02:38

1、亲和性分析示例的相关文章

数据挖掘——亲和性分析

亲和性分析根据样本个体之间的相似度,确定它们关系的亲疏.应用场景: 1.向网站用户提供多样化的服务或投放定向广告. 2.为了向用户推荐电影或商品 3.根据基因寻找有亲缘关系的人 比如:统计顾客购买了商品1,然后再购买商品2的比率,算相似度. import numpy as np dataset_filename = "affinity_dataset.txt" x = np.loadtxt(dataset_filename) # print x[:5] # 上述代码的结果代表前5次交易

Android中app卡顿原因分析示例

在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. ========================================================= 我来说下我所知道的事情.我不知道iOS为什么流畅,但我知道一些Android为什么不流畅的原因. 首先,就题主所说的问题,我用iPad和小米Pad对比了一下微博滑动滚屏这件事情(2014年8月10日目前微博

数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法

[python] view plain copy print? #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 2017 电影推荐分析: 使用 亲和性分析方法 基于 Apriori算法 推荐电影 @author: yingzhang """ #读取数据集: http://grouplens.org/datasets/movielen

亲和性分析——推荐电影

小编今天学习了Apriori算法,用于生成频繁项集,感觉好厉害.  ——参考 Robert Layton的 数据挖掘 所以小编特此记录加深印象.所以代码 仅仅放上核心. Apriori算法可以说是经典的亲和性分析算法.它只从数据集中频繁出现的商品中选取共同出现的商品组成频繁项集(frequent itemset),避免了上述复杂度呈指数级增长的问题.一旦找到频繁项集,生成关联规则就很容易了. 挖掘亲和性分析所用的关联规则之前,我们先用Apriori算法生成频繁项集.接着,通过检测48 第 4 章

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

数据挖掘入门系列教程(一)之亲和性分析 教程系列简介 系列地址:https://www.cnblogs.com/xiaohuiduan/category/1661541.html 该教程为入门教程,为博主学习数据挖掘的学习路径步骤.教程为入门教程,从最简单的开始.使用的编程语言为Python3.8.1,使用JupyterNotebook作为开发环境(使不使用JupyterNotebook都没有关系). 在学习本教程之前,你需要: 有一点python编程基础 会用百度 or 谷歌 数学知识还是要一

javaCore分析示例(转)

当两个或多个线程彼此形成循环依赖关系时,就出现了死锁.例如,如果线程 A 处于等待线程 B 的等待状态,而同时线程 B 处于等待线程 A 的等待状态,则出现了死锁.一旦形成此情况,线程 A 和线程 B 都不能有任何进展,因为这两个线程现在都无限期地挂起了.为什么会有人创建这种系统?当然,您并不会有意这么做,但由于存在大量线程和复杂事务,因此很容易出现这种情况. 本文将介绍如何使用 IBM WebSphere Application Server V6.1 的线程转储工具来对系统进行检查,以确定是

LayoutInflater 原理分析 示例

LayoutInflater简介 一. LayoutInflater 简介        LayoutInflater 顾名思义就是布局填充器,做过Android界面编程,相信对这个类都比较熟悉,可能用人说,我们在activity中使用setContentView(Id)来初始化布局,但实际上其内部也是使用LayoutInflater 来填充布局的. 二. LayoutInflater 基本使用       可以通过以下两种方式获取LayoutInflater            1. Lay

volatile 可见性的模拟分析示例

volatile 作为java的关键字之一,必然有它存在的必要性:在很多的资料中,各位大神级的人物都对volatile做了深入的分析,在这里就不在赘述了:不清的朋友可以迁移到这个地址详细了解:https://www.cnblogs.com/dolphin0520/p/3920373.html 那么已经了解volatile的作用.这里呢?将使用java代码将把volatile底层 "可见性"给扩大,并已代码的形式展示,volatile的可见性到底是怎么一回事: 注意:本人亦不清楚vola

jprofiler+Linux+weblogic功能简介,配置及内存泄漏分析示例

jprofiler简介: jprofiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象. 一.主要功能简介 1.内存剖析 Memory profiler JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象. 所有对象 显示类或在状况统计和尺码信息堆上所有对象的包.你可