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

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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

程序人生--拔丝地瓜

一个会享受生活的人,难免会执迷于探索“三餐茶饭,四季衣裳”的朴素涵义。如今在这繁杂喧闹、竞争激烈的社会环境里,如何才能从周而复始的生活中挖掘出一点儿期待!这是一个仁者见仁智者见智的开放性话题。对于大部分的人来说,看电影、运动、旅游、美食、加班....是假日的备选安排。 春节临走之前,再次尝试“拔丝地瓜”,为何要强调“再次”二字?因为这道甜菜我已经尝试过很多次,失败与成功都经历过。十几年的烧饭经历

C++标准模板库STL介绍

STL的六大组成部分 STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法,使得 C++ 编程变得更加高效和方便。STL 包括了 6 大类组件,分别是算法(Algorithm)、容器(Container)、空间分配器(Allocator)、迭代器(Iterator)、函数对象(Functor)、适配器(Adapter)

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

数据挖掘和数据分析

数据挖掘(Data Mining)和数据分析(Data Analysis)是现代计算机科学中两个重要的领域。它们虽然紧密相关,但在概念和应用上有一定的区别。下面将从定义、主要技术、应用领域和挑战四个方面详细阐述这两个领域。 一、定义 **数据挖掘**: 数据挖掘是指从大量数据中提取潜在的、有价值的信息和知识的过程。它综合了统计学、机器学习、数据库技术等多种学科的技术和方法。 **数据分析**