基于粗糙集理论的数据属性约简算法工具箱
项目介绍
本项目是一个基于 MATLAB 开发的数据挖掘工具箱,专注于粗糙集理论(Rough Set Theory)中最核心的应用——属性约简(Attribute Reduction)。该系统能够从包含冗余、噪声或不一致信息的高维数据集中,提取出能够保持原分类能力不变的最小特征子集(Reduct)。
项目源码采用纯 MATLAB 语言编写,未使用任何第三方黑盒工具箱,所有核心算法(依赖度计算、贪婪搜索、区分矩阵构建)均从底层数学逻辑实现。这使得代码具有极高的可读性和可扩展性,非常适合用于学术研究、算法教学以及机器学习特征工程阶段的数据预处理。
主要功能特性
系统主要包含数据模拟、预处理、核心指标计算、经典与精确约简算法实现以及结果可视化五大模块:
- 数据生成与离散化预处理:能够生成包含冗余属性的模拟决策表,并内置数据离散化引擎,将连续型数值自动映射为粗糙集算法可处理的离散符号。
- 粗糙集基础指标计算:底层实现了不可分辨关系(Indiscernibility Relation)、正域(Positive Region)以及属性依赖度(Dependency Gamma)的精确计算。
- QuickReduct 经典算法:实现了基于依赖度的贪婪启发式搜索算法,能够快速收敛至一个有效的属性约简子集。
- 基于差别矩阵的精确/启发式算法:构建对象间的差别矩阵(Discernibility Matrix),能够准确识别核心属性(Core),并基于差别信息覆盖策略寻找约简集。
- 过程可视化与验证:提供约简前后依赖度对比验证,并图形化展示搜索算法的收敛曲线及差别矩阵的稀疏分布。
系统要求及使用方法
系统要求
- 开发环境:MATLAB R2016a 及以上版本
- 依赖工具箱:无(纯原生代码实现)
使用方法
- 确保 MATLAB 当前工作路径包含项目文件。
- 直接运行主函数入口(
main.m 对应的函数)。 - 程序将自动执行数据生成、计算和绘图,并在命令行窗口(Command Window)输出详细的计算过程日志和结果统计。
算法实现细节与核心逻辑
本项目在 main 函数及其子函数中详细实现了以下逻辑:
1. 数据准备与离散化
- 模拟数据:程序内置了一个硬编码的决策表矩阵,包含浮点数和整数混合数据,特别设计了冗余列(Condition Attributes)和不一致样本,以测试算法的鲁棒性。
- 离散化逻辑:通过
discretize_data 子函数处理数据。对于连续数值属性,通过 linspace 和 histcounts 进行等宽分箱(默认分为3个区间),将其转换为整数索引;对于原本就是整数且类别数较少的列,则保持不变。 - 数据集划分:自动将数据集的最后一列识别为决策属性(D),其余列识别为条件属性(C)。
2. 依赖度计算 (Dependency Calculation)
这是整个系统的核心数学引擎,由
calculate_dependency 函数实现:
- 等价类划分:利用
unique 函数对当前选定的条件属性子集进行行分组,快速构建不可分辨关系。 - 正域判定:遍历每一个等价类(Group),检查该组内的所有样本是否具有相同的决策属性值。如果决策值唯一,则该组样本属于正域(Positive Region)。
- 计算公式:依赖度 $gamma$ 计算为正域内样本总数除以样本总数。
3. QuickReduct 算法
由
algorithm_quickreduct 函数实现,采用前向特征选择策略:
- 初始化:从空集开始。
- 迭代过程:在每一轮迭代中,遍历所有尚未被选中的属性,计算将该属性加入当前集合后的新依赖度。
- 选择策略:贪婪地选择能够使依赖度增量最大的属性加入候选集。
- 停止条件:当当前集合的依赖度达到全属性集的依赖度(Global Gamma)时,算法停止,输出约简集。
4. 差别矩阵算法 (Discernibility Matrix)
由
algorithm_discernibility_matrix 函数实现,流程如下:
- 矩阵构建:采用 $O(N^2)$ 复杂度遍历所有样本对。仅当两个样本的决策属性值不同($D(i) neq D(j)$)时,记录它们在哪些条件属性上存在差异。
- Core 提取:如果在某一对样本的差异属性集中,只包含一个属性(单元素集合),则该属性被标记为核心属性(Core),它是任何有效约简的必选成分。
- Reduct 构造:
* 以 Core 为初始约简集。
* 检查 Core 是否能区分所有必须区分的样本对。
* 对于未被覆盖的样本对,采用
频率优先的贪婪策略:统计各属性在所有差异集合中出现的频率,优先选择出现频率最高的属性加入约简集,直到所有差异对都被覆盖。
5. 结果分析与可视化
- 一致性验证:程序计算并比对全集依赖度与约简集依赖度。如果两者的差值小于
1e-6,则通过“无损约简”验证。 - 收敛曲线图:绘制 QuickReduct 算法在每一步迭代中依赖度的上升趋势,直观展示算法的搜索效率。
- 差别矩阵热图:使用
spy 函数绘制差别矩阵的稀疏分布图(Binary Matrix),展示样本间冲突分布的密集程度。