对于Apriori算法,Apriori算法是一种挖掘关联规则的频繁项集算法,在很多领域中应用广泛。

它的算法思想是:

1先找到所有的小频繁项集,

2然后做连接步骤,将小频繁项集拼接作为候选集,

3然后对候选集做剪枝步骤。

4将候选集中支持度小于最小支持度的项删除。

5循环上述步骤,直到找到所有最大项集。

这个算法的核心是运用了频繁项集的反单调性。即先验性质

频繁项集的所有非空子集都是频繁的

利用上述思想,我准备用java来实现它,能够对给定的数据进行挖掘关联规则。

首先我准备使用文件来作为数据输入,因为对于要挖掘的数据集肯定是巨大的,利用文件输入才比较合适。

1.对于文件格式,以行为单位输入,每行表示一个事务集。

2.对于数据在java中存储结构我使用Map来进行存储的。

3.代码可以展示程序的步骤,输出算法每次进行的中间结果。最后得到频繁项集。

4.数据集中的项在程序中只能为单个字符,读者可以修改成处理字符串的项。

5.程序的复杂度可能存在很多改进的地方,对于大型数据集的处理还有待优化。

下面为具体代码实现:

package pack1;
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
public class apriori {
//字符串排序(冒泡实现)
public static String sort(String str){
char[]
list=str.toCharArray();
for (int i = 1; i <
str.length(); i++) {
for (int j =
i - 1; j > -1; j--) {
if
(list[j + 1] < list[j]) {
char
a = list[j + 1];
list[j
+ 1] = list[j];
list[j]
= a;
}
}
}
return new String(list);
}
//字符串去重方法
public static String fun(String str){
String[]
arr=str.split("");
StringBuilder sb= new
StringBuilder(); //这里要注意
for(int i=1;i
if(sb.indexOf(arr[i]) < 0){
sb.append(arr[i]);
}
}
return sb.toString();
}
//抽取出 求对于给定集的频繁度的方法
public static int pin(String s, List al){
int count=0;
for(int i=0;i
boolean b=true;
for(int k=0;k
b=b&&al.get(i).contains(""+s.charAt(k));
}
if(b)
count++;
}
return count;
}
public static void main(String[] args) throws
IOException{
// System.out.println(sort(fun("bcdsaffaklaslk")));
int min=3;
// 定义文件输入流
BufferedReader br=new
BufferedReader( new FileReader("G:\\aaa.txt"));
// 定义存储数据文件
File f=new
File("G:\\bbb.txt");
// 定义文件输输出流
// 定义map集合
HashMap hm=new
HashMap<>();
ArrayList al=new ArrayList<>();
List houl=new ArrayList<>();
// 按行读取文件,装入集合
String line;
while((line=br.readLine())!=null){
al.add(line);
String[]
arr=line.split(" ");
Set
key=hm.keySet();
for (int i =
0; i < arr.length; i++) {
if(key.contains(arr[i])){
int
value=hm.get(arr[i])+1;
hm.put(arr[i],
value);
}else{
hm.put(arr[i],1);
}
}
}
br.close(); while(houl.size()!=1){