数据挖掘课程设计报告总结

Java实现Apriori算法与KNN、DBSCAN、K-means与PageRank应用详解
本文详细介绍了如何用Java实现Apriori算法用于关联规则挖掘,并对比了KNN、DBSCAN、K-means和PageRank算法的原理、应用及实验结果,展示了数据挖掘中的几种经典算法在实际项目中的设计与实践。

一、实验题目

实验一 Apriori算法设计与应用

二、背景介绍

Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和向下封闭检测两个阶段来挖掘频繁项集。

三、实验内容

1.3.1 运用的理论知识

关联规则挖掘是数据挖掘中最活跃的研究方法之一,最初的动机是针对购物篮分析问题提出的,其目的是为了发现交易数据库中不同商品之间的练习规则。通过用户给定的最小支持度,寻找所有频繁项目集,即满足Support不小于Minsupport的所有项目子集。通过用户给定的最小可信度,在每个最大频繁项目集中,寻找Confidence不小于Minconfidence的关联规则。
支持度:支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重。或者说几个数据关联出现的概率。
置信度:置信度体现了一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。

1.3.2 实验原理

Apriori算法基本思想:
首先扫描数据库中所需要进行分析的数据,在设置完支持度以及置信度以后,在最小支持度的支持下产生频繁项,即统计所有项目集中包含一个或一个以上的元素频数,找出大于或者等于设置的支持度的项目集。其次就是频繁项的自连接。再者是如果对频繁项自连接以后的项的子集如果不是频繁项的话,则进行剪枝处理。接着对频繁项处理后产生候选项。最后循环调用产生频繁项集。

1.3.3 算法详细设计

(1)定义数据集、最小支持度、最小支持数、最小置信度以及存放所有频繁项目集的Map集合。调用就封装好的initDataList()方法对数据进行初始化。
(2)调用getAllElement()方法获取到数据集所含有的所有类别元素allElement,将allElement数组进行排列组合获取候选集candidateL1。调用getItemSets()方法遍历candidateL1,将出现次数不小于最小支持数minSupportCount的项加入到itemSets中,遍历结束,获取到1-频繁项目集L1,并将L1打印输出。
(3)开始循环找k-频繁项目集,直到得到的k-频繁项目集Lk为空,跳出循环。在循环体内部,将k-1-候选集candidateLast所含有的所有类别元素allElementLast作为参数调用getCombination()方法,获取k-候选集candidateNow,遍历k-候选集,将出现次数不小于最小支持数的项加入到itemSets并返回,得到频繁项目集Lk。如果k-频繁项集为空,则结束循环,若Lk不为空,则将Lk加入到存放所有频繁项目集allItemSets的集合中,方便之后找强关联规则。
(4)调用correlation()方法进行强关联规则的挖掘。在方法体内部,遍历所有的频繁项目集,得到每一项频繁项目集的非空子集集合subSet,遍历每一项频繁项目集的非空子集,以此非空子集和此频繁项目集作为参数,调用isConfidence()方法判断是否满足置信度大于最小置信度,若满足,则输出此非空子集==>非空子集的补集。

1.3.4 关键源代码

/**
 * 获取候选集
 * @param allItemStr 含频繁项目集所有元素的数组
 * @param k 要生成k候选集
 * @return
 */
public static List<String[]> getCombination(String[] allItemStr, int k){
   
   
    //定义候选集
    List<String[]> candidateSets = new ArrayList<>();
    //对allItemStr进行k组合
    IGenerator<List<String>> candidateList = Generator.combination(allItemStr).simple(k);
    for (List<String> candidate : candidateList) {
   
   
        String[] candidateStr = candidate.toArray(new String[candidate.size()]);
        candidateSets.add(candidateStr);//将每一项组合放入候选集中
    }
    return candidateSets;
}
/**
 * 处理候选集,获取频繁项目集
 * @param itemList 候选集
 * @return 频繁项目集
 */
public static Multimap<Integer, String[]> getItemSets(List<String[]> itemList){
   
   
    Multimap<Integer, String[]> itemSets = ArrayListMultimap.create(); //项目集
    //得到排列组合结果(候选集)每一项在数据集中出现的次数
    Multimap<Integer, String[]> itemCount = getItemCount(itemList);
    //使用迭代器遍历multimap
    Iterator<Map.Entry<Integer, String[]>> iterator = itemCount.entries().iterator();
    //遍历排列组合结果的每一项,将出现次数不小于minSupportCount的项加入到itemSets
    while (iterator.hasNext()){
   
   
        Map.Entry<Integer, String[]> entry = iterator.next();
        if (entry.getKey() >= minSupportCount){
   
   
            itemSets.put(entry.getKey(), entry.getValue());
        }
    }
    return itemSets;
}
/**
 * 找强关联规则
 */
public static void correlation(){
   
   
    //遍历所有频繁项目集
    for (int k = 1; k <= allItemSets.size(); k++) {
   
   
        //获取k-频繁项目集
        Multimap<Integer, String[]> keyItemSet = allItemSets.get(k);
        Iterator<Map.Entry<Integer, String[]>> iterator = keyItemSet.entries().iterator();
        //遍历k频繁项目集
        while (iterator.hasNext()){
   
   
            Map.Entry<Integer, String[]> entry = iterator.next();
            String[] value = entry.getValue();
//                List<String> valueList = Arrays.asList(value);
//                List<String> valueList = new ArrayList<>();
//                Collections.addAll(valueList, value);
            //求value的非空子集
            for (int i = 1; i < value.length; i++) {
   
   
                List<String[]> subSet = getCombination(value, i); //非空子集的集合
                for (String[] subSetItem : subSet) {
   
    //subSetItm是频繁项目集每一个非空子集
                    List<String> valueList = new ArrayList<>();
                    Collections.addAll(valueList, value);
                    List<String> subSetItemList = Arrays.asList(subSetItem);
                    //去除已经求得子集后的valueList
                    valueList.removeAll(subSetItemList); //此时valueList中存放非空子集的补集
                    if (isConfidence(subSetItem, value)){
   
   
                        System.out.println(Arrays.toString(subSetItem) + "==>" + Arrays.toString(valueList.toArray(new String[valueList.size()])));
                    }
                }
            }
        }
    }
}
目前,中国的经济飞速发展,在每个行业中都呈现出了蓬勃发展的趋势,尤其以酒店管理业最为突出。我国国民经济迅速增长的势头,为酒店行业的发展带来极大的商机,引入数据挖掘方法来实现酒店管理。市场经济的不断成熟和技术的不断进步,迫使企业从“以产品为中心”的经营理念逐渐转移到“以用户为中心”的服务模式上来,但是各类酒店不断涌现,客户群体差异化,使得酒店行业无法满足旅客个性化需求和日益恶化的生存环境。酒店行业的蓬勃发展,使得酒店的信息化和酒店信息的需求也迅速增长。随着管理水平和服务质量的不断提高,以及日趋成熟的消费者市场,为了在瞬息万变的商业环境中创造出领先的管理原则以获得持续发展的竞争优势,重新审视周围的经营环境,并且将视角的焦点落在客户关系管理上。作为一个典型的服务行业,酒店实施客户关系管理(CRM)能对客户信息进行有效的采集和整合,使零散的客户信息变成酒店的客户知识。通过相关系统,相关人员能获得特定客户全面,个性化的信息,以便于针对“一对一”更经济、快捷和周到的优质服务,吸引和保持客户的不断光顾,最终实现酒店利润的最大化。基于数据挖掘的酒店行业CRM系统作为现代酒店信息管理系统的重要组成部分,对于酒店的正常运营,促进营销策略的不
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

近景_

打赏拉满,动力满满

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值