数据挖掘课程设计报告

发布时间:2012-06-24 23:20:28

数据挖掘课程设计报告

目: 关联规则挖掘系统

名: xxxxxx

计算机0901

xxxxxxxxxxx

2013 6 19

一、设计目的

该程序实现了对简单数据进行频繁项集挖掘的功能,主要使用 Apriori算法,即使用候选产生发现频繁项集。通过这次编程增强编程能力。

、设计要求

实现数据挖掘的关联规则,能够挖掘数据之间的关联信息,能够读取文件中的数据,能够保存分析结果。界面友好。

三、设计实现流程图

四、实现环境

操作系统WindowsXP

开发环境Netbeans7.1

运行环境 Windows系列操作系统(装有Java运行时环境)

五、实现结果

完整输出结果:

run

顾客1

商品A

商品B

商品C

顾客2

商品A

商品B

顾客3

商品B

商品C

顾客4

商品C

商品B

商品1

,,,,,,,,,,,,,,,,,,,,,,,,,,,,

3

***************************************************************************************************

候选集1:[商品A] [商品B] [商品C]

频繁集1:[商品A] [商品B] [商品C]

***************************************************************************************************

候选集2:[商品A,商品B] [商品A,商品C] [商品B,商品C]

频繁集2:[商品A,商品B] [商品B,商品C]

***************************************************************************************************

候选集3:[商品A,商品B,商品C]

频繁集3:

***************************************************************************************************

最大频繁集:[商品A,商品B] [商品B,商品C]

***************************************************************************************************

关联规则:

[商品A]=========>[商品B] 1.0

[商品B]=========>[商品A] 0.6666666666666666

[商品B]=========>[商品C] 0.6666666666666666

[商品C]=========>[商品B] 1.0

六、设计小结

这学期学的数据挖掘课程丰富了我的知识面,让我看到了信息技术的巨大生命力和前景。数据挖掘涉及多学科技术的集成,包括数据库和数据仓库技术、统计学、机器学习、高性能计算、模式识别、神经网络、数据可视化、信息检索等技术。通过数据挖掘,可以从数据库提取有趣的知识、规律或高层信息,并可以从不同角度观察或浏览它们,发现的知识可以用于做决策、过程控制、信息管理、查询处理。利用数据挖掘技术可以帮助获得决策所需的多种知识。在许多情况下,用户并不知道数据存在哪些有价值的信息知识,因此对于一个数据挖掘系统而言,它应该能够同时搜索发现多种模式的知识,以满足用户的期望和实际需要。此外数据挖掘系统还应能够挖掘出多种层次(抽象水平)的模式知识。数据挖掘系统还应容许用户指导挖掘搜索有价值的模式知识。

通过这次实践,我对数据挖掘技术有了一个整体的认识。同样在编写程序的时候也遇到了这样或那样的问题。但在老师及同学们的帮助下,艰难的完成了这个系统。这让我对数据挖掘技术以后的深入学习打下了良好的基础。同时我的编程能力进一步提高,Java方面的实战经验进一步丰富。优秀的设计要付诸实践,用户需要的是真真实实的产品,知识转化为产品,才能体现它的价值。

附录:主要代码

1 APPF.Java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package datamining;

/**

*

* @author Administrator

*/

public class APPF extends javax.swing.JFrame {

/**

* Creates new form APPF

*/

public APPF() {

initComponents();

}

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

//

private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

jTable1 = new javax.swing.JTable();

jLabel1 = new javax.swing.JLabel();

jTextField1 = new javax.swing.JTextField();

jLabel2 = new javax.swing.JLabel();

jTextField2 = new javax.swing.JTextField();

jLabel3 = new javax.swing.JLabel();

jTextField3 = new javax.swing.JTextField();

jButton1 = new javax.swing.JButton();

jScrollPane2 = new javax.swing.JScrollPane();

jTextArea1 = new javax.swing.JTextArea();

jLabel4 = new javax.swing.JLabel();

jLabel5 = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jTable1.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

{null, null},

{null, null},

{null, null},

{null, null},

{null, null},

{null, null},

{null, null},

{null, null},

{null, null},

{null, null}

},

new String [] {

"序列", "项目"

}

));

jScrollPane1.setViewportView(jTable1);

jLabel1.setText("支持度:");

jLabel3.setText("挖掘深度:");

jButton1.setText("开始分析");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

jTextArea1.setColumns(20);

jTextArea1.setRows(5);

jScrollPane2.setViewportView(jTextArea1);

jLabel4.setBackground(new java.awt.Color(255, 255, 255));

jLabel4.setFont(new java.awt.Font("新宋体", 0, 36)); // NOI18N

jLabel4.setText("数据挖掘");

jLabel5.setText("置信度:");

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(33, 33, 33)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jLabel3)

.addGap(41, 41, 41)

.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jLabel5)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jTextField2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE))))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 40, Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(jButton1)

.addGap(69, 69, 69)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap())

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(130, 130, 130))))))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(34, 34, 34)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel1)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(24, 24, 24)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel2)

.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel5)

.addComponent(jButton1))

.addGap(25, 25, 25)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGroup(layout.createSequentialGroup()

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGap(18, 18, 18)

.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 167, Short.MAX_VALUE))

);

pack();

}//

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

DBManager db = new DBManager();

TransactionContainer transactionContainer = db.getTransactionContainer(jTable1);

Apriori apriori = new Apriori();

//设置参数

double support = Double.parseDouble(jTextField1.getText());

apriori.setMinSupport(support);

double confidence = Double.parseDouble(jTextField2.getText());

apriori.setMinConfidence(confidence);

int deep = Integer.parseInt(jTextField3.getText());

apriori.setDeep(deep); //设置最大挖掘深度,否则直到不产生新频繁集而自动停止

apriori.setContainer(transactionContainer);

//进行分析

apriori.analyse();

//打印信息

String info = apriori.printInfo();

jTextArea1.append(info);

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

/*

* Set the Nimbus look and feel

*/

//

/*

* If Nimbus (introduced in Java SE 6) is not available, stay with the

* default look and feel. For details see

* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(APPF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(APPF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(APPF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(APPF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

}

//

/*

* Create and display the form

*/

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new APPF().setVisible(true);

}

});

}

2 Apriori.java:

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JLabel jLabel4;

private javax.swing.JLabel jLabel5;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JScrollPane jScrollPane2;

static javax.swing.JTable jTable1;

static javax.swing.JTextArea jTextArea1;

private javax.swing.JTextField jTextField1;

private javax.swing.JTextField jTextField2;

private javax.swing.JTextField jTextField3;

// End of variables declaration

}

package datamining;

import java.util.*;

public class Apriori {

private double minSupport; //最小支持度

private double minConfidence; //最小置信度

private Map container; //交易数据容器

private int totalSize; //样品数据条数

private List canditateSetList = new List(); //候选集链表

private List frequentSetList = new List(); //频繁集链表

private List maxFrequentSetList = new List(); //最大频繁集

private int maxDeep = -1;

private int curDeep = 0;

private boolean isStop = false;

private Set elementSet = new TreeSet();

private List ruleList = new List();

//设置挖掘深度,如果为-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 List(); //存放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 List();

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 List();

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 List();

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() {

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("关联规则:");

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;

}

}

3TransactionContainer

package datamining;

import java.util.HashMap;

import java.util.Map;

public class TransactionContainer {

private Map container;

TransactionContainer(){

container = new HashMap();

}

public void addForm(TransactionForm transactionForm){

container.put(transactionForm.getTID(), transactionForm);

}

public Map getContainer(){

return container;

}

}

4TransactionForm

package datamining;

import java.util.Collection;

import java.util.List;

import java.util.Set;

import java.util.TreeSet;

public class TransactionForm {

private String TID;

private Set items;

TransactionForm(){

this.items = new TreeSet();

}

public Set getItems() {

return items;

}

public void addItem(Object item){

this.items.add(item);

}

public void setItems(Set items){

this.items = items;

}

public void addAll(Collection collection){

this.items.addAll(collection);

}

public String getTID() {

return TID;

}

public void setTID(String tid) {

TID = tid;

}

}

数据挖掘课程设计报告

相关推荐