简介:
Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含K个项的集合为k项集。项集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集。

基本思想:
首先扫描数据库中所需要进行分析的数据,在设置完支持度以及置信度以后,在最小支持度的支持下产生频繁项,即统计所有项目集中包含一个或一个以上的元素频数,找出大于或者等于设置的支持度的项目集。其次就是频繁项的自连接。再者是如果对频繁项自连接以后的项的子集如果不是频繁项的话,则进行剪枝处理。接着对频繁项处理后产生候选项。最后循环
调用产生频繁项集。

支持度:
支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重。或者说几个数据关联出现的概率。

置信度:
置信度体现了一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。

举例:

代码实现:

package com.ucm.utils;import java.util.*;public class Apriori {private final static int SUPPORT = 2; // 支持度阈值private final static double CONFIDENCE = 0.8; // 置信度阈值private final static String ITEM_SPLIT="、"; // 项之间的分隔符private final static String CON=" → "; // 项之间的分隔符private List<String> transList ; //所有交易public Apriori(List<String> transList) {this.transList = transList;}/**** @return  交易的所有频繁项集*/public Map<List<String>,Integer> getFC(){Map<List<String>,Integer> frequentCollectionMap = new HashMap<>();//所有的频繁集frequentCollectionMap.putAll(getItem1FC());//合并频繁1项集Map<List<String>,Integer> itemkFcMap = getItem1FC(),candidateCollection;while (itemkFcMap!=null && itemkFcMap.size()!=0){candidateCollection = getCandidateCollection(itemkFcMap);//获得候选集//对候选集项进行累加计数for (List<String> candidate : candidateCollection.keySet()){for (String trans : transList){boolean flag = true;// 用来判断交易中是否出现该候选项,如果出现,计数加1for (String candidateItem : candidate){if (trans.indexOf(candidateItem)==-1){flag = false;break;}}if (flag){candidateCollection.put(candidate,candidateCollection.get(candidate)+1);}}}itemkFcMap.clear();//从候选集中找到符合支持度的频繁集项for (List<String> candidate : candidateCollection.keySet()){Integer fc = candidateCollection.get(candidate);if (fc>=SUPPORT){itemkFcMap.put(candidate,fc);}}//合并所有频繁集frequentCollectionMap.putAll(itemkFcMap);}return frequentCollectionMap;}/*** 关联规则* @param frequentCollectionMap 频繁集* @return 关联规则*/public Map<String,Double> getRelationRules(Map<List<String>,Integer> frequentCollectionMap){Map<String,Double> relationRules=new HashMap<>();for (List<String> itmes : frequentCollectionMap.keySet()){if (itmes.size()>1){double countAll = frequentCollectionMap.get(itmes);List<List<String>> result = getSubsets(itmes);//获得itmes的所有非空子集for (List<String> itemList : result){if (itemList.size() < itmes.size()){//只处理真子集StringBuilder reasonStr = new StringBuilder();//前置StringBuilder resultStr = new StringBuilder();//结果for (String item : itemList) reasonStr.append(ITEM_SPLIT).append(item);for (String item : itmes) if (!itemList.contains(item)) resultStr.append(ITEM_SPLIT).append(item);double countReason = frequentCollectionMap.get(itemList);double itemConfidence = countAll / countReason;//计算置信度if (itemConfidence >= CONFIDENCE){String rule = reasonStr.append(CON).append(resultStr.substring(1)).substring(1);relationRules.put(rule,itemConfidence);}}}}}return relationRules;}/***对于给定的频繁K项集,获得他的K+1项候选集* @param itemkFcMap 频繁K项集* @return  K+1项候选集*/private Map<List<String>,Integer> getCandidateCollection(Map<List<String>,Integer> itemkFcMap){Map<List<String>,Integer> candidateCollection = new HashMap<>();Set<List<String>> itemkSet1 = itemkFcMap.keySet();Set<List<String>> itemkSet2 = itemkFcMap.keySet();//连接for (List<String> itemk1 : itemkSet1){for (List<String> itemk2 : itemkSet2){if (!itemk1.equals(itemk2)){for (String item : itemk2){if (itemk1.contains(item)) continue;List<String> temp = new ArrayList<>(itemk1);temp.add(item);temp.sort(Comparator.naturalOrder());candidateCollection.put(temp,0);}}}}return candidateCollection;}/*** 获取频繁1项集* @return map<key,value> key-items value-frequency*/private Map<List<String>,Integer> getItem1FC(){Map<List<String>,Integer> sItem1FCMap = new HashMap<>();//statistics frequency of each itemMap<List<String>,Integer> rItem1FCMap = new HashMap<>();//频繁1项集for (String trans : transList){String[] items = trans.split(ITEM_SPLIT);for (String item : items){List<String> itemList = new ArrayList<>();itemList.add(item);sItem1FCMap.put(itemList,sItem1FCMap.getOrDefault(itemList,0)+1);}}for (List itemList : sItem1FCMap.keySet()){Integer fc = sItem1FCMap.get(itemList);if (fc>=SUPPORT) rItem1FCMap.put(itemList,fc);}return rItem1FCMap;}/*** 构造子集* @param sourceSet* @return sourceSet的所有非空子集*/private List<List<String>> getSubsets(List<String> sourceSet){List<List<String>> result = new ArrayList<>();result.add(new ArrayList<>());for(int i = 0;i<sourceSet.size();i++){int size = result.size();for (int j = 0;j<size;j++){List<String> temp = new ArrayList<>(result.get(j));temp.add(sourceSet.get(i));result.add(temp);}}return result.subList(1,result.size());//去掉空集}}

测试代码:

import com.ucm.utils.Apriori;import java.util.Arrays;
import java.util.List;
import java.util.Map;public class TestApriori {public static void main(String[] args) {Apriori apriori = new Apriori(Arrays.asList("A、C、D","B、C、E","A、B、C、E","B、E"));Map<List<String>,Integer> frequentCollectionMap = apriori.getFC();System.out.println("-------------频繁集"+"----------------");for(List<String> list : frequentCollectionMap.keySet()) System.out.println(list+ "\t"+ frequentCollectionMap.get(list));Map<String,Double> relationRulesMap = apriori.getRelationRules(frequentCollectionMap);System.out.println("-----------关联规则"+"----------------");for (String s : relationRulesMap.keySet()) System.out.println(s+"\t"+relationRulesMap.get(s));}
}

测试结果:

Java实现Apriori算法相关推荐

  1. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  2. java实现apriori算法_各种排序算法的分析及java实现(一)

    阅读本文约需要7分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的 ...

  3. java实现apriori算法_用Java实现插入排序算法

    前言 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止. 代码 package 总结 点击关注不迷路哦

  4. Apriori算法详解与实现

    Apriori算法详解与实现 一.摘要 二.绪论 三.算法介绍 1.项目 2.项集 3.项集的支持度 4.关联规则 5.关联规则的置信度 6.频繁k项集 7.算法流程 四.代码实现 五.引用 一.摘要 ...

  5. java实现频繁集_数据挖掘--频繁集测试--Apriori算法--java实现

    [ 关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系. 关联规则揭示了数据项间的未知的依赖关系,根据所挖掘的关联关系,可以从� ...] 2013年11月19日注:以下算法中,combin ...

  6. Apriori算法学习和java实现

    关联规则挖掘可以发现大量数据中项集之间有趣的关联或相关联系.一个典型的关联规则挖掘例子是购物篮分析,即通过发现顾客放入其购物篮中的不同商品之间的联系,分析顾客的购物习惯,从而可以帮助零售商指定营销策略 ...

  7. apriori java_频繁模式挖掘apriori算法介绍及Java实现

    频繁模式是频繁地出如今数据集中的模式(如项集.子序列或者子结构).比如.频繁地同一时候出如今交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B) ...

  8. java实现数据挖掘_数据挖掘Apriori算法的java实现

    对于Apriori算法,Apriori算法是一种挖掘关联规则的频繁项集算法,在很多领域中应用广泛. 它的算法思想是: 1先找到所有的小频繁项集, 2然后做连接步骤,将小频繁项集拼接作为候选集, 3然后 ...

  9. 基于Apriori算法,SpringBoot框架作为前端,java语言编写的购物推荐系统 0.0

    1,简介 自己研究的一个小软件,已经申请专利,这里分享出我的思路以及代码作为纪念,也希望能帮到大家,可以根据已经购买的东西利用算法推荐出可能还会购买哪些,类似于淘宝的推荐系统啊之类的巴拉巴拉,不过是简 ...

最新文章

  1. Codeforces 504 A (Round #285 div.1 A) Misha and Forest
  2. python爬取历史上的今天数据并展示。
  3. 《研磨设计模式》chap3 外观模式Facade
  4. oracle缩减临时表空间,oracle的临时表空间写满磁盘空间解决改问题的步骤
  5. Python字典dict的增删查改及常用操作
  6. C#sql语句如何使用占位符
  7. Leet Code OJ 104. Maximum Depth of Binary Tree [Difficulty: Easy]
  8. IoTSharp部署教程-Sqlite分表篇
  9. wireshark、tcpdump、dsniff、Ettercap、NetStumbler、netsniff-ng
  10. shell脚本中的条件测试if中的-z到-d的意思
  11. 最短路(信息学奥赛一本通-T1382)
  12. iOS点击获取短信验证码按钮
  13. vue 拷贝 数组_vue源码中值得学习的方法
  14. Linux换行符与windows换行符
  15. c#对PL/SQL查询结果列复制的结果生成指定格式
  16. 最优化理论与算法期末试题_最优化原理和方法试题答案.doc
  17. 0001 工作业务问题_滞纳金公式计算区别实例
  18. Android 集成友盟统计
  19. js如何把时间戳转化为日期
  20. 硬核知识大全 作为程序员你不得不了解

热门文章

  1. 小觅双目摄像头标准彩色版发布 为移动机器人视觉导航避障优化设计
  2. 代码审计(全文通读审计案例)
  3. 2017开发语言排行(本人是搞C#+javascript的)
  4. Linux常用命令——pstack命令
  5. 通俗理解torch.distributed.barrier()工作原理
  6. 微信公众号开通流量主
  7. 如何更改Code::Blocks背景颜色(懒人版)
  8. 极客日报:宿华不再担任快手CEO,程一笑接任;微软市值重登全球第一;Bootstrap 4.6.1发布
  9. Pygame 简单打字游戏
  10. INFINONE XC164单片机逆向记录(R1) 汽车动力系统ECU固件逆向工程初探