数据挖掘--apriori算法实现

来源:互联网 发布:2017数据库系统工程师 编辑:程序博客网 时间:2024/05/02 02:48
<pre name="code" class="java">import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;public class Apriori {public int find(List<String> list,String str){ //函数作用:查找str,在list出现的次数,其中str中的所有元素均出现在list.get(i)字符串中,才记作一次String[] str_content=str.split(" ");int count=0;String tmp="";        Iterator<String> It = list.iterator();          while(It.hasNext()){        tmp=It.next();        String[] tmp_content=tmp.split(" ");        for(int i=0;i<str_content.length;i++){        int find_str_content_i=0;        for(int j=0;j<tmp_content.length;j++){        if(tmp_content[j].equals(str_content[i])){        find_str_content_i=1;        break;        }        }        if(find_str_content_i!=1){        break;        }        if(i==(str_content.length-1))            {count +=1;}        }        }return count;}public Set<String> Connect(Set<String> set){ //函数作用:连接步,把输入的集合set中两两元素,如果具有 size-1项相同就才连接,生成一个size+1长度的新元素,加入输出的集合中Set<String> set0=new HashSet<String>();String[] set_content=new String[set.size()];        Iterator<String> It = set.iterator();          int i=0;        while(It.hasNext())        {set_content[i]=It.next();        //System.out.println(set_content[i]);        i=i+1;}        for(int j=0;j<(set.size()-1);j++){        for(int k=j+1;k<set.size();k++){        if(Cmp_str(set_content[j],set_content[k])!=null){        set0.add(Cmp_str(set_content[j],set_content[k]));        }        }        }        return set0;    }    private String Cmp_str(String str1, String str2) {//函数作用:判断str1与str2中是否有size-1项相同,是则连接为size+1的字符串,否则输出空值null    String return_str=null;String[] str1_content=str1.split(" ");String[] str2_content=str2.split(" ");Set<String> set=new HashSet<String>();for(int i=0;i<str1_content.length;i++){set.add(str1_content[i]);set.add(str2_content[i]);}if(set.size()==(str2_content.length+1)){  return_str="";         Iterator<String> It = set.iterator();           while(It.hasNext())         {            return_str=return_str+" "+It.next();        }         return_str=return_str.trim();}return return_str;}public Set<String> Prune(Set<String> set,int min_sup,List<String> list){ //函数作用:扫描list,将set中的元素,计数大于min_sup的元素,才添加到输出集合set0中    Set<String> set0=new HashSet<String>();        Iterator<String> It = set.iterator();        while(It.hasNext())          { String tmp=It.next();        if(find(list,tmp)>=min_sup){        set0.add(tmp);        }        }        return set0;    }public static void main(String[] args) throws IOException {int min_sup=2;BufferedReader br=new BufferedReader(new FileReader("F:/数据挖掘--算法实现/apriori算法/input.txt"));          String line="";        List<String> list=new ArrayList<String>();         Set<String> set=new HashSet<String>();        while((line=br.readLine())!=null){        list.add(line);        String[] content=line.split(" ");        for(int i=0;i<content.length;i++){        set.add(content[i]);        }        }        FileWriter fw=new FileWriter("F:/数据挖掘--算法实现/apriori算法/output.txt",true);                   Apriori a=new Apriori();        while(!set.isEmpty())        {         set=a.Prune(set,min_sup,list);         Iterator<String> It = set.iterator();           while(It.hasNext())         {            String tmp=It.next();         fw.write(tmp+" "+String.valueOf(a.find(list,tmp))+"\r\n");        }         set=a.Connect(set);                  //Iterator<String> It0 = set.iterator();while(It0.hasNext()){System.out.println(It0.next());}        }        fw.close();}}



输入:
I1 I2 I5I2 I4I2 I3I1 I2 I4I1 I3I2 I3I1 I3I1 I2 I3 I5I1 I2 I3
</pre><pre name="code" class="java">输出:
I1 6I2 7I3 6I4 2I5 2I2 I5 2I1 I3 4I2 I4 2I1 I2 4I2 I3 4I1 I5 2I1 I2 I5 2I1 I2 I3 2


0 0
原创粉丝点击