数据挖掘课程设计报告

一、设计目的

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;

    }

}

                                   

相关推荐