A-priori算法是一种先验算法,经常用于数据挖掘里面寻找关联的子集。我们给定一个数据的集合{{1,2,3},{1,2,3,5,4}…{11,19,28}},需要寻找同时出现次数超过s次的k元集合(x1,x2...xk).(x_1,x_2...x_k).其基本核心思路如下:

1:首先寻找出现次数超过s次的一元集合,由于这样的集合不会超过元素的总数,一般可以直接计算出来,利用字典(或其他hash结构)可以在O(N)的复杂度情况下得到解。

2:假定我们已经获取了k-1元集合的解,那么容易看出,k元集合里面一定含有k-1元的解,否则不可能出现超过s次。那么我们利用每一个集合对应的k-1元的解加上1元集合的解来构造该集合对应的k元候选集合。例如:如果第三个集合的2元解是{(2,5),(2,3),(3,5)},1元解是{(1),(4),(2),(3),(5)},那么候选的三元解则是{(2,3,4),(3,4,5),(2,5,4),(1,2,5)…(1,3,5)}。然后再去进行计算,检测是否确实出现了s次,过滤掉不满足的候选。

3:coding细节有这样几个需要注意:

[0]由于构造集合时没有顺序,所以我们必须要对集合排序,否则(1,2)与(2,1)对应的是同一个集合,但是确会输出两次。

[1]选取的单个元素有可能已经在k-1元的集合里面了,这时候就直接跳过这个组合。

[2]需要将原始数据复制一份,因为循环过程会改变原始的数据。

4:假设一共有n个集合,每个集合有m元素,我们直接暴力统计2元的解的复杂度是:

m22∗n\frac{m^2}{2}*n,而过滤之后再统计的复杂度是:m∗n+∑sim*n+\sum s_i,其中si是代表过滤之后剩下的候选集合个数。很显然过滤之后的元素个数要比nm2nm^2得多.更不要说3元,4元直到m2元的集合了。\frac{m}{2}元的集合了。

def A_pri(raw_data,s,k):def get_singlgeitems():counts = {}for items in raw_data:for item in items:if item in counts:counts[item] += 1else:counts[item] = 1counts_filterd = [key for (key,val) in counts.items() if val >= s]return counts_filterddef select(backet,raw_backet):new_backet = set()for tuple_items in backet:for item in raw_backet:if item not in single_items or item in tuple_items :continuetmp = tuple_items+(item,)new_backet.add(tuple(sorted(tmp)))return new_backetdef Tuple(data):tuple_data = []for items in data:tuple_data.append(set([(item,) for item in items]))return tuple_datadef Set(data):set_data = set()for items in data:for item in items:set_data.add(tuple(sorted(item)))return set_datan = len(raw_data)data = Tuple(raw_data)single_items = get_singlgeitems()for size in range(2,k+1):for i in range(n):data[i] = select(data[i],raw_data[i])for first in range(n):items_1 = data[first].copy()for tuples in items_1:count = 0for items_2 in data:count += 1 if tuples in items_2 else 0if count < s:data[first].remove(tuples)result = Set(data)print(result)
A_pri([[1,2,3,4],[1,2],[2,3,4],[1,2,4],[2,3],[3,4]],2,3)

A-priori算法的简单实现相关推荐

  1. 图片滤镜算法原理简单讲解

    一.锐化 锐化的算法很简单,就是比较相邻的几个像素,把当前像素加上和周围的像素的差就可以了.这里我给出一个示例: A B C D E F G H I J K L M N O P 假设有一个图片,4*4 ...

  2. 排序算法-05简单选择排序(python实现)

    简单选择排序 概述 顾名思义,这是一种选择排序. 其步骤大致是,每一趟排序从待排记录中找到一个最小的关键字,放到已排序记录末尾,知道排序结束. 算法详解 首先,从待排记录中找到最小元素 如果最小元素不 ...

  3. 图像基本处理算法的简单实现(二)

    图像基本处理算法的简单实现(一) 图像基本处理算法的简单实现(二) 4)膨胀腐蚀 属于什么心态学==,膨胀.腐蚀.击中/击不中变换.细化-(又晕了T^T).简单点好像就是集合运算,图像与一结构元素的交 ...

  4. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  5. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  6. 利用k-means算法解决简单的无监督图像识别任务

    k-means Clustering(k平均聚类算法) 简介: 无监督学习对图像进行分类时,可以采用k-means算法.该算法实现简单,运行速度快.该算法要求事先知道数据所具有的类别数.k-means ...

  7. 中心性算法的简单总结

    中心性算法的简单总结 中心性(Centrality)是社交网络分析(Social network analysis, SNA)中用以衡量网络中一个点或者一个人在整个网络中接近中心程度的一个概念,这个程 ...

  8. 协同过滤算法的简单理解《推荐系统实践》

    协同过滤算法的简单理解 本文主要是讲解一下<推荐系统实践>中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解. UserCF(基于用户的协同过滤算法) 这种推荐算法的出发 ...

  9. 教学优化算法的简单介绍

    目录 摘要 背景 算法 学生初始化 教学阶段 学习阶段 流程总结 优缺点 优点 缺点 一些改进 总结 参考文献 摘要 教学优化算法(Teaching-learning-based optimizati ...

  10. Round Robin算法的简单C#实现

    整理笔记的时候,发现自己在项目中还用C#实现过一次Round Robin算法算法,当时的应用场景,是要根据权重给多个队列均匀的提供数据,对输入的数据进行拆分处理.算法很简单,最核心的部分,其实是取最大 ...

最新文章

  1. 中石油-高精度除法-java版
  2. mysql配置多个域名访问吗,tomcat部署多个项目,通过域名解析访问,不同的网站...
  3. JS加密算法简单分析
  4. 快速安装puppeteer (跳过安装Chromium)
  5. poj-3667(线段树区间合并)
  6. RabbitMQ教程总结
  7. Confluence 6 管理协同编辑 - 最大编辑者的限制
  8. SQL SERVER数据库设计与现实
  9. Python编码风格
  10. 电脑主板线路连接图解_主板接线图解
  11. matlab中 概率密度估计ksdensity,k-s检验kstest和kstest2(单/双样本检验数据是否符合某种分布)
  12. JS:中文输入法,日文输入法做最大位数Check的坑maxlength
  13. 将全部视频画面水平或者垂直翻转的实例教程分享
  14. iPhone显示返回的是html界面,iPhone X怎么回到主界面?苹果X返回主页的两种方法...
  15. Scratch软件编程等级考试一级——20210320
  16. 鸡和兔放在一起,一共有20个头和56只脚,问鸡和兔各几只?
  17. ur机器人计算机模拟仿真,ur机器人编程-设置工具
  18. IsEmpty 函数
  19. DSG招聘Oracle工程师、销售(南京、上海、南昌)
  20. PCB软件使用之mechanical机械层

热门文章

  1. 交流电过零点检测电路总结
  2. built a JNCIS LAB系列:Chapter 4 BGP
  3. PHP 函数的完整参考手册
  4. hdu5773The All-purpose Zero,1257最少拦截次数
  5. 如何在Python中使用Rest API
  6. java rest 请求_rest有哪些请求方法
  7. 2021技术人的百宝黑皮书
  8. IEEE802.3-2015 CL78 节能以太网(EEE)要点翻译
  9. ASP.NET 基于asp.net设计项目框架
  10. 渗透测试-使用metasploit的evasion模块生成后门木马