活动介绍

影响规则发现中修剪派生部分规则

立即解锁
发布时间: 2025-08-22 02:26:30 阅读量: 2 订阅数: 16
### 影响规则发现中修剪派生部分规则 #### 1. 引言 探索性规则发现旨在从可用样本数据中,检索出满足用户定义约束条件的所有隐式模式和规律。例如关联规则发现,多数方法寻找前件 A 和后件 C 存在关联的规则 A → C。然而,当找到一个这样的规则时,可能会发现许多派生且可能无趣的规则 A′ → C′。这些派生规则的前件和后件的关联,仅仅是因为 A 和 C 之间的关联。比如,若 A 和 C 相关,那么对于与 A、C 都无关的项 B,AB 也会与 C 相关。 目前已有不少研究致力于自动识别和丢弃这类派生规则。例如,闭项集技术可识别那些移除某些元素而不改变规则支持度的规则;最小改进技术能识别移除某些元素而不降低规则置信度的规则。但由于探索性规则发现是基于样本数据来推断总体特征,规则可能因抽样波动而显得有趣。因此,也会应用统计测试来评估是否有证据表明移除元素会显著改变规则相对于总体的状态。不过,这些技术仅能处理因添加无关或无效元素而产生的派生规则。 实际上,还存在另一种派生规则,可能会产生大量对用户来说可能无趣的规则。对于规则 AB → C,若其并非从其他规则派生而来,且前件和后件存在关联,那么 A 和 B 可能分别仅因 AB 和 C 的关联而与 C 相关。此时,A → C 和 B → C 可能就是探索性规则发现系统会发现的潜在无趣的派生规则。 例如,零售商试图识别可能购买新产品的客户群体。应用影响规则发现和规则过滤器后,得到两条规则: - District = A → profit(coverage = 200, mean = 100) - District = A & age < 50 → profit(coverage = 100, mean = 200) 虽然这两条规则经规则过滤器判定为“显著”,但第一条规则具有误导性。实际上,属于地区 A 且年龄大于 50 岁的客户不会产生利润。零售商应更关注地区 A 中年龄小于 50 岁的客户群体,保留第一条规则可能会使决策者困惑。 影响规则发现是探索性规则发现的一种,其规则的后件是未离散化的定量变量(目标),并通过其分布来描述。本文将在影响规则发现的背景下研究第二种派生规则的识别。 #### 2. 探索性规则发现 许多机器学习系统从可用数据中发现单个模型,期望该模型在未知未来数据上最大化某个有趣性目标函数,并基于此模型进行预测或分类。然而,可能存在性能相当的替代模型,且判断模型优劣的标准因应用场景而异。探索性规则发现技术通过搜索满足用户定义约束条件的多个模型,并将这些模型呈现给用户,提供更多选择,从而实现更大的灵活性。 探索性规则发现技术可分为命题规则发现和分布后件规则发现。命题规则发现寻找仅含定性属性的规则,命题规则由布尔条件组成;分布后件规则发现寻找后件为未离散化定量变量的规则,其未离散化定量属性的状态或性能通过分布描述。关联规则发现、对比集发现和相关规则发现属于命题探索性规则发现,而影响规则发现或定量关联规则发现属于分布后件规则发现。分布后件规则能更好地描述定量变量和定性属性之间的相互关系。 由于命题规则发现和分布后件规则发现存在差异,它们在规则修剪和优化技术上也有内在区别。研究人员已付出大量努力开发规则修剪和优化技术。 探索性规则发现的一些关键概念定义如下: 1. 对于命题规则发现,记录是应用布尔谓词(条件)的元素;对于分布后件规则发现,记录是一对 < c, v >,其中 c 是非空布尔条件集,v 是用户感兴趣的定量变量的值集。 2. 若规则 r1 的主体是规则 r2 主体的子集,则 r1 是 r2 的父规则。若 r1 主体的基数比 r2 小 1,则 r2 是 r1 的直接父规则;否则,r2 是 r1 的非直接祖先规则。 3. 用 coverset(A) 表示满足条件 A 的记录集。若记录 x 在 coverset(A) 中,则称 x 被 A 覆盖。若 A 为空集,coverset(A) 包含数据库中的所有记录。Coverage(A) 是被 A 覆盖的记录数,即 coverage(A) = |coverset(A)|。 #### 3. 影响规则发现 本文的影响规则发现算法基于 OPUS 搜索算法构建,该算法能成功发现满足用户指定约束条件的前 k 个影响规则。 k - 最优影响规则发现的相关术语定义如下: 1. 影响规则形式为 A → target,目标通过覆盖度、均值、方差、最大值、最小值、总和和影响等指标描述。例如: Address = Brighton & profession = programmer → income (coverage : 23%, mean : 60000, variance : 4000, max : 75000, min : 44000, sum : 1380000, impact : 3903.98) 2. 影响是 Webb 提出的有趣性度量:impact(A → target) = (mean(A → target) - targ) × coverage(A)。 3. k - 最优影响规则发现任务是一个 6 元组:KOIRD(D, C, T, M, λ, k)。 - D:非空记录集,即数据库。记录是一对 < c, v >,c ⊆ C,v 是 T 的值集。D 是全局总体 D 的可用样本。 - C:非空布尔条件集,是影响规则前件的可用条件集,由 D 中的给定数据生成。 - T:用户感兴趣的变量的非空集。 - M:约束集,规则必须满足的标准。 - λ:{X → Y} × {D} → R 是从规则和数据库到值的函数,定义了一个有趣性度量,λ(X → Y, D) 值越大,规则在该数据库中的有趣性越高。 - k:用户指定的整数,表示规则发现任务最终解决方案集中的规则数量。 影响规则发现的原始算法伪代码如下: ```p ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

#ifndef _INI_DOCUMENT_H_ #define _INI_DOCUMENT_H_ #define ASCIILINESZ 1024 //每行文本能容纳文字的最大长度 #define ASCIISECTIONSZ 256 //每个Section的最大长度 #define ASCIIKEYSZ 256 //每个Key的最大长度 #define ASCIIVALUESZ 256 //每个Value的最大长度 #define ASCIIDESCSZ 512 //每个注释的最大长度 #include "RBTree.h" #include "Section.h" #include "Key.h" #include "Value.h" namespace INI { using KeyMap = RBTREE::RBTree<Key, Value>; using SectionMap = RBTREE::RBTree<Section, KeyMap>; class IniDocument { typedef enum class _line_status_ : unsigned char { LINE_ERROR,//未知行 LINE_DESCRIPTION,//注释行 LINE_SECTION,//节点行 LINE_KEY//键值行 } line_status; public: IniDocument(const char* _szFile); ~IniDocument(); KeyMap& operator[](const char* _szSection); void Clear(); private: void load(); line_status parse(char* _szLine, char* _szSection, char* _szKey, char* _szValue, char* _szDesc); private: char* m_szFile;//文件路径 SectionMap m_sectionMap; //存储section的映射 }; } #include "../inc/IniDocument.h" INI::IniDocument::IniDocument(const char* _szFile) { if (!_szFile || _szFile[0] == '\0') { //错误处理: 文件路径不能为空 throw("文件路径不能为空."); } size_t nLen = strlen(_szFile); size_t nSize = ((nLen + 1) + 3) & ~3; if (nLen >= _MAX_PATH) { //错误处理: 文件路径过长 throw("文件路径过长."); } m_szFile = new char[nSize]; memcpy(m_szFile, _szFile, nLen + 1); load(); //加载文件内容到内存 } INI::IniDocument::~IniDocument() { Clear(); } INI::KeyMap& INI::IniDocument::operator[](const char* _szSection) { //返回对应Section的映射 return m_sectionMap[Section(_szSection)]; } void INI::IniDocument::Clear() { if (m_szFile) { delete[] m_szFile; m_szFile = nullptr; } for(SectionMap::iterator it=m_sectionMap.begin();it!=m_sectionMap.end();++it) { //清空每个Section的映射 it->second.Clear(); } m_sectionMap.Clear(); //清空Section映射 } void INI::IniDocument::load() { /*特别注意 读出的ini内容一般都是utf-8,而保存在内存中的内容也是utf-8.直接保存到文件没问题 但如果查找就会出问题。要把查找的中文字串 转成utf8再查找才能找到 但每次查找section或者key都转一次utf8就浪费了 解决方案: 从文件解析出来的utf8内容转回普通char字串。再保存到内存中,这样代码直接就能查找到。 而保存回文件的时候,把内存的字串转回utf8再保存即可 如果不想频繁转换,直接使用ANSI编码文件即可 */ #pragma warning(disable:4996) FILE* pFile = fopen(m_szFile, "r"); #pragma warning(default:4996) if (!pFile) { printf("<IniDocument::load> 打开Ini文件失败,路径: %s\n", m_szFile); return; } char szLineBuffer[ASCIILINESZ] = { 0 };//把文件中的内容逐行读入此内存中 char szSection[ASCIISECTIONSZ] = { 0 };;//把节点解析完成后放入此内存中 char szKey[ASCIIKEYSZ] = { 0 };;//把Key解析完成后放入此内存中 char szValue[ASCIIVALUESZ] = { 0 };;//把Value解析完成后放入此内存中 char szDesc[ASCIIDESCSZ] = { 0 };;//把注释读入此内存中 size_t nLines = 0; //记录当前的行数 size_t nLen = 0; //记录当前行的长度 KeyMap* pKeyMap = nullptr; //用于存储当前解析的Key映射 Desc desc; //用于存储当前解析的全行注释 while (fgets(szLineBuffer, ASCIILINESZ, pFile))//每次读取一行内容 { ++nLines; //行数自增 if (szLineBuffer[0] == '\n')continue;//如果取出来的内容第一个字符就是换行符,无条件取下一行内容 nLen = strlen(szLineBuffer);//更新行内容的字串长度 if (szLineBuffer[nLen - 1] != '\n' && !feof(pFile)) { //如果此行的结束符 不是换行符\n 并且 文件并未结束 -> 如果都满足条件,说明此行肯定是太长了。应当调整行的最大长度。默认:ASCIILINESZ=1024 printf("<IniDocument::load> 行 %zu 内容过长,请检查文件内容.\n", nLines); continue; //跳过此行 } //开始进行字串解析 switch (parse(szLineBuffer, szSection, szKey, szValue, szDesc))//进入解析过程 { case line_status::LINE_ERROR://未知行 break; case line_status::LINE_DESCRIPTION://全行注释 { desc = szLineBuffer; //将注释内容存储到Desc对象中 break; } case line_status::LINE_SECTION://节点 { Section section(szSection); //创建Section对象 if(desc.m_szDesc)section.m_vecDesc[0] = std::move(desc); //将注释内容存储到Section对象中 if (szDesc[0] != '\0')section.m_vecDesc[1] = szDesc; //如果有第二个注释内容,存储到Section对象中 pKeyMap = &m_sectionMap[section]; //获取当前Section映射 break; } case line_status::LINE_KEY://键值 { if (!pKeyMap) { printf("<IniDocument::load> 键值行 %zu 解析失败<没有Section>,请检查文件内容.\n", nLines); continue; //如果没有Section映射,跳过此行 } Key key(szKey); //创建Key对象 Value value(szValue); //创建Value对象 if (desc.m_szDesc) //如果有全行注释内容 { //将注释内容存储到Key对象中 key.m_vecDesc[0] = std::move(desc); } if(szDesc[0] != '\0') //如果有行块注释内容 { key.m_vecDesc[1] = szDesc; //将行块注释内容存储到Key对象中 } (*pKeyMap)[key] = std::move(value); //将Key和Value存储到当前Section映射中 break; } default: break; } szLineBuffer[0] = 0; //清空行内容 szSection[0] = 0; //清空Section内容 szKey[0] = 0; //清空Key内容 szValue[0] = 0; //清空Value内容 szDesc[0] = 0; //清空注释内容 } fclose(pFile); //关闭文件 } INI::IniDocument::line_status INI::IniDocument::parse(char* _szLine, char* _szSection, char* _szKey, char* _szValue, char* _szDesc) { #pragma warning(disable:4996) line_status sta = line_status::LINE_ERROR;//分析结果 size_t nCount = 0; //记录sccanf匹配的数量 if (_szLine[0] == '#' || _szLine[0] == ';')//开头就是单行注释的解析符 {//说明全行都是注释 sta = line_status::LINE_DESCRIPTION; } //开始解析节点 Section //(必须遵守一个规则,从有到无,比如结尾带分号的应该先做匹配。 //然后再到结尾不带分号的。因为如果先匹配不带分号的,带分号的也会匹配得上。就会莫名多个分号了) //例如: key = value; 如果先匹配无分号的,那么值就是 value; 达不到预期效果,结尾多了个分号 else if ( //以下匹配 节点(后面带注释) (nCount = sscanf(_szLine, "[%[^]]]%[^\n]", _szSection, _szDesc)) == 2 ||//例子: [section01]#this is description 01或者[section01];this is description 01 (nCount = sscanf(_szLine, "[%[^]]]%[^\n]", _szSection, _szDesc)) == 1//例子: [section] ) { sta = line_status::LINE_SECTION; } //开始解析键值 key = value else if ( //(必须遵守一个规则,从有到无,比如结尾带分号的应该先做匹配。然后再到结尾不带分号的。因为如果先匹配不带分号的,带分号的也会匹配得上。就会莫名多个分号了) (nCount = sscanf(_szLine, "%[^=]=%[^;]%[^\n]", _szKey, _szValue, _szDesc)) == 3 || //例子: key1=value1;this is description 01 (nCount = sscanf(_szLine, "%[^=]=%[^#]%[^\n]", _szKey, _szValue, _szDesc)) == 3 ||//例子: key2=value2#this is description 01 (nCount = sscanf(_szLine, "%[^=]=%[^\n]", _szKey, _szValue)) == 2//例子: key1=value1 ) { sta = line_status::LINE_KEY; } #pragma warning(default:4996) return sta; } 总体架构就是这样的,帮我分析一下有没有问题

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

探索数据库需求分析工具:【提高效率】的关键利器

![探索数据库需求分析工具:【提高效率】的关键利器](https://xebrio.com/wp-content/uploads/2021/11/what-are-technical-requirements-in-project-management-02-980x439-1.png) # 摘要 数据库需求分析是确保数据库系统设计和实施符合业务需求的关键步骤。本文首先阐述了数据库需求分析的重要性及其基本理论,包括定义、目标、方法论以及面临的挑战和应对策略。然后,本文探讨了各种传统和现代的需求分析工具,以及在大数据、云和AI环境中的高级应用。通过对比不同工具的特点和使用技巧,本文旨在指导数据

FUNGuild与微生物群落功能研究:深入探索与应用

![FUNGuild与微生物群落功能研究:深入探索与应用](https://d3i71xaburhd42.cloudfront.net/91e6c08983f498bb10642437db68ae798a37dbe1/5-Figure1-1.png) # 摘要 FUNGuild作为一个先进的微生物群落功能分类工具,已在多个领域展示了其在分析和解释微生物数据方面的强大能力。本文介绍了FUNGuild的理论基础及其在微生物群落分析中的应用,涉及从数据获取、预处理到功能群鉴定及分类的全流程。同时,本文探讨了FUNGuild在不同环境(土壤、水体、人体)研究中的案例研究,以及其在科研和工业领域中的创

【进阶知识掌握】:MATLAB图像处理中的相位一致性技术精通

![相位一致性](https://connecthostproject.com/images/8psk_table_diag.png) # 摘要 MATLAB作为一种高效的图像处理工具,其在相位一致性技术实现方面发挥着重要作用。本文首先介绍MATLAB在图像处理中的基础应用,随后深入探讨相位一致性的理论基础,包括信号分析、定义、计算原理及其在视觉感知和计算机视觉任务中的应用。第三章重点阐述了如何在MATLAB中实现相位一致性算法,并提供了算法编写、调试和验证的实际操作指南。第四章对算法性能进行优化,并探讨相位一致性技术的扩展应用。最后,通过案例分析与实操经验分享,展示了相位一致性技术在实际图

【FPGA信号完整性故障排除】:Zynq7045-2FFG900挑战与解决方案指南

![【FPGA信号完整性故障排除】:Zynq7045-2FFG900挑战与解决方案指南](https://www.protoexpress.com/wp-content/uploads/2024/04/Parallel-termination-_diff.-pair-1-1024x421.jpg) # 摘要 随着电子系统对性能要求的日益提高,FPGA信号完整性成为设计和实现高性能电子系统的关键。本文从FPGA信号完整性基础讲起,分析了Zynq7045-2FFG900在高速接口设计中面临的信号完整性挑战,包括信号反射、串扰、电源地线完整性和热效应等问题,并探讨了硬件设计因素如PCB布局和元件选

【紧急行动】:Excel文件损坏,.dll与.zip的终极解决方案

![【紧急行动】:Excel文件损坏,.dll与.zip的终极解决方案](https://img-blog.csdnimg.cn/direct/f7dfbf65d64a4d9abc605a79417e516f.png) # 摘要 本文针对Excel文件损坏的成因、机制以及恢复策略进行了全面的研究。首先分析了Excel文件的物理与逻辑结构,探讨了.dll文件的作用与损坏原因,以及.zip压缩技术与Excel文件损坏的关联。接着,介绍了.dll文件损坏的诊断方法和修复工具,以及在损坏后采取的应急措施。文中还详细讨论了Excel文件损坏的快速检测方法、从.zip角度的处理方式和手动修复Excel文

【VB.NET GUI设计】:WinForms与WPF设计与实现的艺术

![【VB.NET GUI设计】:WinForms与WPF设计与实现的艺术](https://www.der-wirtschaftsingenieur.de/bilder/it/visual-studio-c-sharp.png) # 摘要 本文系统地介绍了VB.NET环境下的图形用户界面(GUI)设计,重点讲解了WinForms和WPF两种技术的使用与进阶。首先,概述了VB.NET在GUI设计中的作用,并对WinForms设计的基础进行了深入探讨,包括事件驱动编程模型、表单和控件的运用、界面布局技巧以及数据绑定和事件处理。随后,转向WPF设计的进阶知识,强调了M-V-VM模式、XAML语法

高斯过程可视化:直观理解模型预测与不确定性分析

# 摘要 高斯过程(Gaussian Processes, GP)是一种强大的非参数贝叶斯模型,在机器学习和时间序列分析等领域有着广泛应用。本文系统地介绍了高斯过程的基本概念、数学原理、实现方法、可视化技术及应用实例分析。文章首先阐述了高斯过程的定义、性质和数学推导,然后详细说明了高斯过程训练过程中的关键步骤和预测机制,以及如何进行超参数调优。接着,本文探讨了高斯过程的可视化技术,包括展示预测结果的直观解释以及多维数据和不确定性的图形化展示。最后,本文分析了高斯过程在时间序列预测和机器学习中的具体应用,并展望了高斯过程未来的发展趋势和面临的挑战。本文旨在为高斯过程的学习者和研究者提供一份全面的

【MATLAB词性标注统计分析】:数据探索与可视化秘籍

![【MATLAB词性标注统计分析】:数据探索与可视化秘籍](https://img-blog.csdnimg.cn/097532888a7d489e8b2423b88116c503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMzNjI4MQ==,size_16,color_FFFFFF,t_70) # 摘要 MATLAB作为一种强大的数学计算和可视化工具,其在词性标注和数据分析领域的应用越来越广泛。本文