资讯动态

粗糙集在配电网故障定位中的应用:决策表约简到规则匹配实战

发布时间:2026/10/3 9:08:28 来源:尧图企业网站定制
简介面向配电网故障定位研究者和有一定Matlab基础的读者该源码包利用粗糙集理论处理故障信息的不确定性与不完备性帮助快速判别故障可能发生的区域。压缩包共4个文件、约5KB包含Matlab主程序.m、两个文本数据文件.txt及一个Matlab自动备份文件.asv规模精简便于直接运行和查看。已有519人学习下载适用于电力系统课程设计、故障诊断方向入门与原理验证。代码覆盖数据预处理、属性选择、等价类划分、规则生成到故障定位等完整流程读者可在Matlab中运行并观察不同故障场景的响应结合粗糙集模型理解规则构建逻辑或在此基础上调整特征与阈值进一步适配不同配电网拓扑和运行工况。整个流程直观清晰便于二次开发。1. 粗糙集在配电网故障定位里到底解决什么问题配电网故障定位的核心难点不是缺数据而是数据太多太杂。馈线出故障后FTU、故障指示器上报的过流、电压跌落、开关变位信号混在一起还经常带缺失和误报。传统逻辑判据要手工梳理每一条规则遇到分布式电源接入、多分支拓扑就不好使。粗糙集Rough Set的价值在于它能直接吃这些离散化后的运行状态表自动删掉冗余属性、抽取最小决策规则不依赖先验概率和隶属度。做配电网故障定位用粗糙集最靠谱的切入点是离线建规则库、在线做匹配定位。下面按这条路径讲清楚建模、约简、推理和踩坑给要动手用MATLAB复现的人一条完整路线。2. 把故障定位问题建模成决策表字段、量化和数据准备2.1 决策表的结构条件属性与决策属性怎么定粗糙集算法不认波形只认表格。它处理的是一张二维决策表每一行是一次故障事件每一列是一个属性。条件属性是故障发生时可观测到的特征量决策属性是你想定位的区段编号。这里最忌讳的是把原始录波直接塞进去必须先把故障现象整理成结构化状态量。以一条典型的10kV中性点不接地馈线为例我会把馈线按分段开关分成4到6个区段每个分段开关对应一个FTU。条件属性初步定成这样S1、S2、S3各分段开关是否检测到过流取值0或1U母线电压是否越限取值0或1I0零序电流是否越限取值0或1故障指示器动作标记取值0或1决策属性就是区段编号F从1到N。不要试图把所有电气量都装进表里。粗糙集的特点是能挑出有用信息但硬塞几十个高度相关的属性会让约简过程变长还可能选出过拟合的规则。我一般先保留上述6到8个属性跑一轮约简看哪个属性被删掉再决定要不要补充。这里有个容易忽略的点决策属性必须互斥且完备。一个故障必须只能落在一个区段不能出现“区段2和区段3交界处”这种模糊标签。如果两个区段共享一个FTU测点建议把测点归到上游区段或者干脆合并区段否则规则会冲突。常见做法是先画单线图手工把每个区段的边界和对应的FTU测点列出来再定属性。2.2 故障特征量化电压、电流、开关状态的离散化粗糙集基础理论里条件属性可以是连续值但实际算法都要求离散化。离散化质量直接决定约简结果的好坏。连续量比如电流、电压需要转成有限的档位开关状态本身已经是0/1不用动。我在做10kV配电网短路电流仿真时会对线路不同位置设置金属性短路和经过渡电阻短路记录各测点的故障电流有效值。然后电流按标幺值分档小于0.1记为00.1到0.5记为1大于0.5记为2。电压大于0.9记为00.7到0.9记为1小于0.7记为2。这里0.1和0.5不是固定值要结合负荷电流和短路容量来定。如果线路负荷重正常电流就比较高再用0.1当阈值会把正常工况误判成过流。更稳妥的办法是用等频离散化把每个属性从小到大排序按分位数切成等样本数的几段。这样断点会自适应落在样本稀疏的地方不会因为个别极端值影响分档。Matlab里的discretize加上quantile就能实现代码在下一节。要注意等频离散化只适用于连续属性像开关状态这种本来就二值的属性不能参与。零序电流要单独处理。经消弧线圈接地系统里单相接地时零序电流方向和幅值跟中性点不接地系统差异很大不能简单地跟相电流混在一个属性里。我一般给零序电流只设“越限/不越限”一档不区分幅值因为故障定位主要靠故障点上下游的零序方向差异而不是大小。2.3 构建样本集的Matlab代码从故障仿真到决策表下面这段代码演示怎么把仿真数据整理成粗糙集能用的决策表。建议把仿真产生的原始曲线先导出成CSV再在MATLAB里按测点聚合不要手工录入。% 构造决策表 decision_table % 条件属性列S1过流、S2过流、S3过流、S4过流、母线低电压U % 决策属性列fault_zone取值1~4 % 示例数据实际由10kV配电网短路电流仿真批量生成 % 每行代表一次故障样本前4列是开关过流状态第5列是低电压标记第6列是故障区段 raw [ 1 1 0 0 1 2; % S1,S2过流低电压 - 区段2 1 0 0 0 1 1; % 仅S1过流低电压 - 区段1 0 1 0 0 1 3; % 仅S2过流低电压 - 区段3 1 1 1 0 0 3; % S1,S2,S3过流电压正常 - 区段3 0 0 0 0 1 0; % 无过流低电压 - 母线侧区段 ]; % 分离条件属性与决策属性 X raw(:, 1:end-1); Y raw(:, end); % 检查不一致样本条件相同但决策不同 [C, ia, ic] unique(X, rows); if length(ia) ~ size(X, 1) disp(存在条件相同但决策不同的样本需要先处理); % 打印冲突对 for i 1:size(X,1) for j i1:size(X,1) if isequal(X(i,:), X(j,:)) Y(i) ~ Y(j) fprintf(冲突样本: %d 和 %d, 决策分别为 %d 和 %d\n, i, j, Y(i), Y(j)); end end end end % 保存为mat文件后续约简使用 save(decision_table.mat, X, Y);这段代码的逻辑是先把仿真结果排成矩阵前几列是条件属性最后一列是决策属性然后用unique(X,rows)检查有没有条件组合重复出现。ia返回每个唯一组合第一次出现的行号如果length(ia)小于总行数说明有重复条件。此时还要看重复行对应的Y是否相同相同说明是冗余样本可以删掉多出来的行不同说明数据有冲突必须先解决不然约简出来的规则会自相矛盾。注意示例里第3行和第4行都是区段3但条件不同这不是冲突是不同故障工况。真正要查的是“条件完全相同、决策不同”的行。实际仿真时数据有几百行不可能一行行看就用这段代码自动检查。save默认保存成v7格式兼容性好不需要加-v7.3。2.4 样本覆盖度为什么每个区段都要有多工况样本这一步很多人会忽略。粗糙集规则的强度取决于样本覆盖如果某个区段只投一种故障样本约简出来的规则就只对那一种工况有效。我在仿真里对每个区段会设置至少三组过渡电阻0、20欧姆、100欧姆、两组负荷水平、两种故障类型单相接地和两相短路这样每个区段都有几十条样本。为什么要这么细因为配电网故障定位规则本质上是“哪几个开关动作了故障就在哪个区段”。但单相接地时过流特征不明显全靠零序方向所以仅仅用开关过流状态会丢失信息。多工况样本能逼着约简算法把零序方向、电压等信息保留下来。如果你手头没有仿真模型可以用历史故障录波加上人工标注来补样本但要注意样本时间跨度要覆盖不同季节负荷否则离散化断点会偏移。我见过不少项目拿一个月的录波建库夏天负荷一上来规则全失效这一点在第5章还要细说。3. 属性约简与规则提取核心算法的Matlab实现3.1 区分矩阵与属性重要度约简不是随便删列决策表建好后条件属性可能有冗余。比如S1过流和S2过流高度相关一个动作另一个基本也动作两个都保留不会增加区分能力只会让规则变复杂。约简要找到最小的属性子集使得它能像完整属性集一样区分所有不同决策的样本。区分矩阵discernibility matrix是理解粗糙集约简的钥匙。对任意两个决策不同的样本i和j找出所有能区分它们的属性把这些属性记为一个集合所有这样的集合放在一起就是区分矩阵。一个属性子集如果跟每个区分项都有交集它就能区分所有样本对就叫一个约简。核core是出现在所有区分项里的属性这些属性删掉任何一个都会让区分能力下降。求最小约简是NP难问题属性多时不能暴力搜索。配电网场景属性个数通常不超过15个我一般用贪心算法从核属性开始每次加入当前覆盖区分项最多的属性直到整个子集能区分所有样本对。这样得到的不是理论最优但工程上足够用而且速度快。如果你想要更接近最优可以加一个随机扰动反复跑几次取属性个数最少的。另一种思路是属性重要度逐个试探删掉某个属性后决策表里不一致样本数增加了多少。增加越多说明这个属性越重要。这个指标比区分矩阵更直观可以配合贪心使用。我会先用区分矩阵求核和贪心约简再用属性重要度做一次交叉验证。两个结果差异特别大时多半是数据里有噪声样本先回头修数据。3.2 求约简与核的代码区分矩阵法这里给出可直接复制的函数。它接受条件属性矩阵X和决策属性列Y返回核属性下标和贪心约简下标。function [core_set, reduct] rough_set_reduct(X, Y) % 粗糙集属性约简区分矩阵法贪心 % X: 决策表条件属性离散值n x m % Y: 决策属性n x 1 % 返回 core_set: 核属性下标 reduct: 贪心约简下标 [n, m] size(X); % 构建区分项只记录属性下标不存全矩阵 discern {}; for i 1:n-1 for j i1:n if Y(i) ~ Y(j) % 找出i,j取值不同的属性 diff_attrs find(X(i,:) ~ X(j,:)); if ~isempty(diff_attrs) discern{end1} diff_attrs; end end end end % 求核出现在所有区分项里的属性 if isempty(discern) core_set []; reduct []; return; end candidate discern{1}; for k 2:length(discern) candidate intersect(candidate, discern{k}); end core_set candidate; % 贪心从核开始扩展 selected core_set; remaining setdiff(1:m, selected); while ~is_discernible(X, Y, selected) ~isempty(remaining) best_attr remaining(1); best_gain -1; for a remaining gain covered_pairs(X, Y, [selected, a]); if gain best_gain best_gain gain; best_attr a; end end selected [selected, best_attr]; remaining setdiff(remaining, selected); end reduct selected; end function flag is_discernible(X, Y, attrs) % 检查用attrs能否区分所有不同决策样本 flag true; n size(X,1); for i 1:n-1 for j i1:n if Y(i) ~ Y(j) if isequal(X(i,attrs), X(j,attrs)) flag false; return; end end end end end function cnt covered_pairs(X, Y, attrs) % 统计用attrs能区分的不同决策样本对数量 cnt 0; n size(X,1); for i 1:n-1 for j i1:n if Y(i) ~ Y(j) ~isequal(X(i,attrs), X(j,attrs)) cnt cnt 1; end end end end这段代码是常用的实现。外层双重循环构建区分项时只保留那些决策不同的样本对因为决策相同的样本对不需要区分。find(X(i,:)~X(j,:))返回的是两个样本取值不同的列下标这个下标组合就是区分项。如果某一对不同决策样本在所有属性上取值都相同那它们本身就是冲突样本diff_attrs为空不会加入区分项但这样的冲突会在后续规则提取时暴露出来应该回到第2章修数据。求核时intersect逐个取交集最后得出的属性就是所有区分项共有的属性。如果区分项很多这个循环可能较慢但配电网场景一般m小于20运行时间可以忽略。贪心扩展的终止条件是is_discernible返回真意思是当前selected已经能区分所有决策不同的样本对。covered_pairs统计加入某个属性后能增加多少可区分样本对选增益最大的。参数说明当样本量n比较大、属性m也比较多时双重循环的复杂度是O(n^2*m)可能成为瓶颈。我一般先把样本按区段分层抽样每个区段取最多50条控制n在200左右既保留多样性又让计算在几秒内完成。如果实在要跑上千条样本可以先把重复的条件组合合并并记录计数但那样代码会复杂很多工程上没必要。3.3 从约简表提取决策规则置信度与覆盖度约简之后把原决策表投影到约简列上会出现很多重复行。把这些重复行合并并对每个唯一条件组合统计决策分布就是规则提取。置信度的定义是条件组合下出现次数最多的决策类别占比。占比越高规则越可信。覆盖度的定义是该条件组合匹配的样本数占该决策类别总样本数的比例。覆盖度低说明规则太特殊只适用于极少数样本。提取规则时通常要求置信度不低于0.8覆盖度不低于0.2否则丢弃或标记为弱规则。% 用约简后的表提取规则 reduct_X X(:, reduct); % 找到所有唯一的条件组合 [rule_cond, ~, ic] unique(reduct_X, rows); n_rules size(rule_cond, 1); rule_table cell(n_rules, 4); for r 1:n_rules idx find(ic r); % 该组合下各类别计数 zones Y(idx); % zones必须是正整数若区段从0开始先1 [gzone, gcount] histcounts(zones, BinMethod, integers); % 找出频数最大的区段 [max_cnt, pos] max(gcount); winner_zone gzone(pos); conf max_cnt / length(idx); % 置信度 % 覆盖度该规则匹配到的样本数 / 全区段winner_zone的样本数 cover length(idx) / sum(Y winner_zone); rule_table{r,1} rule_cond(r,:); rule_table{r,2} winner_zone; rule_table{r,3} round(conf, 2); rule_table{r,4} round(cover, 2); end % 打印置信度不低于0.8的规则 for r 1:n_rules if rule_table{r,3} 0.8 fprintf(规则%d: 条件%s - 区段%d, 置信度%.2f, 覆盖度%.2f\n, ... r, mat2str(rule_table{r,1}), rule_table{r,2}, rule_table{r,3}, rule_table{r,4}); end end这段代码的逻辑很直接。unique(reduct_X,rows)把约简后的条件组合去重ic给每个样本分配一个规则序号。对每个规则序号用histcounts统计Y的频数分布。注意histcounts的整数分箱需要Y是正整数所以如果区段编号从0开始代码里要先Y Y 1。max_cnt对应的区段就是规则的结论置信度是max_cnt/length(idx)。覆盖度的计算容易踩坑不应该除以该规则匹配的总样本数而应该除以该结论区段在整个训练集里的样本数。比如规则匹配了50个样本其中48个属于区段3而区段3总共有200个样本那么覆盖度是48/20024%说明这条规则只覆盖了区段3的一部分样本。如果覆盖度只有5%说明区段3还有别的重要工况没有形成规则需要回到仿真阶段补样本。规则提取完成后把rule_table保存成.mat文件在线定位时直接load。规则表就是知识库不要在每次定位时重新跑约简那既慢又可能因为在线带标签数据不完整而产出错误规则。3.4 为什么不用现成工具箱而自己写函数Matlab自带的分类学习器、决策树等工具表面上看也能做规则提取但它们和粗糙集的核心差异在于是否做属性约简。决策树会按信息增益逐层分裂输出的是if-else树而粗糙集约简是整体考虑属性子集的区分能力两者选出的特征集经常不同。配电网故障定位场景下我倾向用粗糙集是因为规则可以直接对应“哪些开关动作组合指向哪个区段”解释性强也方便运维人员审核。自己写函数的另一个好处是可控。工具箱里的约简算法往往封装得太高出了问题不好查。区分矩阵方法从头写也就一百行逻辑清楚调试方便。当然你也可以参考已有的开源实现但一定要自己跑一遍测试样例确认核和约简结果正确。4. 故障定位推理用规则表匹配在线故障特征4.1 规则匹配与故障区段判定逻辑离线规则库建好后在线定位的核心是把FTU上报的状态组合跟规则条件做匹配。粗糙集本身是符号推理不要求数值计算所以匹配本质上是逻辑一致性问题。精确匹配很简单在线向量与某条规则的条件完全一致直接采用该规则的结论。但现场数据经常出现漏报、误报。比如区段2故障时S2的FTU因为遥信回路抖动没有上报过流在线向量少了一个1精确匹配就会落空。这时需要近似匹配。我用加权海明距离对在线向量和每条规则条件逐位比较相同为0、不同为1再按属性权重求和。距离最小的规则胜出。属性权重的设定不是拍脑袋。约简结果里保留的属性是区分故障区段的关键权重给1被约简掉的属性权重给0.5表示即使取值不同也可以容忍。这样做的道理是被约简掉的属性本来就可以省略它的取值变化不影响决策所以匹配时不必太严格。判定逻辑上不要只看单条规则输出。我会让匹配函数返回距离最小的前三条规则把它们各自对应的区段做一次投票如果三条规则里两条投同一个区段就输出那个区段否则再按置信度加权。这能压掉单条规则误匹配带来的抖动。4.2 在线匹配的Matlab函数与阈值设置下面这个fault_locator_online函数是实际部署时的核心。它输入一条在线特征向量返回匹配区段和置信度。function [zone, conf, matched] fault_locator_online(sample, rule_table, weight) % 在线故障定位规则表匹配 % sample: 1 x m 离散化后的在线故障特征行向量 % rule_table: 离线提取的规则表cell列1条件行向量列2区段列3置信度列4覆盖度 % weight: 1 x m 属性权重默认全1 % 返回匹配区段、置信度、匹配标志 if nargin 3 || isempty(weight) weight ones(size(sample)); end best_dist inf; best_zone []; best_conf 0; best_cover 0; for r 1:size(rule_table,1) cond rule_table{r,1}; % 加权海明距离 dist sum(weight .* (sample ~ cond)); % 距离小优先距离相同选置信度高 if dist best_dist || (dist best_dist rule_table{r,3} best_conf) best_dist dist; best_zone rule_table{r,2}; best_conf rule_table{r,3}; best_cover rule_table{r,4}; end end % 阈值判断距离过大说明规则库没覆盖这种情况 max_dist_threshold sum(weight) * 0.4; if best_dist max_dist_threshold zone best_zone; conf best_conf; matched true; else zone []; conf 0; matched false; end end这个函数用顺序扫描的方式遍历规则库逐条计算加权海明距离。距离最小的规则先记下如果距离相同选置信度高的大。这里没有用向量化规则库通常几百条在线故障采样频率不高顺序扫描的耗时在毫秒级够用。如果是保护装置嵌入式部署需要把规则表转成查表数组避免用cell但一般监控后台用Matlab没问题。max_dist_threshold设成sum(weight)*0.4意思是允许大约40%的加权属性位不匹配。这个值来自现场经验FTU遥信误动率通常在5%到15%再留一点裕度就取40%。如果现场装置经常漏报可以把0.4改成0.5如果误报多改成0.3。注意阈值太大会把无关规则也匹配进来太小会频繁返回matchedfalse需要根据验证集调。匹配不中时函数返回空区段业务侧应该走“未匹配”通道比如调取附近区段的录波人工研判而不是硬给一个结果。这是容易踩的坑粗糙集规则库无法覆盖所有故障形态强行匹配会误导抢修。4.3 在线特征向量的生成从FTU报文到离散码在线匹配的前提是有一条跟训练时一样格式的离散向量。现场FTU通常上报故障电流、故障电压、开关变位、保护动作等遥信遥测需要先做一层转换。% 从FTU原始报文构造0/1离散特征 % ftu_data: 结构体包含过流标记、电压标幺值、零序电流标记 function sample build_sample(ftu_data) % 假设有3个开关的过流状态 sample(1) ftu_data.s1_overcurrent; % 0/1 sample(2) ftu_data.s2_overcurrent; sample(3) ftu_data.s3_overcurrent; % 母线电压标幺值 - 两档离散 if ftu_data.bus_voltage_pu 0.9 sample(4) 0; elseif ftu_data.bus_voltage_pu 0.7 sample(4) 1; else sample(4) 2; end % 零序电流越限标志 sample(5) ftu_data.zero_seq_overcurrent; end这里要特别强调离散化断点必须跟训练时完全一致。训练时用的电压阈值是0.9和0.7在线也一样。如果训练用等频离散化得到的断点是[0.85, 1.02]在线也必须用同一组断点不能重新算。所以离线阶段要把断点参数存下来跟规则表一起打包部署。另一个常见问题是属性顺序。sample(1)对应决策表第1列sample(2)对应第2列必须固定。一旦改过决策表结构比如新增了零序方向属性却忘了更新在线转换函数匹配就会错位。我通常会在规则表文件里保存一份attr_names元数据在线匹配前检查长度和名称能提前暴露这类低级错误。4.4 多区段概率输出与候选区段排序严格来说粗糙集规则给出的是符号结论不是概率。但工程上经常需要知道“还有哪些区段可疑”方便巡检人员按优先级排查。做法是把匹配距离小于阈值的所有规则都找出来按“距离越近、置信度越高、覆盖度越高”排序输出一个候选区段列表。% 返回所有可达标的候选规则按得分排序 function cand fault_locator_candidates(sample, rule_table, weight) scores zeros(size(rule_table,1), 1); zones zeros(size(rule_table,1), 1); for r 1:size(rule_table,1) cond rule_table{r,1}; dist sum(weight .* (sample ~ cond)); if dist sum(weight)*0.4 % 得分 置信度 覆盖度*0.5 - 距离归一化*0.2 scores(r) rule_table{r,3} 0.5*rule_table{r,4} - 0.2*dist/sum(weight); zones(r) rule_table{r,2}; end end [~, ord] sort(scores, descend); cand [zones(ord(1:min(3,end))), scores(ord(1:min(3,end)))]; end得分公式是我自己常用的不是粗糙集理论的一部分。为什么要加覆盖度因为两条规则置信度一样覆盖度高的说明它对应了该区段更普遍的故障形态排在前面更合理。距离归一化项只是为了让距离差异也能影响排序。这个候选列表会输出给调度端抢修队伍按第一个区段优先赶往现场同时安排第二条路径待命。如果候选列表里前三个区段有跨越很远的两个位置说明规则匹配效果不好应该回去查数据。5. 配电网故障定位的常见坑与排查从数据到规则的五条踩坑记录5.1 决策表不一致导致规则冲突现象约简前用unique检查发现不一致规则表里出现同一条条件规则对应两个不同区段在线匹配时结果反复跳变。原因故障样本里混入了过渡电阻差异很大的情况。比如区段2发生单相接地过渡电阻是5欧姆波形跟区段3的金属性短路在某些属性上很像离散化之后变成同一档位导致条件相同决策不同。解决先看冲突样本比例。低于10%可以直接去掉少数类或者用多数投票高于10%说明离散化粒度太粗增加一档细分。另外检查是不是漏掉了关键属性比如零序电流方向、故障时刻相角把这些属性补进决策表。5.2 离散化断点选得不合适约简结果不稳定现象同样的故障样本改一个断点值约简出来的属性集合就不同规则数量也变。原因粗糙集对离散化很敏感断点选在样本密集区时微小扰动会改变大量样本的分档。解决不要手动拍断点用等频离散化每个属性分成3到5档让每档样本数尽量接近。或者先做一轮归一化再按分位数切分。可以用discretize(X, quantile(X, [0, 1/3, 2/3, 1]))这样断点至少稳定。注意这只能用于连续属性开关状态保持0/1。5.3 规则覆盖度太低在线匹配不到现象规则库很大但每条规则的覆盖度都只有一两个样本在线来的新故障匹配不到。原因训练样本太少每个区段只对应一种故障类型但实际故障类型有金属性短路、经电阻短路、弧光接地等。解决仿真时对每个区段至少设置3种过渡电阻、2种负荷水平、2种故障类型单相、两相、三相等把样本量扩到上百条。还可以对规则做合并把相同结论且条件属性取值相邻的规则用通配符替代减少规则数。5.4 仿真数据与现场数据分布差异大现象仿真阶段准确率90%拿到现场数据之后掉到60%。原因仿真模型没考虑馈线分支负荷、配电变压器励磁涌流、CT饱和导致在线特征分布跟训练集偏移。解决如果有现场录波数据直接混进决策表重新约简。没有的话把仿真模型里负荷改成随机波动短路位置逐米扫描而不是只设几个典型位置。在线侧还要做一样的离散化如果现场量测精度低适当放宽断点间隔。5.5 Matlab代码在不同版本间行为不一致现象同一段约简代码在某个版本跑得好好的换台电脑报错或结果不同。原因histcounts的分箱方式、unique的行排序规则在不同版本有细节差异部分工具箱函数接口也变过。解决代码里避免依赖工具箱特定函数核心算法自己写循环如果用了discretize确认目标版本支持。保存数据时用save不用-v7.3除非数据太大否则换版本容易读不了。把核心函数封装成独立.m文件不依赖App换环境损失最小。6. 把模型用起来验证、参数调整与离线-在线闭环6.1 用留出法验证定位准确率粗糙集规则库建好不是终点要用验证集证明它能定位。常见做法是留出法把决策表按7:3分成训练和验证训练集约简提取规则验证集跑在线匹配统计每个区段的定位准确率。准确率要按区段分开看不能只看总准确率。比如区段3靠近末端样本少错误率高原因很可能是末端短路电流特征不明显。这时候要么补充该区段的样本要么单独增加一个判别属性比如末端电压幅值。6.2 关键参数调整离散化粒度与匹配阈值两个参数最影响结果一是离散化档位数二是匹配距离阈值。档位数从2调到5规则数量和定位准确率会有一个峰值太大容易过拟合太小信息丢失。匹配阈值从0.3调到0.5覆盖率高但误报也会高。一般做法是网格搜索用验证集画一条准确率随阈值变化的曲线选择拐点处的阈值。网格搜索不能把验证集当测试集。如果有一批现场数据最好把仿真数据当训练现场数据当测试这样才能反映真实部署效果。6.3 从离线训练到在线更新的闭环粗糙集的规则库可以离线训练但配电网拓扑会变新增了分布式电源或者改造了分段开关后旧规则就失效。我的习惯是保留在线新样本每积累到一定数量就新旧样本合并重新约简。不需要频繁跑一个月一次就够。操作时把新样本的决策属性标好追加到decision_table.mat里重新调rough_set_reduct和规则提取函数更新规则表。追加前先做一致性检查防止新数据污染旧规则。好的知识库应该越用越准粗糙集在这一点上有天然优势属性约简会剔除新数据带来的冗余属性。最后说一个习惯无论仿真多漂亮上线前我都会用一台独立的机器跑一遍从decision_table.mat到fault_locator_online的全流程模拟一次真实故障注入。这样能发现断点不一致、规则表路径写死这类低级问题。粗糙集不是黑匣子规则能读出来定位结果也解释得清楚。希望这些经验能帮你在配电网故障定位上少走弯路把规则库真正用起来。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑