From 319de1bde6a100ce300cf973a3f31550db2de2c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E4=BD=B3=20=E5=8D=9A?= <12742597+fang-jiabo@user.noreply.gitee.com> Date: Mon, 19 Aug 2024 18:32:17 +0800 Subject: [PATCH] 'tj' --- .../components/associationRuleMining.vue | 74 ++++++++++++++++++- .../components/clusterAnalysis.vue | 36 ++++----- 2 files changed, 89 insertions(+), 21 deletions(-) diff --git a/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue b/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue index 0456c16..315ec03 100644 --- a/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue +++ b/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue @@ -175,7 +175,9 @@

支持度是一个度量,用于表示一个项集在整个数据集中出现的频率。
!file

置信度(Confidence)

置信度表示在包含项集X的所有事务中,也包含项集Y的事务的概率。

提升度(Lift)

提升度用于衡量项集X和Y的出现是否相互独立。

Apriori原理

Apriori原理是Apriori算法的核心,它基于一个简单但重要的观察:一个项集是频繁的,那么它的所有子集也必须是频繁的。
例子: 如果{"牛奶", "面包", "啤酒"}是一个频繁项集,那么{"牛奶", "面包"}、{"牛奶", "啤酒"}和{"面包", "啤酒"}也必须是频繁项集。
通过以上的概念和例子,我们应该对关联规则挖掘的基础理论有了更深入的了解。这为我们后续详解Apriori算法以及实际应用提供了坚实的基础。

三、Apriori算法概述

Apriori算法是由Agrawal和Srikant于1994年提出的,用于高效地挖掘频繁项集和生成关联规则。其名字“Apriori”来源于拉丁语,意为“从先验知识”。这很好地反映了算法的核心思想:利用已知的频繁项集(即先验知识)来更有效地找到更大的频繁项集。

算法步骤

Apriori算法的执行流程主要包含两个步骤:
  1.频繁项集生成(Frequent Itemset Generation): 找出满足最小支持度阈值的所有频繁项集。
  2.关联规则生成(Association Rule Generation): 从频繁项集中生成高置信度的关联规则。

频繁项集生成

  1.扫描数据集,找出所有单一项的支持度,并筛选出满足最小支持度的项。
  2.使用满足最小支持度的项生成新的候选项集。
  3.计算新生成的候选项集的支持度,并再次筛选。
  4.重复上述步骤,直到不能生成新的频繁项集。
例子: 假设有一个购物交易数据集,其中包括5笔交易。第一步是计算所有单一商品(如“牛奶”,“面包”等)在这5笔交易中的出现次数,并筛选出那些出现次数达到最小支持度的商品。

关联规则生成

  1.对于每一个频繁项集,生成所有可能的非空子集。
  2.对每一条生成的规则 ( A \Rightarrow B ),计算其置信度。
  3.如果规则的置信度满足最小置信度要求,则该规则为有效关联规则。

例子: 对于频繁项集 {"牛奶", "面包", "黄油"},可能的规则有 "牛奶, 面包 -> 黄油", "牛奶, 黄油 -> 面包" 等。计算这些规则的置信度,并筛选出满足最小置信度的规则。

优缺点

优点

  • 简单易懂: Apriori算法基于直观的原理,并且计算过程简单。
  • 可扩展性强: 算法可以应用于大规模的数据集。
  • 缺点

  • 计算量大: 在大数据集上,可能需要生成大量的候选项集。
  • 多次扫描数据: 算法需要多次扫描数据集以计算项集的支持度,这在数据集很大时可能是低效的。
  • 例子: 在一个包含百万级交易数据的电子商务网站中,使用Apriori算法可能需要消耗大量计算资源和时间。
    通过以上的详细描述和例子,我们应该对Apriori算法有了全面而深入的理解。这为我们后续的技术解析和实战应用奠定了基础。

    四、实战应用

    在理解了Apriori算法的理论基础和工作原理之后,现在我们将进一步探讨其在实际场景中的应用。特别是在购物篮分析和推荐系统中,Apriori算法被广泛应用。
    为了更好地说明这一点,下面将通过Python展示如何实现Apriori算法,并用一个简单的购物数据集进行演示。

    购物篮分析

    购物篮分析(Market Basket Analysis)是一种在零售业非常流行的技术,用于发现顾客购买产品之间的关联规则。

    输入和输出

  • 输入: 一组交易数据,每一笔交易包含多个购买的商品。
  • 输出: 满足最小支持度和最小置信度的关联规则。
  • Python实现代码

    - +

    五、性能优化与扩展

    Apriori算法虽然在多个领域有着广泛的应用,但其在大数据集上的性能表现并不尽如人意。这是由于它需要多次扫描数据集以及生成大量的候选项集。在这一节中,我们将讨论针对这些问题的性能优化方案和扩展方法。

    优化策略

    优化Apriori算法的主要方法包括:

    减少数据扫描次数

    由于Apriori算法在每一轮都需要扫描整个数据集以计算支持度,因此一个直观的优化方式就是减少数据扫描的次数。
    例子: 通过构建一个事务-项倒排索引,你可以在单次数据集扫描后立即找到任何项集的支持度。

    采用数据压缩技术

    可以通过压缩事务数据来减少计算量,例如使用位向量来表示事务。
    例子: 若数据集中有100个商品,每一笔交易都可以通过一个100位的位向量来表示。这种方式可以显著减少数据的存储需求。

    使用Hashing技术

    通过使用哈希表来存储候选项集和它们的计数,可以加速支持度的计算。
    例子: 在生成候选项集时,可以使用哈希函数来将项集映射到哈希表的一个位置,并在该位置增加相应的计数。

    扩展方法

    并行化

    Apriori算法可以通过数据或任务并行化进行扩展,以利用多处理器或分布式计算环境。
    例子: 在一个分布式系统中,可以将数据集划分为多个子集,并在各个节点上并行计算支持度和生成频繁项集。

    支持近似挖掘

    对于一些应用场景,完全精确的频繁项集挖掘可能不是必需的。在这种情况下,可以使用近似算法来加速计算。
    例子: 使用Monte Carlo方法或其他随机抽样技术,通过部分数据来估计整个数据集的频繁项集。

    +

    集成其他数据挖掘算法

    Apriori算法可以与其他数据挖掘或机器学习算法结合使用,以解决更复杂的问题。
    例子: 在一个推荐系统中,除了使用Apriori算法找出频繁项集外,还可以使用聚类算法对用户进行分群,从而实现更个性化的推荐。
    通过这些优化和扩展方法,我们不仅可以提升Apriori算法在大数据环境下的性能,还可以拓宽其应用范围。这些都为进一步的研究和应用提供了有益的方向。

    六、总结

    通过本文的探讨,我们不仅对Apriori算法有了全面且深入的了解,而且掌握了它在实际问题中的应用,特别是在购物篮分析和推荐系统方面。然而,我们也注意到了这一算法在面对大规模数据时存在的局限性。

  • 支持度与置信度的平衡: 在实际应用中,选择合适的支持度和置信度阈值是一门艺术。过低的阈值可能会导致大量不显著的关联规则,而过高的阈值可能会漏掉一些有用的规则。
  • 实时性问题: 在动态变化的数据集上,如何实现Apriori算法的实时或近实时分析也是一个值得关注的问题。这在电子商务等快速响应的场景中尤为重要。
  • 多维、多层分析: 现有的Apriori算法主要集中在单一的项集层面,未来可以考虑如何将其扩展到多维或多层的关联规则挖掘。
  • 算法与模型的集成: 未来的研究趋势可能会更多地集中在将关联规则挖掘与其他机器学习模型(如神经网络、决策树等)集成,以解决更为复杂的问题。
  • +

    在今后的工作中,探究这些技术洞见的相关性和应用价值,以及将Apriori算法与现代计算架构(如GPU、分布式计算等)更紧密地结合,将是关键的研究方向。
    总之,Apriori算法在数据挖掘和关联分析领域有着广阔的应用前景。然而,为了使其能够更好地适应现代数据的规模和复杂性,还需要在算法优化和应用扩展方面进行更多的研究和探索。希望本文能为您在这一领域的学习和应用提供有用的信息和启示。

    @@ -199,7 +201,74 @@ const tableLabel=reactive([ const tableLabel2=reactive([ {prop:'date',label:''}, ]) -const text = ref('Hello Editor!'); +const text = ref(`首先导入必要的库: +\`\`\`python +from itertools import chain, combinations +\`\`\` +接着定义几个辅助函数: +\`\`\`python +# 生成候选项集的所有非空子集 +def powerset(s): + return chain.from_iterable(combinations(s, r) for r in range(1, len(s))) +# 计算支持度 +def calculate_support(itemset, transactions): + return sum(1 for transaction in transactions if itemset.issubset(transaction)) / len(transactions) +\`\`\` +现在我们来实现Apriori算法: +\`\`\`python +def apriori(transactions, min_support, min_confidence): + # 初始化频繁项集和关联规则列表 + frequent_itemsets = [] + association_rules = [] + # 第一步:找出单项频繁项集 + singletons = {frozenset([item]) for transaction in transactions for item in transaction} + singletons = {itemset for itemset in singletons if calculate_support(itemset, transactions) >= min_support} + frequent_itemsets.extend(singletons) + # 迭代找出所有其他频繁项集 + prev_frequent_itemsets = singletons + while prev_frequent_itemsets: + # 生成新的候选项集 + candidates = {itemset1 | itemset2 for itemset1 in prev_frequent_itemsets for itemset2 in prev_frequent_itemsets if len(itemset1 | itemset2) == len(itemset1) + 1} + # 计算支持度并筛选 + new_frequent_itemsets = {itemset for itemset in candidates if calculate_support(itemset, transactions) >= min_support} + frequent_itemsets.extend(new_frequent_itemsets) + # 生成关联规则 + for itemset in new_frequent_itemsets: + for subset in powerset(itemset): + subset = frozenset(subset) + diff = itemset - subset + if diff: + confidence = calculate_support(itemset, transactions) / calculate_support(subset, transactions) + if confidence >= min_confidence: + association_rules.append((subset, diff, confidence)) + prev_frequent_itemsets = new_frequent_itemsets + return frequent_itemsets, association_rules +\`\`\` +### 示例和输出 +假设我们有以下简单的购物数据集: +\`\`\`python +transactions = [ + {'牛奶', '面包', '黄油'}, + {'啤酒', '面包'}, + {'牛奶', '啤酒', '黄油'}, + {'牛奶', '鸡蛋'}, + {'面包', '鸡蛋', '黄油'} +] +\`\`\` +调用Apriori算法: +\`\`\`python +min_support = 0.4 +min_confidence = 0.5 +frequent_itemsets, association_rules = apriori(transactions, min_support, min_confidence) +print("频繁项集:", frequent_itemsets) +print("关联规则:", association_rules) +\`\`\` +输出可能如下: +\`\`\`python +频繁项集: [{'牛奶'}, {'面包'}, {'黄油'}, {'啤酒'}, {'鸡蛋'}, {'牛奶', '面包'}, {'牛奶', '黄油'}, {'面包', '黄油'}, {'啤酒', '黄油'}, {'面包', '啤酒'}] +关联规则: [(('牛奶',), ('面包',), 0.6666666666666666), (('面包',), ('牛奶',), 0.6666666666666666), ...] +\`\`\` +通过这个实战应用,我们不仅学习了如何在Python中实现Apriori算法,还了解了它在购物篮分析中的具体应用。这为进一步的研究和实际应用提供了有用的指导。`); const getList=()=>{ API.selectionMetrics({userId:JSON.parse(getUserInfo()).userId}).then((res)=>{ res.data.forEach(element => { @@ -220,7 +289,6 @@ const flag=ref(false) onMounted(()=>{ getList() }) - const optionData=()=>{ API.viewingMetrics({userId:JSON.parse(getUserInfo()).userId,tableName:input.value,algorithmName:'关联规则挖掘'}).then((res)=>{ tableData.value=[] diff --git a/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue b/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue index ccb89c4..b6ed9fe 100644 --- a/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue +++ b/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue @@ -484,23 +484,23 @@ const nowData=ref([]) } ] - nowData.value.forEach(item=>{ - item.forEach((item2,index)=>{ - item2.forEach((item3,index2)=>{ - if (!formData[index]) { - formData[index] = {}; // 如果不存在,则初始化为一个空对象 - } - if(index2===0){ - formData[index].fieldOne=item3 - }else if(index2===1){ - formData[index].fieldTow=item3 - }else if(index2===2){ - formData[index].fieldThree=item3 - } - }) - }) - }) - API.downloadClusterAnalysisForm([formData]).then((response)=>{ + // nowData.value.forEach(item=>{ + // item.forEach((item2,index)=>{ + // item2.forEach((item3,index2)=>{ + // if (!formData[index]) { + // formData[index] = {}; // 如果不存在,则初始化为一个空对象 + // } + // if(index2===0){ + // formData[index].push(item3) + // }else if(index2===1){ + // formData[index].push(item3) + // }else if(index2===2){ + // formData[index].push(item3) + // } + // }) + // }) + // }) + API.downloadClusterAnalysisForm(nowData.value[0]).then((response)=>{ // 创建一个 Blob 对象 const blob = new Blob([response.data], { type: 'application/octet-stream' }); @@ -512,7 +512,7 @@ const blob = new Blob([response.data], { type: 'application/octet-stream' }); link.href = url; // 设置下载文件的默认名称 - link.download = '聚类分析.xls'; + link.download = '聚类分析.xlsx'; // 触发点击事件,下载文件 document.body.appendChild(link);