java实现数据挖掘_数据挖掘Apriori算法的java实现
关于Apriori算法而言,该算法主要用作挖掘频繁项集并发现关联规则的技术,在多个研究领域中被广泛应用。
它的算法思想是:
1先找到所有的小频繁项集,
2然后做连接步骤,将小频繁项集拼接作为候选集,
3然后对候选集做剪枝步骤。
4将候选集中支持度小于最小支持度的项删除。
5循环上述步骤,直到找到所有最大项集。
这个算法的核心是运用了频繁项集的反单调性。即先验性质
频繁项集的所有非空子集都是频繁的
基于此方法的思想基础之上
为了更好地实现目标, 我打算采用文件形式作为数据输入. 由于需要处理的数据量非常庞大, 因此选择这种方式更为合适.
1.对于文件格式,以行为单位输入,每行表示一个事务集。
2.对于数据在java中存储结构我使用Map来进行存储的。
通过代码能够呈现程序的具体运行流程;算法在运行过程中能够生成各个阶段的关键数据记录;最终能够提取出频繁访问的项目集合。
数据集中仅限于处理单个字符的项,在程序中无法直接处理字符串。读者可以通过将这些字段转换为能够存储多个字符的形式来解决这个问题。
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){
