简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5}...},并使用python实现简单关联规则

2023-10-11 01:50

本文主要是介绍简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5}...},并使用python实现简单关联规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目: 简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5},{I2,I4},{I2,I3},{I1,I2,I4},{I1,I3},{I2,I3},{I1,I3},{I1,I2,I3,I5},{I1,I2,I3}},求频繁项集;并用python语言实现
解:

1.理论解答

1.1候选1-项集C1为:

项集数支持度计数
{I1}6
{I2}7
{I3}6
{I4}2
{I5}2

由于最小支持度为2/9=22%,因此最小支持度系数为2,将小于最小支持度系数的去掉,得到1-L1:

1.2 频繁1-项集 1-L1

频繁项集支持度计数
{I1}6
{I2}7
{I3}6
{I4}2
{I5}2

1.3 候选2-项集C2为:

项集数支持度计数
{I1,I2}6
{I1,I3}7
{I1,I4}6
{I1,I5}2
{I2,I3}2
{I2,I4}2
{I2,I5}2
{I3,I4}0
{I3,I5}1
{I4,I5}0

将小于最小支持度系数去掉后,得到2-L2:

1.4 频繁2-项集2-L2

频繁项集支持度计数
{I1,I2}6
{I1,I3}7
{I1,I4}6
{I1,I5}2
{I2,I3}2
{I2,I4}2
{I2,I5}2

1.5 候选3-项集C3为:

项集数支持度计数
{I1,I2,I3}2
{I1,I2,I5}2
{I1,I3,I5}1
{I2,I3,I4}0
{I2,I3,I5}1
{I2,I4,I5}1

将小于最小支持度系数去掉后,得到3-L3:

1.6 频繁3-项集3-L3

频繁项集支持度计数
{I1,I2,I3}2
{I1,I2,I5}2

随后进行候选4项集,已经找不到大于等于最小支持度系数的项集,算法结束,最终得到的频繁项集和所对应的支持度计数为:

频繁项集支持度计数
{I1}6
{I2}7
{I3}6
{I4}2
{I5}2
{I1,I2}6
{I1,I3}7
{I1,I4}6
{I1,I5}2
{I2,I3}2
{I2,I4}2
{I2,I5}2
{I1,I2,I3}2
{I1,I2,I5}2

2.python代码实现:

2.1 获取数据集

data_set = [['I1', 'I2', 'I5'], ['I2', 'I4'], ['I2', 'I3'], ['I1', 'I2', 'I4'], ['I1', 'I3'], ['I2', 'I3'],['I1', 'I3'], ['I1', 'I2', 'I3', 'I5'], ['I1', 'I2', 'I3']]

可根据实际情况换成其他数据集。

2.2 定义最小支持度和最小置信度

min_sup = 0.2
min_con = 0.8

2.3. 封装程序需要的各个函数

(1)获取下一个频繁项集

# 获取下一个频繁项集
def get_next_fre_item_set(data_set, fre_item_set, can_item_len, min_sup_num):fre_items = list(fre_item_set.keys())next_fre_item_set = {}for i in range(len(fre_items) - 1):for j in range(i + 1, len(fre_items)):tempi = set()if isinstance(fre_items[i], str):tempi.add(fre_items[i])else:tempi = set(list(fre_items[i]))tempj = set()if isinstance(fre_items[j], str):tempj.add(fre_items[j])else:tempj = set(list(fre_items[j]))tempi.update(tempj)if len(tempi) > can_item_len:continueif tempi in list(set(item) for item in next_fre_item_set.keys()):continuefor record in data_set:if tempi.issubset(set(record)):if tempi in list(set(item) for item in next_fre_item_set.keys()):next_fre_item_set[tuple(tempi)] += 1else:next_fre_item_set[tuple(tempi)] = 1for key in list(next_fre_item_set.keys()):if next_fre_item_set[key] < min_sup_num:del next_fre_item_set[key]if len(list(next_fre_item_set.keys())) < 1:return Noneelse:return next_fre_item_set

(2)获取所有的频繁项集

# 获取频繁项集
def get_fre_item_sets(data_set, min_sup):num_record = len(data_set)min_sup_num = min_sup * num_recordfre_item_sets = []fre_item_sets.append({})# 统计每个元素的频次for record in data_set:for item in record:if item in fre_item_sets[0].keys():fre_item_sets[0][item] += 1else:fre_item_sets[0][item] = 1# 删除低于最小支持度的项for item in list(fre_item_sets[0].keys()):if fre_item_sets[0][item] < min_sup_num:del fre_item_sets[0][item]can_item_len = 2while True:if len(fre_item_sets[can_item_len - 2]) < 2:breakelse:next_fre_item_set = get_next_fre_item_set(data_set, fre_item_sets[can_item_len - 2], can_item_len,min_sup_num)if next_fre_item_set == None:breakelse:fre_item_sets.append(next_fre_item_set)can_item_len += 1return fre_item_sets

(3) 计算置信度

# 计算置信度
def calculate_confidence(fre_item_sets, subset, fre_item):len_mother = len(subset)len_son = len(fre_item)mother_key = Noneson_key = Noneif len_mother == 1:mother_key = subset[0]else:mother_keys = list(fre_item_sets[len_mother - 1].keys())for i in range(len(mother_keys)):if set(subset) == set(mother_keys[i]):mother_key = mother_keys[i]breakson_keys = list(fre_item_sets[len_son - 1].keys())for i in range(len(son_keys)):if set(fre_item) == set(son_keys[i]):son_key = son_keys[i]breakreturn fre_item_sets[len_son - 1][son_key] / fre_item_sets[len_mother - 1][mother_key]

(4)获取关联规则

# 获取关联规则
def get_association_rules(fre_item_sets, min_con):def subsets(itemset):N = len(itemset)subsets = []for i in range(1, 2 ** N - 1):tmp = []for j in range(N):if (i >> j) % 2 == 1:tmp.append(itemset[j])subsets.append(tmp)return subsetsassociation_rules = []for i in range(1, len(fre_item_sets)):fre_item_set = fre_item_sets[i]for fre_item in list(fre_item_set.keys()):tmp = {}all_subsets = subsets(fre_item)for s1 in range(len(all_subsets) - 1):for s2 in range(s1 + 1, len(all_subsets)):subset1 = all_subsets[s1]subset2 = all_subsets[s2]if len(subset1) + len(subset2) == len(fre_item) and len(set(subset1) & set(subset2)) == 0:confidence = calculate_confidence(fre_item_sets, subset1, fre_item)if confidence > min_con:temp = str(subset1) + ' > ' + str(subset2)tmp[temp] = confidenceconfidence = calculate_confidence(fre_item_sets, subset2, fre_item)if confidence > min_con:temp = str(subset2) + ' > ' + str(subset1)tmp[temp] = confidenceif tmp.keys():association_rules.append(tmp)return association_rules

2.4 使用以上函数进行关联规则的提取

(1)获取频繁项集并打印

fre_item_sets = get_fre_item_sets(data_set, min_sup)for i in fre_item_sets:print(i)

打印出的频繁项集如下,字典的value为出现的频次如下图所示:
在这里插入图片描述
(2)根据频繁项集获取关联规则

association_rules = get_association_rules(fre_item_sets, min_con)
for i in association_rules:print(i)

打印出的关联规则如下,字典的value为置信度如下图所示:
在这里插入图片描述

这篇关于简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5}...},并使用python实现简单关联规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184655

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO