package gsp;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/**
* <title>GSP算法实现类</title>
* 本类为核心类,在本类中实现了GSP算法
* @author guangqingzhong
*
*/
public class GSP {
private ArrayList<Sequence> c; //长度为i的候选序列模式
private ArrayList<Sequence> l; //长度为i的序列模式
private ArrayList<Sequence> result;
private SeqDB db;
private int support;
/**
* 构造方法
* 在实例化GSP对象时,同时赋值支持度
* 并获取序列集和初始化序列模式结果
* @param support 支持度
*/
public GSP(int support) {
this.support = support; //赋值支持度
this.db = new SeqDB(); //从SeqDB类中获取设置好的序列集
this.result = new ArrayList<Sequence>(); //初始化序列模式结果对象
}
/**
* 产生序列模式
* 核心方法,在该方法中调用连接和剪枝操作,并将最后获得的序列模式放到result中
* @return 序列模式
*/
public ArrayList getSequences() {
long start = System.currentTimeMillis();
//调用初始化方法
initialize();
System.out.println("序列模式L(1) 为:" +l);
System.out.println(".................................................");
for (int i = 0; i < l.size(); i++) {
//产生进行连接操作后的候选集
genCandidate();
if (!(c.size() > 0)) {
break;
}
System.out.println("剪枝前候选集的大小为:"+c.size()+" 候选集c为:"+c);
// System.out.println(c);
//进行剪枝操作
pruneC();
System.out.println("剪枝后候选集的大小为:"+c.size()+" 候选集c为:"+c);
//产生序列模式
generateL();
System.out.println("序列模式L(" + (i + 2) + ") 为:" +l);
addToResult(l);
System.out.println(".................................................");
}
long end = System.currentTimeMillis();
System.out.println("计算花费时间" + (end - start) + "毫秒!");
return this.result;
}
/*
* 初始化方法
* 获取设置好的序列集
*/
private void initializehw() {
this.l = new ArrayList<Sequence>();
Sequence s;
//<{123}>
s = new Sequence();
s.addElement(new Element(new int[] {1,2,3}));
l.add(s);
//<{12}3>
s = new Sequence();
s.addElement(new Element(new int[] {1,2}));
s.addElement(new Element(new int[] {3}));
l.add(s);
//<1{23}>
s = new Sequence();
s.addElement(new Element(new int[] {1}));
s.addElement(new Element(new int[] {2,3}));
l.add(s);
//<{12}4>
s = new Sequence();
s.addElement(new Element(new int[] {1,2}));
s.addElement(new Element(new int[] {4}));
l.add(s);
//<{13}4>
s = new Sequence();
s.addElement(new Element(new int[] {1,3}));
s.addElement(new Element(new int[] {4}));
l.add(s);
//<{124}>
s = new Sequence();
s.addElement(new Element(new int[] {1,2,4}));
l.add(s);
//<{23}3>
s = new Sequence();
s.addElement(new Element(new int[] {2,3}));
s.addElement(new Element(new int[] {3}));
l.add(s);
//<{23}4>
s = new Sequence();
s.addElement(new Element(new int[] {2,3}));
s.addElement(new Element(new int[] {4}));
l.add(s);
//<233>
s = new Sequence();
s.addElement(new Element(new int[] {2}));
s.addElement(new Element(new int[] {3}));
s.addElement(new Element(new int[] {3}));
l.add(s);
//<234>
s = new Sequence();
s.addElement(new Element(new int[] {2}));
s.addElement(new Element(new int[] {3}));
s.addElement(new Element(new int[] {4}));
l.add(s);
}
/*
* 初始化方法
* 获取设置好的序列集
*/
private void initialize() {
Map<Integer, Integer> can = new HashMap<Integer, Integer>();
//对于序列集中的所有序列
for (Sequence s : db.getSeqs()) {
//对于序列中的所有项目集
for (Element e : s.getElements()) {
//对于项目集中的所有项目
for (int i : e.getItems()) {
//比较项目的出现次数,并计数,用于与支持度比较
if (can.containsKey(i)) {
int count = can.get(i).intValue() + 1;
can.put(i, count);
} else {
can.put(i, 1);
}
}
}
}
this.l = new ArrayList<Sequence>();
//对于产生的候选集,如果支持度大于最小支持度阈值,则添加到序列模式L中
for (int i : can.keySet()) {
if (can.get(i).intValue() >= support) {
Element e = new Element(new int[] {i});
Sequence seq = new Sequence();
seq.addElement(e);
this.l.add(seq);
}
}
//将第一次频繁序列模式加入结果集中
this.addToResult(l);
}
/*
* 产生经过连接操作后的候选集
*
*/
private void genCandidate() {
this.c = new ArrayList<Sequence>();
//对于种子集L进行连接操作
for (int i = 0; i < this.l.size(); i++) {
for (int j = i; j < this.l.size(); j++) {
this.joinAndInsert(l.get(i), l.get(j));
if (i != j) {
this.joinAndInsert(l.get(j), l.get(i));
}
}
}
}
/*
* 对种子集进行连接操作
*/
private void joinAndInsert(Sequence s1, Sequence s2) {
Sequence s, st;
//去除第一个元素
Element ef = s1.getElement(0).getWithoutFistItem();
//去除最后一个元素
Element ee = s2.getElement(s2.size() - 1).getWithoutLastItem();
int i = 0, j = 0;
if (ef.size() == 0) {
i++;
}
for (; i < s1.size() && j < s2.size(); i++, j++) {
Element e1, e2;
if (i == 0) {
e1 = ef;
} else {
e1 = s1.getElement(i);
}
if (j == s2.size() - 1) {
e2 = ee;
} else {
e2 = s2.getElement(j);
}
if (!e1.equalsTo(e2)) {
return;
}
} //end of for
s = new Sequence(s1);
//将s2的最后一个元素添加到s中
(s.getElement(s.size() - 1)).addItem(s2.getElement(s2.size() - 1).
getLastItem());
//如果候选集中没有s,则添加到候选集
if (s.notInSeqs(c)) {
c.add(s);
}
st = new Sequence(s1);
//将s2的最后一个元素添加到st中
st.addElement(new Element(new int[] {s2.getElement(s2.size() - 1).
getLastItem()}));
//如果候选集中没有st,则添加到候选集
if (st.notInSeqs(c)) {
c.add(st);
}
return;
}
/*
* 剪枝操作
* 看每个候选序列的连续子序列是不是频繁序列
* 采用逐个取元素,只去其中一个项目,然后看是不是有相应的频繁序列在l中。
* 如果元素只有一个项目,则去除该元素做相应判断。
*/
private void pruneC() {
Sequence s;
//对于序列中
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
序列模式分析算法GSP的实现 GSP是序列模式挖掘的一种算法。其主要描述如下: l 根据长度为i 的种子集Li 通过连接操作和剪切操作生成长度为i+1的候选序列模式Ci+1;然后扫描序列数据库,计算每个候选序列模式的支持数,产生长度为i+1的序列模式Li+1,并将Li+1作为新的种子集。 l 重复第二步,直到没有新的序列模式或新的候选序列模式产生为止。 l 扫描序列数据库,得到长度为1的序列模式L1,作为初始的种子集 L1Þ C2 Þ L2 Þ C3 Þ L3 Þ C4 Þ L4 Þ …… 产生候选序列模式主要分两步 l 连接阶段:如果去掉序列模式s1的第一个项目与去掉序列模式s2的最后一个项目所得到的序列相同,则可以将s1于s2进行连接,即将s2的最后一个项目添加到s1中。 l 剪切阶段:若某候选序列模式的某个子序列不是序列模式,则此候选序列模式不可能是序列模式,将它从候选序列模式中删除。 候选序列模式的支持度计算:对于给定的候选序列模式集合C,扫描序列数据库,对于其中的每一条序列d,找出集合C中被d所包含的所有候选序列模式,并增加其支持度计数。
资源推荐
资源详情
资源评论






























收起资源包目录













共 11 条
- 1
资源评论


weixin_42653672
- 粉丝: 121
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 继电器在电气工程及自动化低压电器中的应用.docx
- 典型网络工程的案例分析.doc
- 全国计算机等考试二C笔试试卷.doc
- 大学计算机实验报告记录样本.doc
- 科大讯飞人工智能定义城市1.0版本发布.docx
- 软件学院软件工程硕士版培养方案终稿单证.doc
- 基于单片机的数字万用表研究设计.doc
- 集团公司大数据平台建设方案.docx
- 南京大学关于机器学习的 PPT 教学课件
- 热电厂建设项目管理控制研究.docx
- 项目管理的难点与对策.doc
- Oracle程序设计.docx
- 不依赖 sk-learn 库的纯 Python 机器学习算法实现
- 基于单片机的抢答器的方案设计书.doc
- 试论大数据环境下的企业财务管理改革路径.docx
- 初中英语教师基于网络平台的自主发展.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
