一、设计目的
1.更深的了解关联规则挖掘的原理和算法。
2.能将数据挖掘知识与计算机编程相结合,编写出合理的程序。
3.深入了解Apriori算法。
二、设计要求
1.能设置支持度,置信度和挖掘深度。
2.能输入或导入待挖掘的相关记录。
3.程序无BUG,没有原理性错误。
三、设计实现流程图
四、实现环境
1.系统:Windows 7 sp1 X86
2.Netbeans 7.1.12
3.JDK 7.0
五、实现结果
1.界面:
2.输入待挖掘项目:
3.输入支持度,置信度和挖掘深度
4.进行分析
六、设计小结
通过这次的数据挖掘课程设计,
附录:主要代码
Apriori算法:
package apriori;
import java.util.*;
public class Apriori {
private double minSupport; //最小支持度
private double minConfidence; //最小置信度
private Map container; //交易数据容器
private int totalSize; //样品数据条数
private List canditateSetList = new ArrayList(); //候选集链表
private List frequentSetList = new ArrayList(); //频繁集链表
private List maxFrequentSetList = new ArrayList(); //最大频繁集
private int maxDeep = -1;
private int curDeep = 0;
private boolean isStop = false;
private Set elementSet = new TreeSet();
private List ruleList = new ArrayList();
//设置挖掘深度,如果为-1,表明直到不产生新的频繁集才停止挖掘
public void setDeep(int k) {
this.maxDeep = k;
}
private double getMinConfidence() {
return minConfidence;
}
public void setMinConfidence(double minConfidence) {
this.minConfidence = minConfidence;
}
private double getMinSupport() {
return minSupport;
}
public void setMinSupport(double minSupport) {
this.minSupport = minSupport;
}
private Map getContainer() {
return container;
}
public void setContainer(TransactionContainer transactionContainer) {
this.container = transactionContainer.getContainer();
this.totalSize = this.container.size();
System.out.println(",,,,,,,,,,,,,,,,,,,,,,,,,,,,");
System.out.println(totalSize);
}
private boolean isStop() {
return this.isStop || (maxDeep > 0 && curDeep == maxDeep);
}
private void stopAnalyse() {
this.isStop = true;
}
/**
* 根据最小支持度,最小自信度,样品数据 进行数据分析
*
*/
public void analyse() {
//计算候选集、频繁集
this.makeCanditateSet1();
this.makeFrequentSet1();
while (!isStop()) {
this.curDeep++; //深度+1
this.makeCanditateSet(); //创建候选集
this.makeFrequentSet(); //创建频繁集
}
//计算最大频繁集
this.makeMaxFrequentSet();
//计算规则
this.makeRules();
}
/**
* 创建规则
*
*/
private void makeRules() {
int ruleNum = 0;
for (Object form : this.maxFrequentSetList) {
TransactionForm tf = (TransactionForm) form;
ruleNum = (1 << tf.getItems().size()) - 2;
for (int i = 1; i <= ruleNum; i++) {
Rule rule = new Rule();
TransactionForm A = new TransactionForm();
TransactionForm B = new TransactionForm();
int j = 0;
Set items = tf.getItems();
for (Object object : items) {
String item = (String) object;
if (((1 << j) & i) != 0) {
A.addItem(item);
} else {
B.addItem(item);
}
j++;
}
TransactionForm AB = new TransactionForm();
AB.addAll(A.getItems());
AB.addAll(B.getItems());
if (getSupportNum(AB) >= (getSupportNum(A) * minConfidence)) {
double confidence = this.getSupportNum(AB) * 1.0 / this.getSupportNum(A);
rule.setA(A);
rule.setB(B);
rule.setConfidence(confidence);
this.ruleList.add(rule);
}
}
}
}
/**
* 计算1项候选集
*
*/
private void makeCanditateSet1() {
Set keySet = container.keySet();
Iterator keyIterator = keySet.iterator();
String TID;
TransactionForm transactionForm;
List list = new ArrayList(); //存放1项候选集
Set item1 = new TreeSet();
while (keyIterator.hasNext()) {
TID = (String) keyIterator.next();
transactionForm = (TransactionForm) (container.get(TID));
Set items = transactionForm.getItems();
for (Object object : items) {
item1.add(object);
}
}
elementSet.addAll(item1);
for (Object object : item1) {
TransactionForm tf = new TransactionForm();
tf.addItem(object);
list.add(tf);
}
this.canditateSetList.add(list);
this.curDeep = 1;
}
/**
* 计算k项候选集
*
*/
private void makeCanditateSet() {
//读取前一个频繁集
List frontFrequentSetList = (List) this.frequentSetList.get(this.curDeep - 2);
List newCanditateList = new ArrayList();
for (Object obj : frontFrequentSetList) {
TransactionForm tf = (TransactionForm) obj;
for (Object item : this.elementSet) {
Set items = new TreeSet();
items.addAll(tf.getItems());
items.add(item);
if (items.size() != this.curDeep) {
continue;
}
TransactionForm newTransactionForm = new TransactionForm();
newTransactionForm.setItems(items);
if (this.getSupportNum(newTransactionForm) != 0) {
if (!isExit(newCanditateList, newTransactionForm)) {
newCanditateList.add(newTransactionForm);
}
}
}
}
this.canditateSetList.add(newCanditateList);
}
/**
* 判断链表中是否存在相同的交易表单
*
*/
private boolean isExit(List list, TransactionForm newForm) {
for (Object form : list) {
Set curSet = ((TransactionForm) form).getItems();
Set newSet = newForm.getItems();
Set tempSet = new TreeSet();
tempSet.addAll(curSet);
int beginSize = tempSet.size();
tempSet.addAll(newSet);
int endSize = tempSet.size();
if (endSize <= beginSize) { //只要有一个集合没变大,说明已存在
return true;
}
}
return false;
}
/**
* 创建最大频繁集
*
*/
private void makeMaxFrequentSet() {
for (int i = frequentSetList.size() - 1; i >= 0; i--) {
List list = (List) frequentSetList.get(i);
for (Object form : list) {
if (!isExit(maxFrequentSetList, (TransactionForm) form)) {
this.maxFrequentSetList.add(form);
}
}
}
}
/**
* 创建频繁集
*
*/
private void makeFrequentSet() {
List frequentList = new ArrayList();
List canditateList = (List) this.canditateSetList.get(this.curDeep - 1);
for (Object form : canditateList) {
TransactionForm tf = (TransactionForm) form;
if (this.getSupportNum(tf) >= minSupport * totalSize) {
frequentList.add(tf);
}
}
this.frequentSetList.add(frequentList);
if (frequentList.size() == 0) {
this.stopAnalyse(); //如果没有新的频繁集,则可停止分析
}
}
/**
* 创建频繁1项集
*
*/
private void makeFrequentSet1() {
List canditateList = (List) canditateSetList.get(0);
List frequentList = new ArrayList();
for (Object object : canditateList) {
TransactionForm tf = (TransactionForm) object;
if (this.getSupportNum(tf) >= minSupport * totalSize) {
frequentList.add(tf);
}
}
this.frequentSetList.add(frequentList);
if (frequentList.size() == 0) {
this.stopAnalyse(); //如果没有新的频繁集,则可停止分析
}
}
/**
* 计算支持数 样品清单对newForm的支持数
*
*/
private int getSupportNum(TransactionForm newForm) {
int counter = 0;
Set keySet = container.keySet();
Iterator keyIterator = keySet.iterator();
String TID;
TransactionForm transactionForm;
while (keyIterator.hasNext()) { //该循环不可以跳出,一定要执行到结束
TID = (String) keyIterator.next();
transactionForm = (TransactionForm) container.get(TID); //样品中的某一清单
Iterator items = transactionForm.getItems().iterator();
Iterator newItems = newForm.getItems().iterator();
boolean isMatch = true;
while (newItems.hasNext()) { //配置新清单中的所有项
String newItem = (String) newItems.next();
boolean findItem = false;
while (items.hasNext()) {
String item = (String) items.next();
if (newItem.equals(item)) {
findItem = true;
break;
}
}
if (!findItem) {
isMatch = false;
break;
}
}
if (isMatch) {
counter++;
}
}
return counter;
}
/**
* 打印分析结果信息
*
*/
public String printInfo() {
System.out.println("***************************************************************************************************");
String info ="";
info+="*****************************************************\n";
for (int i = 0; i < this.curDeep; i++) {
List list = (List) this.canditateSetList.get(i);
if (list.size() == 0) {
continue;
}
System.out.print("候选集" + (i + 1) + ":");
info+="候选集" + (i + 1) + ":";
for (Object object : list) {
TransactionForm transactionForm = (TransactionForm) object;
Set items = transactionForm.getItems();
StringBuffer sb = new StringBuffer("[");
for (Object item : items) {
sb.append(item).append(",");
}
sb.setCharAt(sb.length() - 1, ']');
System.out.print(sb + " ");
info+=sb + " ";
}
list = (List) this.frequentSetList.get(i);
System.out.print("\n频繁集" + (i + 1) + ":");
info+="\n频繁集" + (i + 1) + ":";
for (Object object : list) {
TransactionForm transactionForm = (TransactionForm) object;
Set items = transactionForm.getItems();
StringBuffer sb = new StringBuffer("[");
for (Object item : items) {
sb.append(item).append(",");
}
sb.setCharAt(sb.length() - 1, ']');
System.out.print(sb + " ");
info+=sb + " ";
}
System.out.println("\n***************************************************************************************************");
info+="\n**********************************\n";
}
System.out.print("最大频繁集:");
info+="最大频繁集:";
for (Object object : this.maxFrequentSetList) {
TransactionForm transactionForm = (TransactionForm) object;
Set items = transactionForm.getItems();
StringBuffer sb = new StringBuffer("[");
for (Object item : items) {
sb.append(item).append(",");
}
sb.setCharAt(sb.length() - 1, ']');
System.out.print(sb + " ");
info+=sb + " ";
}
System.out.println("\n***************************************************************************************************");
info+="\n*********************************************************************";
System.out.println("关联规则:");
info+="\n关联规则:\n";
for (Object object : this.ruleList) {
Rule rule = (Rule) object;
Set items = rule.getA().getItems();
StringBuffer A = new StringBuffer("[");
for (Object item : items) {
A.append(item).append(",");
}
A.setCharAt(A.length() - 1, ']');
items = rule.getB().getItems();
StringBuffer B = new StringBuffer("[");
for (Object item : items) {
B.append(item).append(",");
}
B.setCharAt(B.length() - 1, ']');
System.out.println(A + "=========>" + B + "\t" + rule.getConfidence());
info+=A + "=========>" + B + "\t" + rule.getConfidence()+"\n";
}
return info;
}
}
ID3算法的改进摘要本文基于ID3算法的原有思路再把属性的重要性程度值纳入了属性选择的度量标准中以期获得更适合实际应用的分类划分结…
本科课程设计及实验期末成绩评估系统的数据仓库和数据挖掘设计课程名称数据挖掘课程编号08060116学生姓名cwl学号20xx052…
目录第1章数据挖掘基本理论211数据挖掘的产生212数据挖掘的概念313数据挖掘的步骤3第2章系统分析421系统用户分析422系统…
数据挖掘课程设计报告题目姓名班级学号关联规则挖掘系统xxxxxx计算机0901xxxxxxxxxxx20xx年6月19日1一设计目…
数据挖掘聚类问题PlantsDataSet实验报告1数据源描述11数据特征本实验用到的是关于植物信息的数据集其中包含了每一种植物种…
目录第1章数据挖掘基本理论211数据挖掘的产生212数据挖掘的概念313数据挖掘的步骤3第2章系统分析421系统用户分析422系统…
ID3算法的改进摘要本文基于ID3算法的原有思路再把属性的重要性程度值纳入了属性选择的度量标准中以期获得更适合实际应用的分类划分结…
本科课程设计及实验期末成绩评估系统的数据仓库和数据挖掘设计课程名称数据挖掘课程编号08060116学生姓名cwl学号20xx052…
数据挖掘课程设计报告题目姓名班级学号关联规则挖掘系统xxxxxx计算机0901xxxxxxxxxxx20xx年6月19日1一设计目…
数据挖掘聚类问题PlantsDataSet实验报告1数据源描述11数据特征本实验用到的是关于植物信息的数据集其中包含了每一种植物种…
数据挖掘实验报告一实验名称有线电视服务销售CampR树二实验目的1学习和了解数据挖掘的基础知识学会使用SPSSClementine…