dev-QQq
方佳 博 2 years ago
parent d77977adf3
commit 319de1bde6

@ -175,7 +175,9 @@
<p>支持度是一个度量用于表示一个项集在整个数据集中出现的频率<br />!file</p><p style="font-size:19px;font-weight:600">置信度Confidence</p><p>置信度表示在包含项集X的所有事务中也包含项集Y的事务的概率</p><img src="@/assets/images/f2001.png" alt=""><p style="font-size:19px;font-weight:600">提升度Lift</p><p>提升度用于衡量项集X和Y的出现是否相互独立</p><img src="@/assets/images/f2002.png" alt=""><p style="font-size:19px;font-weight:600">Apriori原理</p><p>Apriori原理是Apriori算法的核心它基于一个简单但重要的观察一个项集是频繁的那么它的所有子集也必须是频繁的<br />例子 如果{"牛奶", "面包", "啤酒"}是一个频繁项集那么{"牛奶", "面包"}{"牛奶", "啤酒"}{"面包", "啤酒"}也必须是频繁项集<br />通过以上的概念和例子我们应该对关联规则挖掘的基础理论有了更深入的了解这为我们后续详解Apriori算法以及实际应用提供了坚实的基础</p><p style="font-weight: 700;font-size:22px">Apriori算法概述</p><p>Apriori算法是由Agrawal和Srikant于1994年提出的用于高效地挖掘频繁项集和生成关联规则其名字Apriori来源于拉丁语意为从先验知识这很好地反映了算法的核心思想利用已知的频繁项集即先验知识来更有效地找到更大的频繁项集</p><p style="font-size:19px;font-weight:600">算法步骤</p><img src="@/assets/images/f2004.png" alt=""><p>Apriori算法的执行流程主要包含两个步骤<br />&nbsp;&nbsp;1.频繁项集生成Frequent Itemset Generation: 找出满足最小支持度阈值的所有频繁项集<br />&nbsp;&nbsp;2.关联规则生成Association Rule Generation: 从频繁项集中生成高置信度的关联规则</p>
<p style="font-size:19px;font-weight:600">频繁项集生成</p><p>&nbsp;&nbsp;1.扫描数据集找出所有单一项的支持度并筛选出满足最小支持度的项<br />&nbsp;&nbsp;2.使用满足最小支持度的项生成新的候选项集<br />&nbsp;&nbsp;3.计算新生成的候选项集的支持度并再次筛选<br />&nbsp;&nbsp;4.重复上述步骤直到不能生成新的频繁项集<br />例子 假设有一个购物交易数据集其中包括5笔交易第一步是计算所有单一商品牛奶面包在这5笔交易中的出现次数并筛选出那些出现次数达到最小支持度的商品</p><p style="font-size:19px;font-weight:600">关联规则生成</p><p>&nbsp;&nbsp;1.对于每一个频繁项集生成所有可能的非空子集<br />&nbsp;&nbsp;2.对每一条生成的规则 ( A \Rightarrow B )计算其置信度<br />&nbsp;&nbsp;3.如果规则的置信度满足最小置信度要求则该规则为有效关联规则</p><p>例子 对于频繁项集 {"牛奶", "面包", "黄油"}可能的规则有 "牛奶, 面包 -> 黄油", "牛奶, 黄油 -> 面包" 计算这些规则的置信度并筛选出满足最小置信度的规则</p><p style="font-size:19px;font-weight:600">优缺点</p><p style="font-size:19px;font-weight:600">优点</p><li>简单易懂: Apriori算法基于直观的原理并且计算过程简单</li><li>可扩展性强: 算法可以应用于大规模的数据集</li><p style="font-size:19px;font-weight:600">缺点</p><li>计算量大: 在大数据集上可能需要生成大量的候选项集</li><li>多次扫描数据: 算法需要多次扫描数据集以计算项集的支持度这在数据集很大时可能是低效的</li><p>例子 在一个包含百万级交易数据的电子商务网站中使用Apriori算法可能需要消耗大量计算资源和时间<br />通过以上的详细描述和例子我们应该对Apriori算法有了全面而深入的理解这为我们后续的技术解析和实战应用奠定了基础</p>
<p style="font-weight: 700;font-size:22px">实战应用</p><p>在理解了Apriori算法的理论基础和工作原理之后现在我们将进一步探讨其在实际场景中的应用特别是在购物篮分析和推荐系统中Apriori算法被广泛应用<br />为了更好地说明这一点下面将通过Python展示如何实现Apriori算法并用一个简单的购物数据集进行演示</p><p style="font-size:19px;font-weight:600">购物篮分析</p><p>购物篮分析Market Basket Analysis是一种在零售业非常流行的技术用于发现顾客购买产品之间的关联规则</p><p style="font-size:19px;font-weight:600">输入和输出</p><li>输入 一组交易数据每一笔交易包含多个购买的商品</li><li>输出 满足最小支持度和最小置信度的关联规则</li><p style="font-size:19px;font-weight:600">Python实现代码</p>
<MdPreview v-model="text" />
<MdPreview v-model="text" /><p style="font-weight: 700;font-size:22px">五、性能优化与扩展</p><p>Apriori算法虽然在多个领域有着广泛的应用但其在大数据集上的性能表现并不尽如人意。这是由于它需要多次扫描数据集以及生成大量的候选项集。在这一节中我们将讨论针对这些问题的性能优化方案和扩展方法。</p><p style="font-size:19px;font-weight:600">优化策略</p><p>优化Apriori算法的主要方法包括</p><p style="font-size:19px;font-weight:600">减少数据扫描次数</p><p>由于Apriori算法在每一轮都需要扫描整个数据集以计算支持度因此一个直观的优化方式就是减少数据扫描的次数。<br />例子: 通过构建一个事务-项倒排索引,你可以在单次数据集扫描后立即找到任何项集的支持度。</p><p style="font-size:19px;font-weight:600">采用数据压缩技术</p><p>可以通过压缩事务数据来减少计算量,例如使用位向量来表示事务。<br />例子: 若数据集中有100个商品每一笔交易都可以通过一个100位的位向量来表示。这种方式可以显著减少数据的存储需求。</p><p style="font-size:19px;font-weight:600">使用Hashing技术</p><p>通过使用哈希表来存储候选项集和它们的计数,可以加速支持度的计算。<br />例子: 在生成候选项集时,可以使用哈希函数来将项集映射到哈希表的一个位置,并在该位置增加相应的计数。</p><p style="font-size:19px;font-weight:600">扩展方法</p><p style="font-size:19px;font-weight:600">并行化</p><p>Apriori算法可以通过数据或任务并行化进行扩展以利用多处理器或分布式计算环境。<br />例子: 在一个分布式系统中,可以将数据集划分为多个子集,并在各个节点上并行计算支持度和生成频繁项集。</p><p style="font-size:19px;font-weight:600"></p><p>对于一些应用场景完全精确的频繁项集挖掘可能不是必需的在这种情况下可以使用近似算法来加速计算<br />例子 使用Monte Carlo方法或其他随机抽样技术通过部分数据来估计整个数据集的频繁项集</p>
<p style="font-size:19px;font-weight:600">集成其他数据挖掘算法</p><p>Apriori算法可以与其他数据挖掘或机器学习算法结合使用以解决更复杂的问题<br />例子 在一个推荐系统中除了使用Apriori算法找出频繁项集外还可以使用聚类算法对用户进行分群从而实现更个性化的推荐<br />通过这些优化和扩展方法我们不仅可以提升Apriori算法在大数据环境下的性能还可以拓宽其应用范围这些都为进一步的研究和应用提供了有益的方向</p><p style="font-weight: 700;font-size:22px">总结</p><p>通过本文的探讨我们不仅对Apriori算法有了全面且深入的了解而且掌握了它在实际问题中的应用特别是在购物篮分析和推荐系统方面然而我们也注意到了这一算法在面对大规模数据时存在的局限性</p><li>支持度与置信度的平衡 在实际应用中选择合适的支持度和置信度阈值是一门艺术过低的阈值可能会导致大量不显著的关联规则而过高的阈值可能会漏掉一些有用的规则</li><li>实时性问题 在动态变化的数据集上如何实现Apriori算法的实时或近实时分析也是一个值得关注的问题这在电子商务等快速响应的场景中尤为重要</li><li>多维多层分析 现有的Apriori算法主要集中在单一的项集层面未来可以考虑如何将其扩展到多维或多层的关联规则挖掘</li><li>算法与模型的集成 未来的研究趋势可能会更多地集中在将关联规则挖掘与其他机器学习模型如神经网络决策树等集成以解决更为复杂的问题</li>
<p>在今后的工作中探究这些技术洞见的相关性和应用价值以及将Apriori算法与现代计算架构如GPU分布式计算等更紧密地结合将是关键的研究方向<br />总之Apriori算法在数据挖掘和关联分析领域有着广阔的应用前景然而为了使其能够更好地适应现代数据的规模和复杂性还需要在算法优化和应用扩展方面进行更多的研究和探索希望本文能为您在这一领域的学习和应用提供有用的信息和启示</p>
</div>
</template>
</pop-model>
@ -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=[]

@ -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);

Loading…
Cancel
Save