程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍

2024-04-07 11:52

本文主要是介绍程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

频繁项集挖掘可以说是数据挖掘中的重点,下面我们来分析以下频繁项集挖掘的过程和目标

如果对数据挖掘没有概念的小伙伴可以查看上次的文章
https://blog.csdn.net/qq_31236027/article/details/137046475

什么是频繁项集?

在回答这个问题之前,我们可以看一个例子:
小明、小刚、小红三人去同一家商店购物,小明、小刚两人购买了鸡蛋,牛奶和面包,小红购买了鸡蛋和牛奶,这时候一位聪明的店员便推荐小红购买面包,并且说这个面包很适合购买了鸡蛋和牛奶的客户,小红心动了。
在这个例子中,我们可以看到小明、小刚和小红都有去购买商品的行为,而其中的每一个商品可以称为一个,小明、小刚、小红所购买的商品的集合就成为项集。那么什么是频繁项集呢?所谓的频繁项集理解起来也相对容易了,就是用户频繁购买的商品的集合,也就是说会被大部分用户购买的商品的集合。显而易见,在例子中鸡蛋、牛奶可以称为一个频繁项集。

频繁项集有啥用处?

再次回到之前的那个例子中,那个聪明的店员根据小明和小刚的购买记录进行商品的推荐,这个就利用到了频繁项集的一个优势:允许系统(店员)利用已有的频繁项集(顾客的购买记录) 针对某一客户进行商品推荐。那么为什么可以这么做呢?这么做的依据是什么呢?下面让我们来看一下频繁项集挖掘的过程。

频繁项集挖掘过程

先上个例子(基于Apriori):
已知
用户B收藏了物品A、B、C,
用户C收藏了物品A、D,
用户D收藏了物品A、B、C、D,
用户E收藏了物品A、B、E
用户A收藏了物品A、B,现在需要针对用户A进行物品推荐。

  1. 首先我们选取一个集合,就设置为{物品A}
  2. 我们不难发现购买了物品A的用户3/4都收藏了物品B,这时候我们可以设定一个阈值,只有频率(出现次数)超过这个值的项集才会被保留,这个值又称作最小支持度(min_support)。假设最小支持度为0.5, 也就是说物品D不会被推荐,因为只有一个用户在收藏了物品A后收藏了物品D(是用户C), 收藏D的后验概率为1/3 < 0.5。
  3. 于是集合扩容为{物品A,物品B}
  4. 之后而我们推出收藏了物品A、B后收藏物品C的概率为 1/2,也就是{用户B,用户D}/ {用户B,用户C,用户D、用户E},而用户收藏A、B、E的概率为1/4 < 0.5 因此不被保留
  5. 集合扩容为{物品A,物品B,物品C}
  6. 因为购买物品A,物品B,物品C后购买物品D的项集只出现1次,1/4 < min_support = 0.5 因此,该项集非频繁项集,因此最大频繁项集为{物品A,物品B,物品C}
  7. 之后针对用户A进行推荐,这时候需要逐层进行筛选,不难得出{物品A,物品B} => {物品A,物品B,物品C} 的概率为2/3,超过了我们设定的第二个阈值,称为最小置信度(也就是最小关联度),而{物品A,物品B} = > {物品A,物品B,物品E} 的概率为1/3 < 0.5 。不推荐。因此会向用户A推荐物品C,

Apriori算法

好了,朋友们,看到了现在这一步可以恭喜你已经初步了解频繁项集的挖掘过程了。
下面我们来看一下Apriori的算法:

package apriori;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** apriori算法* @author zygswo**/
public class Apriori {/*** 最小支持度*/private static final double MIN_SUPPORT = 0.5;/*** 最小置信度*/private static final double MIN_FAITH = 0.5;/*** 算法核心* @param trainDataSet 训练集* @param usersCollection 用户喜好* @return*/private static List<String>getResult(Map<String,String[]> trainDataSet,String[] usersCollection) {//1.训练集训练Map<String,Double> res = new ConcurrentHashMap<String,Double>();res = trainData(res,trainDataSet);System.out.println(res.toString());//2.推荐return recommend(res, usersCollection);}/*** 推荐* @param res* @param usersCollection* @return*/private static List<String> recommend(Map<String, Double> res, String[] usersCollection) {// TODO Auto-generated method stubString key = "";List<String> list = new ArrayList<>();for (String str: usersCollection) {key += str;}double countNb = res.get(key);for (String str: res.keySet()) {if (str.length() != key.length() + 1) {continue;}boolean contains = true;for (char ch : key.toCharArray()) {if (str.indexOf(ch) == -1) {contains = false;break;}}if (contains){if (res.get(str) /countNb * 1.0 >= MIN_FAITH) {System.out.println(key + " -->"  + str + " faith = " +  res.get(str) / countNb * 1.0);list.add(str.replace(key, ""));}	}}return list;}/*** 训练训练集* @param res* @param trainDataSet* @return*/private static Map<String, Double> trainData(Map<String, Double> res,Map<String, String[]> trainDataSet) {res.putAll(trainData(trainDataSet.size(),0, res, trainDataSet));return res;}/*** 训练训练集* @param initSize 初始数组长度* @param roundNb 轮数* @param res 结果map* @param trainDataSet 训练数据集* @return*/private static Map<String, Double> trainData(int initSize,int roundNb,Map<String,Double> res,Map<String,String[]> trainDataSet) {//统计
//		System.out.println("roundNb = " + roundNb);for (String[] itemArr : trainDataSet.values()) {//获取当前用户的收藏item集合,也就是获取项集String tempStr = "";for (String item:itemArr) {tempStr += item;}//针对项集统计频率if (roundNb == 0) {for (String item:itemArr) {if (res.get(item) == null) {res.put(item, 1.0);} else {res.put(item, res.get(item) + 1.0);}	}} else {for (String resStr : res.keySet()) {//如果字符串长度不为roundNb+1就说明不是当前的那层项集if (resStr.length() != roundNb + 1) {continue;}boolean contains = true;for (char ch : resStr.toCharArray()) {if (tempStr.indexOf(ch) == -1) {contains = false;break;}}if (contains){res.put(resStr, res.get(resStr) + 1.0);}}}}//筛选for (String str:res.keySet()) {if (res.get(str) < MIN_SUPPORT * initSize) {res.remove(str);}}//新增Map<String,Double> newRes = new ConcurrentHashMap<String, Double>();for (String str:res.keySet()) {if (str.length() != roundNb + 1) {continue;}for (String substr:res.keySet()) {//每次获取一位,之后叠加if (substr.length() != 1) {continue;}String lastChar = str.charAt(str.length() - 1) + "";//判断大小,只允许字符串递增排列,如AC,AB,AD,CDif(substr.compareTo(lastChar) > 0) {newRes.put(str+substr, 0.0);}}}if (newRes.isEmpty()) {return res;} else {res.putAll(newRes);return trainData(initSize,roundNb+1,res,trainDataSet);}}public static void main(String[] args) {Map<String,String[]> trainDataSet = new ConcurrentHashMap<>();trainDataSet.put("userB", new String[]{"A","B","C"});trainDataSet.put("userC", new String[]{"A","D"});trainDataSet.put("userD", new String[]{"A","B","C","D"});trainDataSet.put("userE", new String[]{"A","B","E"});trainDataSet.put("userF", new String[]{"A","B","C","E"});System.out.println("推荐结果为" + getResult(trainDataSet,new String[]{"A","B"}));}
}

运行截图
在这里插入图片描述

—————————————未完待续,代码解析之后再讲—————————————————————

这篇关于程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882535

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G