加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

序列模式挖掘算法BIDE

发布时间:2020-12-14 02:16:52 所属栏目:大数据 来源:网络整理
导读:import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class BIDE {
	public List<List<String>> db=new ArrayList<List<String>>();
	public List<Double> sup=new ArrayList<Double>();
	public int mm;
	public void init(){
		try {
			FileInputStream in=new FileInputStream("E:/in中文.txt");
			InputStreamReader fr=new InputStreamReader(in,"utf-8");
			BufferedReader br=new BufferedReader(fr);
			String line=null;
			List<String> tmp=null;
			int count=0;
			String pline=null;
			while((line=br.readLine())!=null){
				line=line.trim();
				System.out.println(line);
			
				if(line.contains("星期")){
					count++;
					if(count==9)
						break;
					 tmp=new ArrayList<String>();
					 db.add(tmp);
					 pline=null;
					 continue;
				}
				if(line.matches("[u4e00-u9fa5]*")){
					continue;
				}
				else {
					if(line!=pline)
					tmp.add(line);
					pline=line;
				System.out.println(line);	
				}
			}
		mm=(int)(count*0.8);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
public static void main(String[] args){
	BIDE d=new BIDE();
	d.init();
	d.test();
Date st=new Date();
	List<List<String>> ans=d.Bide(d.db,d.mm);
	Date end=new Date();
	String pname=null;
	for(int k=0;k<ans.size();k++){
		List<String> s=ans.get(k);
		pname=null;
		for(int i=0;i<s.size();i++){
			String name=s.get(i);
			System.out.print(name+" ");
			pname=name;
			}
		System.out.print(d.sup.get(k));
		System.out.println("");
	}
	System.out.println("时间:"+(end.getTime()-st.getTime()));
}
public List<List<String>> Bide(List<List<String>> sdb,int min_sup){
	
	List<List<String>> fcs =new ArrayList<List<String>>();
	Map<String,Integer> map=getFrequent_1_sequence(min_sup,sdb);
	List<String> F1=new ArrayList<String>();
	for(String s : map.keySet()){
		if(map.get(s)>=min_sup){
			F1.add(s);
		}
	}
	for(String f1 : F1){
		List<Integer> f1db=get_1_sdb(f1,sdb);
System.out.println(f1);
	List<String> pp=new ArrayList<String>();
	pp.add(f1);
	if(!backScan(pp,db)){
		int BEI=getBEI(db,pp);
		dfs(f1db,pp,BEI,min_sup,fcs,map.get(f1));
	}
	}
	return fcs;
}
//dfs-extension
public void dfs(List<Integer> pointer,List<String> prefix,int bei,int min_sup,List<List<String>> fcs,int min){
	System.out.println(">>"+prefix);
	Map<String,Integer> map=getLFI(pointer,min_sup);
	List<String> LFI=new ArrayList<String>();
	for(String s : map.keySet()){
		if(map.get(s)>=min_sup){
			LFI.add(s);
		}
	}
	int size=0;
	for(int i=0;i<pointer.size();i++){
		if(pointer.get(i)<db.get(i).size())
size++;
	}
	int FEI=getFEI(pointer,LFI,size);
	if(bei+FEI==0){
		fcs.add(prefix);
		sup.add(min*1.0/db.size());
	}

	for(String name : LFI){
		List<String> newPrefix=new ArrayList<String>();
		newPrefix.addAll(prefix);
		
		newPrefix.add(name);
		List<Integer> newpdb=getNewPdb(pointer,name);
		
		if(!backScan(newPrefix,db)){
			int BEI=getBEI(db,newPrefix);
			dfs(newpdb,newPrefix,map.get(name)>min?min:map.get(name));
		}
	}
}
//new_pdb
public List<Integer> getNewPdb(List<Integer> pointer,String name){
	List<Integer> result=new ArrayList<Integer>();
	result.addAll(pointer);
	for(int i=0;i<db.size();i++){
		List<String> ll=db.get(i);
		int flag=0;
		for(int j=pointer.get(i);j<ll.size();j++){
			if(ll.get(j).equals(name)){
				result.set(i,j+1);
				flag=1;
			break;
			}
		}
		if(flag==0)
			result.set(i,ll.size()+1);
	}
	return result;	
}
//forward -extension count
public int getFEI(List<Integer> pointer,List<String> lfi,int size){
	int count=0;
	Map<String,Integer> map=new HashMap<String,Integer>();
	Map<String,Integer> tmap=new HashMap<String,Integer>();
	String name=null;
	for(int i=0;i<db.size();i++){
		tmap.clear();
		List<String> ll=db.get(i);
		for(int j=pointer.get(i);j<ll.size();j++){
			name=ll.get(j);
			if(tmap.get(name)==null){
				map.put(name,map.get(name)==null?1:map.get(name)+1);
				tmap.put(name,1);
			}
		}
	}
	for(String name1 : map.keySet()){
		if(map.get(name1).equals(size))
			count++;
	}
	return count;
}
//local-frequent-items
public Map<String,Integer> getLFI(List<Integer> pointer,int min_sup){
	Map<String,Integer>();
	List<String> result=new ArrayList<String>();
	String name=null;
	for(int i=0;i<db.size();i++){
		tmap.clear();
		List<String> ll=db.get(i);
		for(int j=pointer.get(i);j<ll.size();j++){
			name=ll.get(j);
			if(tmap.get(name)==null){
				map.put(name,1);
			}
		}
	}
	return map;
}
//Backward-extention event count
public int getBEI(List<List<String>> sdb,List<String> prefix){
	int count=0;
	List<List<String>> result=new ArrayList<List<String>>();
	for(int i=1;i<=prefix.size();i++){
		result.clear();
		int flag=0;
		for(List<String> list : sdb){
			List<String> tmp=getmp(list,prefix,i);
			if(tmp==null){
				flag=1;
				break;
			}
			result.add(tmp);
		}
		Map<String,Integer>();
			Map<String,Integer>();
			System.out.println("flag:"+flag);
		if(flag==0){
			for(List<String> ll : result){
				tmap.clear();
				for(String name : ll){
					if(tmap.get(name)==null){
						map.put(name,map.get(name)==null?1:map.get(name)+1);
						tmap.put(name,1);
					}
				}
			}
			for(String s : map.keySet()){
				if(map.get(s).equals(sdb.size())){
					count++;
			
				}
				break;
			}
		}
	
	}
	return count;
}
//last_in_last
public int getLIL(List<String> list,int index){
	int i=0,j=0;
	int ll=-1;
	while(i<list.size()&&j<prefix.size()){
		if(list.get(i).equals(prefix.get(j))&&j<prefix.size()-1){
			i++;j++;
		}else if(list.get(i).equals(prefix.get(j))){
			i++;ll=i;
		}else
			i++;	
	}
	if(ll==-1)
		return -1;
	int ans=0;
	for(int k=0;k<ll;k++)
	if(prefix.get(index-1).equals(list.get(k))&&index-1<prefix.size()-1){
		for(int r=k+1;r<ll;r++){
			if(list.get(r).equals(prefix.get(index))){
				ans=k;
				break;
			}
		}
		
	}
		else if(prefix.get(index-1).equals(list.get(k)))
			ans=k;
	return ans;
	}
//test
public void test(){
	List<String> list=new ArrayList<String>();
	list.add("0");
	list.add("1");
	list.add("2");
	list.add("3");
	List<String> p=new ArrayList<String>();
	p.add("1");
	int end=getLIF(list,p,1);
	List<String> s=getsemi(list,1);
	System.out.println(s);
	System.out.println(end);
}
//i-th maximum period of a prefix
public List<String> getmp(List<String> list,int index){
	if(index==1){
		int end=getLIL(list,1);
		if(end==-1||end==0)
			return null;
		else
			return list.subList(0,end); 
	}
	else{
		int i=0,j=0;
		while(i<list.size()&&j<index-1){
			if(list.get(i).equals(prefix.get(j))){
				i++;j++;
			}else
				i++;
		}
		if(j!=index-1)
			return null;
		int end=getLIL(list,index);
		int start=i-1;
		if(end>start)
			return list.subList(start+1,end);
		else
			return null;
	}
}
//space prune
public boolean backScan(List<String> prefix,List<List<String>> f1db){
boolean ans=false;
List<List<String>> result=new ArrayList<List<String>>();
	for(int i=1;i<=prefix.size();i++){
		result.clear();
		int flag=0;
		for(List<String> list : f1db){
			List<String> tmp=getsemi(list,i);
			if(tmp==null){
				
				flag=1;
				break;
			}
		result.add(tmp);	
		}
		if(flag==0){
			
			Map<String,Integer>();
			for(List<String> ll : result){
				tmap.clear();
				for(String name : ll){
					if(tmap.get(name)==null){
						tmap.put(name,1);
						map.put(name,map.get(name)==null?1:map.get(name)+1);
					}
				}
			}
			Set<String> set=map.keySet();
			for(String s : set){
				if(map.get(s).equals(result.size())){
					return true;
					}
			}
		}
	}
	return false;
} 
// last-in-first
public int getLIF(List<String> list,int index){
	
	int i=0,j=0;
	while(i<list.size()&&j<prefix.size()){
		if(list.get(i).equals(prefix.get(j))){
			i++;j++;
		}else
			i++;
		
	}
	
	if(j!=prefix.size())
		return -1;
	int ans=0;

for(int k=0;k<i;k++){
	if(list.get(k).equals(prefix.get(index-1))&&index-1!=j-1){
		for(int r=k+1;r<i;r++)
			if(list.get(r).equals(prefix.get(index))){
				ans=k;
				break;
			}
	}
	else if(list.get(k).equals(prefix.get(index-1)))
		ans=k;
		
}
return ans;
}
//i-th semi-maximum period of a prefix sequence
public List<String> getsemi(List<String> list,int index){
	if(index==1){
		int end=getLIF(list,1);
		
		if(end>0){
			return list.subList(0,end);
		}
		else
			return null;
	}
	else{
	int i=0,j=0;
	while(i<list.size()&&j<index-1){
		if(list.get(i).equals(prefix.get(j))){
			i++;j++;
		}else{
			i++;
		}
	}
	if(j!=index-1)
		return null;
	int start=i-1;
	int end=getLIF(list,index);
if(end>start)
	return list.subList(start+1,end);
return null;}
}
public List<Integer> get_1_sdb(String prefix,List<List<String>> sdb){
	List<Integer> result=new ArrayList<Integer>();
	for(int i=0;i<db.size();i++)
		result.add(0);
	for(int i=0;i<sdb.size();i++){
		List<String> ll=sdb.get(i);
		int flag=0;
		for(int j=0;j<ll.size();j++){
			if(ll.get(j).equals(prefix)){
				result.set(i,ll.size()+1);
	}
	return result;
}
public Map<String,Integer> getFrequent_1_sequence(int min,List<List<String>> sdb){
	Map<String,Integer>();
	for(List<String> list : sdb){
		tmap.clear();
		for(String name : list){
			if(tmap.get(name)==null){
				tmap.put(name,1);
				map.put(name,map.get(name)==null?1:map.get(name)+1);
			}
		}
	}
	return map;
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读