java apriori是什么,让我们一起了解一下?
Apriori算法是第一个关联规则挖掘算法,它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。
Apriori算法的描述如下:
(1)扫描全部数据,产生候选1-项集的集合C1。
(2)根据最小支持度,由候选1-项集的集合C1产生频繁1-项集的集合L1。
(3)对k>1,重复执行步骤(4)、(5)、(6)。
(4)由Lk执行连接和剪枝操作,产生候选(k+l)-项集的集合Ck+1。
(5)根据最小支持度,由候选(k+l)-项集的集合Ck+1,产生频繁(k+1)-项集的集合Lk+1。
(6)若L≠Φ,则k=k+1,跳往步骤(4);否则,跳往步骤(7)。
(7)根据最小置信度,由频繁项集产生强关联规则,结束。
Apriori算法如何让JAVA实现?
项集用HashMap
package datamining;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Apriori {
//剪枝函数
public ArrayList> apriori_gen(HashMap, Integer> L_last, int last_index){
ArrayList> result = new ArrayList>(); //存储剪枝后的结果
ArrayList> item_set = null;
item_set = get_item_set(L_last); //获取上一个频繁项的所有项集,并转为字符串List
for(int i = 0; i < item_set.size() - 1; i++) {
ArrayList str = item_set.get(i);
for(int j = i + 1; j < item_set.size(); j++) {
Set new_item = new HashSet(); //存储新的候选项集
ArrayList str2 = item_set.get(j);
int length = str.size();
for(int k = 0; k < length - 1; k++) { //进行join操作
if(!str.get(k).equals(str2.get(k)))
break;
else
new_item.add(str.get(k));
}
new_item.add(str.get(str.size()-1));
new_item.add(str2.get(str2.size()-1));
if(new_item.size() == length + 1 && has_infrequent_subset(new_item, item_set, last_index)) //判断新的候选项集是否满足所有K-1项子集要求
result.add(new_item); //满足则加入结果集
}
}
return result;
}
//判断新的item的所有K-1项子集是否在上一个频繁项中都出现
public boolean has_infrequent_subset(Set candidate, ArrayList> last_item_set, int last_index) {
boolean flag = true;
ArrayList> sub_set = get_subset(candidate, last_index);
//for(int j = 0; j < sub_set.size(); j++) {
//System.out.println(sub_set.get(j));
//}
for(int i = 0; i < sub_set.size(); i++) {
ArrayList item = sub_set.get(i);
int j = 0;
for(j = 0; j < last_item_set.size(); j++) {
if(last_item_set.get(j).equals(item))
break;
}
if( j == last_item_set.size()) flag = false;
}
return flag;
}
//获取候选项集的K-1项所有子集
public ArrayList> get_subset(Set candidate, int index){
ArrayList> sub_set = new ArrayList>();
ArrayList item_set = new ArrayList();
Iterator iter = candidate.iterator();
while(iter.hasNext())
item_set.add((String)iter.next());
if(index == 1) { //当index等于1时单独考虑
for(int k = 0; k < item_set.size(); k++) {
ArrayList buffer = new ArrayList();
buffer.add(item_set.get(k));
sub_set.add(buffer);
}
}else {
for(int i = 0; i < item_set.size() - index + 1; i++) {
for(int j = i + 1; j < item_set.size(); j++) {
ArrayList buffer = new ArrayList();
buffer.add(item_set.get(i));
for(int k = 0; k < index - 1; k++) { //关键步骤,循环index-1次
if((k + j) < item_set.size())
buffer.add(item_set.get(k+j));
}
if(buffer.size() == index)
sub_set.add(buffer);
}
}
}
return sub_set;
}
//获取上一个频繁项的所有项集并转为List方便处理
public ArrayList> get_item_set(HashMap, Integer> L_last){
ArrayList> result = new ArrayList>();
Iterator iter = L_last.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Set set = (Set)entry.getKey();
Iterator iter2 = set.iterator();
ArrayList item = new ArrayList();
while(iter2.hasNext()) {
String str = (String)iter2.next();
item.add(str);
}
result.add(item);
}
return result;
}
//处理原始事物数据
public HashMap, Integer> process_rawdata(ArrayList> raw_input, int min_sub){
HashMap, Integer> first_input = new HashMap, Integer>(); //存储处理后结果
//处理原始输入事物数据,统计每个单独事物的次数
for(int i = 0; i < raw_input.size(); i++) {
Set item = raw_input.get(i);
Iterator iter = item.iterator();
while(iter.hasNext()) {
String str = (String)iter.next();
Set single_item = new HashSet();
single_item.add(str);
if(first_input.containsKey(single_item)) {
int count = first_input.get(single_item);
first_input.put(single_item, count+1);
}else
first_input.put(single_item, 1);
}
}
//移除单独事物出现次数少于min_sub的事物
for (Iterator, Integer>> iter = first_input.entrySet().iterator(); iter.hasNext();){
Map.Entry, Integer> entry = iter.next();
Object key = entry.getKey();
int val = (int)entry.getValue();
if(val < min_sub){
iter.remove();
}
}
return first_input;
}
//计数函数,记录每个候选项集在事物数据中出现的次数
public int count_item(Set item, ArrayList> raw_input) {
int count = 0;
Set item2 = new HashSet<>(item);
for(int i = 0; i < raw_input.size(); i++){
Set item_set = new HashSet(raw_input.get(i));
item_set.retainAll(item2);
if(item_set.size() == item2.size())
count++;
}
return count;
}
//算法主函数
public List, Integer>> apriori_main(ArrayList> raw_input, int min_sub){
int last_index = 1;
List, Integer>> results = new ArrayList, Integer>>(); //存储最终结果
HashMap, Integer> first_input = process_rawdata(raw_input, min_sub); //获取第一个频繁项集
ArrayList> candidates = apriori_gen(first_input, last_index); //获取第二个候选项集
while(!(candidates.size() == 0)) { //循环终止条件,无法选出下一个候选集合为止
HashMap, Integer> result = new HashMap, Integer>();
for(int i = 0; i < candidates.size(); i++) {
int count = count_item(candidates.get(i), raw_input); //计算每个候选项集在原始事物数据中出现次数
if(count >= min_sub)
result.put(candidates.get(i), count); //将满足结果的加入结果集中
}
if(result.size() > 0)
results.add(result);
last_index++; //索引加1
candidates = apriori_gen(result, last_index); //计算下一个候选项集合
}
return results;
}
public static void main(String args[]) throws IOException {
ArrayList> raw_data = new ArrayList>(); //存储原始数据
File file = new File(".\\data\\apriori.txt"); //获取外部原始事物数据
BufferedReader reader = new BufferedReader(new FileReader(file));
String string = "";
while((string = reader.readLine())!=null){
Set item = new HashSet();
String[] items = string.split(",");
for(int i = 0; i < items.length; i++)
item.add(items[i]);
raw_data.add(item);
}
Apriori apriori = new Apriori();
List, Integer>> result = apriori.apriori_main(raw_data, 2); //定义min_sub为2
System.out.println(result.get(result.size()-1)); //输出最后结果
}
} 以上就是小编今天的分享了,希望可以帮助到大家。