bom展开算法 java程序实现_java实现aprior算法
/**
* 频繁项集
*/
public class FrequentNode {
//包含哪些项
private String[] subjects;
//几项集
private int k;
//支持度计数
private int count = 0;
public FrequentNode(String subject,int count){
this.subjects = new String[]{subject};
this.k = 1;
this.count = count;
}
public FrequentNode(String[] subjects){
this.subjects = subjects;
this.k = subjects.length;
Arrays.sort(this.subjects);//排序,方便生成k+1
}
/**
* 生成k+1项集
* @param node
* @return
*/
public FrequentNode merge(FrequentNode node){
if(k==1){
if(this.subjects[0].compareTo(node.subjects[0])
return new FrequentNode(new String[]{subjects[0],node.subjects[0]});
}else{
return new FrequentNode(new String[]{node.subjects[0],subjects[0]});
}
}
//前k-1项相同才连接
for(int i=0;i
if(!StringUtils.equals(this.subjects[i],node.subjects[i])){
return null;
}
}
//最后一项不同才连接
if(StringUtils.equals(this.subjects[this.k-1], node.subjects[this.k-1])){
return null;
}
String[] newFre = new String[this.k+1];
System.arraycopy(this.subjects, 0, newFre, 0, this.k-1);
if(this.subjects[k-1].compareTo(node.subjects[k-1])
newFre[k-1] = subjects[k-1];
newFre[k] = node.subjects[k-1];
}else{
newFre[k-1] = node.subjects[k-1];
newFre[k] = subjects[k-1];
}
return new FrequentNode(newFre);
}
/**
* 给出自己的k-1子集
* @return
*/
public List getChildren(){
List list = new ArrayList();
if(k==2){
return list;
}
if(k==3){
list.add(new FrequentNode(new String[]{subjects[1],subjects[2]}));
}
for(int i=0;i
String[] child = new String[k-1];
System.arraycopy(subjects, 0, child, 0, i);
System.arraycopy(subjects, i+1, child, i, k-i-1);
list.add(new FrequentNode(child));
}
return list;
}
/**
* 扫描文件 如果找到 把计数+1
* @param line
* @return
*/
public void countIncrement(String[] line){
if(line.length
return ;
}
for(String subject:subjects){
boolean flag = false;
for(String str:line){
if(StringUtils.equals(str, subject)){
flag = true;
break;
}
}
if(!flag){
return;
}
}
this.count = this.count + 1;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
/**
* 两个频繁模式是否相同,我只看有哪些物品。计数和大小不看
*/
@Override
public int hashCode() {
return Arrays.hashCode(subjects);
}
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(obj instanceof FrequentNode){
return Arrays.equals(this.subjects, ((FrequentNode)obj).subjects);
}
return false;
}
@Override
public String toString() {
return StringUtils.join(subjects,",")+"\t"+count;
}
}
/**
* 简单实现aprior算法
*/
public class Aprior {
//最大的项集长度
private int maxLength = 0;
//支持度阈值
private int support = 3;
//总共多少购物篮
private int totalCount = 0;
//
private String filePath = "D:\\R\\aprior.txt";
public static void main(String[] args) {
Aprior a = new Aprior();
a.startMining();
}
private void startMining(){
//step1 遍历文件产生一项集,记录下支持度,并且统计最大项集长度
List freq = getFrequent1();
//printResult(freq);
//step2开始挖
while(freq.size() > 0){
//连接
List next = contact(freq);
//printResult(next);
//剪枝
prune(next,freq);
//输出结果
printResult(next);
freq = next;
}
}
/**
* 产生1项集
* @param filePath
* @return
*/
private List getFrequent1(){
Iterator ite;
try {
ite = FileUtils.lineIterator(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
return null;
}
Map map = new HashMap();
while(ite.hasNext()){
totalCount++;
String line = ite.next();
String[] subjects = line.split(",");
maxLength = Math.max(maxLength, subjects.length);
for(String subject:subjects){
Integer count = map.get(subject);
if(count == null){
map.put(subject,1);
}else{
map.put(subject, count +1);
}
}
}
List frequent1 = new ArrayList();
for(Entry entry:map.entrySet()){
if(entry.getValue() >= support){//去掉支持度不够的1项集
frequent1.add(new FrequentNode(entry.getKey(),entry.getValue()));
}
}
return frequent1;
}
/**
* 连接k-1 ,生成k项集,根据k-1剪枝.
* @param src
* @return
*/
private List contact(List src){
List next = new ArrayList();
for(int i=0;i
for(int j=i+1;j
FrequentNode newNode = src.get(i).merge(src.get(j));
if(newNode != null){
next.add(newNode);
}
}
}
return next;
}
private void prune(List next,List prev){
Iterator ite = next.iterator();
while(ite.hasNext()){
FrequentNode newNode = ite.next();
//扫描k-1看有没有,没有移除
boolean flag = false;
for(FrequentNode child:newNode.getChildren()){
if(!prev.contains(child)){
flag = true;
break;
}
}
if(flag){
ite.remove();
}
}
//扫描文件,看有没有
Iterator fileIte;
try {
fileIte = FileUtils.lineIterator(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
return;
}
while(fileIte.hasNext()){
String line = fileIte.next();
String[] subjects = line.split(",");
Iterator ite1 = next.iterator();
while(ite1.hasNext()){
FrequentNode newNode = ite1.next();
newNode.countIncrement(subjects);
}
}
Iterator ite2 = next.iterator();
while(ite2.hasNext()){
FrequentNode newNode = ite2.next();
if(newNode.getCount()
ite2.remove();
}
}
}
private void printResult(List list){
for(FrequentNode node:list){
System.out.println(node.toString());
}
}
}
输入文件:
牛奶,鸡蛋,面包,薯片
鸡蛋,爆米花,薯片,啤酒
鸡蛋,面包,薯片
牛奶,鸡蛋,面包,爆米花,薯片,啤酒
牛奶,面包,啤酒
鸡蛋,面包,啤酒
牛奶,面包,薯片
牛奶,鸡蛋,面包,黄油,薯片
牛奶,鸡蛋,黄油,薯片
输出:
牛奶,薯片 5
薯片,鸡蛋 6
薯片,面包 5
牛奶,鸡蛋 4
牛奶,面包 5
面包,鸡蛋 5
啤酒,鸡蛋 3
啤酒,面包 3
牛奶,薯片,鸡蛋 4
牛奶,薯片,面包 4
薯片,面包,鸡蛋 4
牛奶,面包,鸡蛋 3
牛奶,薯片,面包,鸡蛋 3
bom展开算法 java程序实现_java实现aprior算法相关推荐
- 外包3年,吃透这三份Java程序员必刷的算法宝典后,已从13K涨到25K
懂点算法,很有必要 "不学数据结构和算法,一辈子都是码畜".不管你是 Java 程序员.算法工程师.数据分析师,还是技术管理者.架构师...... 我们都有一个共同的目标,就是在技 ...
- java程序组成_java程序是由什么组成的
展开全部 1.源程序文32313133353236313431303231363533e78988e69d8331333363373732件的构成 要编写Java程序,首先应该知道Java程序文件中必 ...
- java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题
一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...
- 第一个java程序释义_Java 学习之路(1)第一个Java程序
Hello World程序 在编程语言的世界里,第一个编程语言估计就是输出Hello World了吧. /** * 编写第一个Java程序,输出Hello World! * @author LJS * ...
- java程序结构_Java 程序结构说明(学习 Java 编程语言 004)
1. 一个简单的类 创建 FirstSample.java 文件,来编写最简单的 Java 应用程序.下面是示例代码: public class FirstSample { public static ...
- java程序结构_java程序结构
java是一门面向对象的语言,在编程过程中当然离不开对象的声明,而对象又是通过类定义的,所以java中最重要的就是各式各样的类,在java中,类也是一个程序的基本单位 0x01:默认生成类 在ecli ...
- java程序员_Java程序员工资为什么这么高?
众多行业中, 程序员当然属于高薪职业.无论是国内还是国外,IT行业的程序员.工程师,甚至连码农都要比其他行业的从业者的收入高很多!尤其是作为IT界的"常青树"Java,原因是什么? ...
- java程序员_Java和Python的区别 好程序员帮大家解读
Java和Python的区别 好程序员今天先来解读Java编程语言的优势,人工智能和大数据火爆一时,随之而来,引起了编程语言的人气暴涨.而Java和Python作为最炙手可热的编程语言从一开始便赢得了 ...
- java程序初始化_Java程序初始化顺序
今天在课上复习了Java的初始化顺序,一直有点疑惑,搞不明白,所以打算写下来,记录一下. 先说一下Java程序初始化的顺序:父类静态变量>父类静态代码块>子类静态变量>子类静态代码块 ...
最新文章
- 云计算数据中心规划设计方案
- 后端数据操作超时_数据分析在知乎商业质量保障中的初步实践
- 在MAC系统的eclipse里打开android sdk manager
- 三种banner基础形态
- [HDU3037]Saving Beans,插板法+lucas定理
- python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间
- 新手学java 学哪方面_初学者学Java应从哪些方面学习?
- 零基础学习前端:学习路线、学习计划、实战项目和面试题简历分享。
- 浮点数 字符串 java_Java如何将浮点数转换为字符串
- WIN10平板 如何关闭自动更新
- (文末源码)差分进化(Differential Evolution,DE)
- 微信支付?一起观摩Safesound勒索病毒的骚操作
- php中in array函数_PHP函数in_array()使用详解
- 一个软件完整的开发流程,不会程序也能自己制作手机App
- Cmd命令检测电脑配置:
- 修行一定要在寺院里吗,出家人离开寺院修行,都属邪门外道吗?
- 开发工程师必备的一直网站
- 倍升工作效率的小策略
- 渗透测试工具篇——sqlmap
- Hadoop服务启动出现Permission denied (publickey,password)