• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > Apriori算法的java实现,apriori算法java

Apriori算法的java实现,apriori算法java

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含apriori算法java实现,apriori算法java,apriori算法java代码,apriori算法实现,apriori算法c#实现等服务器相关知识,网友希望可以进行参考

Apriori算法的java实现,apriori算法java


介绍

Apriori算法是一个经典的数据挖掘算法,Apriori的单词的意思是"先验的",说明这个算法是具有先验性质的,就是说要通过上一次的结果推导出下一次的结果,这个如何体现将会在下面的分析中会慢慢的体现出来。Apriori算法的用处是挖掘频繁项集的,频繁项集粗俗的理解就是找出经常出现的组合,然后根据这些组合最终推出我们的关联规则。

Apriori算法原理

Apriori算法是一种逐层搜索的迭代式算法,其中k项集用于挖掘(k+1)项集,这是依靠他的先验性质的:

频繁项集的所有非空子集一定是也是频繁的。

通过这个性质可以对候选集进行剪枝。用k项集如何生成(k+1)项集呢,这个是算法里面最难也是最核心的部分。

通过2个步骤

1、连接步,将频繁项自己与自己进行连接运算。

2、剪枝步,去除候选集项中的不符合要求的候选项,不符合要求指的是这个候选项的子集并非都是频繁项,要遵守上文提到的先验性质。

3、通过1,2步骤还不够,在后面还要根据支持度计数筛选掉不满足最小支持度数的候选集。

交易ID

商品ID列表

T100

I1,I2,I5

T200

I2,I4

T300

I2,I3

T400

I1,I2,I4

T500

I1,I3

T600

I2,I3

T700

I1,I3

T800

I1,I2,I3,I5

T900

I1,I2,I3

算法的步骤图:

算法的代码实现如下:

package com.gdut.mahao;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

public class Apriori {

	private final static int SUPPORT = 2; // 支持度阈值
	private final static double CONFIDENCE = 0.7; // 置信度阈值

	private final static String ITEM_SPLIT = ","; // 项之间的分隔符
	private final static String CON = "-->"; // 项之间的分隔符

	private final static List<String> transList = new ArrayList<String>(); // 所有交易

	static {// 初始化交易记录,在apriori算法中,应保证项集中的项是有序的
		transList.add("1,2,5,");
		transList.add("2,4,");
		transList.add("2,3,");
		transList.add("1,2,4,");
		transList.add("1,3,");
		transList.add("2,3,");
		transList.add("1,3,");
		transList.add("1,2,3,5,");
		transList.add("1,2,3,");
	}

	public Map<String, Integer> getFC() {
		Map<String, Integer> frequentCollectionMap = new HashMap<String, Integer>();// 所有的频繁集

		frequentCollectionMap.putAll(getItem1FC());

		Map<String, Integer> itemkFcMap = new HashMap<String, Integer>();
		itemkFcMap.putAll(getItem1FC());
		while (itemkFcMap != null && itemkFcMap.size() != 0) {
			Map<String, Integer> candidateCollection = getCandidateCollection(itemkFcMap);
			Set<String> ccKeySet = candidateCollection.keySet();
			// 对候选集项进行累加计数
			for (String trans : transList) {
				for (String candidate : ccKeySet) {
					boolean flag = true;// 用来判断交易中是否出现该候选项,如果出现,计数加1
					String[] candidateItems = candidate.split(ITEM_SPLIT);
					for (String candidateItem : candidateItems) {
						if (trans.indexOf(candidateItem + ITEM_SPLIT) == -1) {
							flag = false;
							break;
						}
					}
					if (flag) {
						Integer count = candidateCollection.get(candidate);
						candidateCollection.put(candidate, count + 1);
					}
				}
			}

			// 从候选集中找到符合支持度的频繁集项
			itemkFcMap.clear();
			for (String candidate : ccKeySet) {
				Integer count = candidateCollection.get(candidate);
				if (count >= SUPPORT) {
					itemkFcMap.put(candidate, count);
				}
			}
			// 合并所有频繁集
			frequentCollectionMap.putAll(itemkFcMap);
		}
		return frequentCollectionMap;
	}

	private Map<String, Integer> getCandidateCollection(
			Map<String, Integer> itemkFcMap) {
		Map<String, Integer> candidateCollection = new HashMap<String, Integer>();
		Set<String> itemkSet1 = itemkFcMap.keySet();
		Set<String> itemkSet2 = itemkFcMap.keySet();

		for (String itemk1 : itemkSet1) {
			for (String itemk2 : itemkSet2) {
				// 进行连接
				String[] tmp1 = itemk1.split(ITEM_SPLIT);
				String[] tmp2 = itemk2.split(ITEM_SPLIT);

				String c = "";
				if (tmp1.length == 1) {//itemkFcMap存放的是候选1项集集合时
					if (tmp1[0].compareTo(tmp2[0]) < 0) {
						c = tmp1[0] + ITEM_SPLIT + tmp2[0] + ITEM_SPLIT;
					}
				} else {
					boolean flag = true;//是否可以进行连接
					for (int i = 0; i < tmp1.length - 1; i++) {
						if (!tmp1[i].equals(tmp2[i])) {
							flag = false;
							break;
						}
					}
					if (flag && (tmp1[tmp1.length - 1].compareTo(tmp2[tmp2.length - 1]) < 0)) {
						c = itemk1 + tmp2[tmp2.length - 1] + ITEM_SPLIT;
					}
				}
				// 进行剪枝
				boolean hasInfrequentSubSet = false;/
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Apriori算法的java实现,apriori算法java

相关文章

  • OutOfMemoryError PermGen space 的解决办法(头痛了几天),permgenspace
  • 说说hadoop,hadoop
  • 解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错,myeclipsedebug
  • Zookeeper 在Hadoop中的应用,zookeeperhadoop
  • 超级权限容器,权限容器
  • [Sqoop]利用sqoop对mysql执行DML操作,sqoopdml
  • Flocker浅析与Docker插件(3),flockerdocker
  • Spark编程指南V1.4.0(翻译),编程指南v1.4.0
  • 基于反射实现自动化restful开发,自动化restful开发
  • Hbase shell操作(完整版记录),hbaseshell

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • UCB CS162: Get sarted, create a docker container for UCB CS162 online course,ucbcs162
    • 配置KVM虚拟机的网络,Bridge和Nat方式,kvmnat
    • libvirt网络过滤规则:禁止客户机(bridge方式)连接外网,libvirtbridge
    • kerberos下HBase访问Zookeeper的ACL问题,hbasezookeeper
    • Hadoop Spark 集群简便安装总结,hadoopspark集群
    • openstack安装经验总结,openstack经验总结
    • 关于Oozie的input-events和done-flag,oozieinput-events
    • HDFS概念详解---名称节点与数据节点,hdfs节点
    • Java 调用Hive 自定义UDF,java调用hiveudf
    • 数学定理证明机械化的中国学派(I),机械化学派

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有