资讯动态

模糊关系与合成运算:从程度表到模糊控制推理

发布时间:2026/10/21 9:20:17 来源:尧图企业网站定制
很多人在学模糊控制时第一课模糊集合还算好懂到了“模糊关系”就开始有点绕又是矩阵、又是合成还冒出来一堆蕴含算子。我当年学这一节也卡了几天直到把它看成一张“程度表”才通了。上一篇笔记聊了模糊集合的直观与运算这篇专门把模糊关系拆开讲。它不仅是模糊控制里把规则翻译成可计算形式的那座桥也是后面模糊推理、模糊聚类、模糊决策的共同基础。这篇文章会把定义、矩阵表示、合成运算、蕴含算子、完整推理算例一路走通最后聊聊工程落地时容易踩的坑。学完这一篇再看别人的模糊控制器代码基本不会发怵。1. 从“关系”到“模糊关系”控制规则本质上就是一张程度表1.1 普通关系为什么不够用先回忆一下数学里的普通关系。集合U和V之间的一个关系R是指U×V的一个子集。元素对(x, y)要么属于R表示“x与y具有关系R”要么不属于R表示“没有这个关系”。比如“大于关系”“父子关系”“等于关系”都是二值的3大于2是真的2大于3是假的没有中间态。这个二值设定在经典控制、专家系统里看起来挺合理但放在现实世界就太刚性了。一个模糊控制系统里我们说“温差大就开大阀门”问题来了温差是-3℃算不算“大”-1.5℃呢0.5℃呢如果硬切一刀-2.1℃算大、-2.0℃不算大控制器在那个分界点附近就会剧烈抖动。真实物理世界很少有一条清晰的分界线更多是程度高低。模糊关系就是把这个“程度”补上的一种数学结构。1.2 模糊关系的定义其实很简单模糊关系的定义一句话就能说完U到V的一个模糊关系R是直积空间U×V上的一个模糊集合。它的隶属函数记为μR(x, y)取值在[0,1]表示元素对(x, y)具有关系R的程度。这句话初看有点抽象翻译成人话就是你把U和V的所有元素两两组合每个组合都有一个0到1之间的数表示“这个组合符合某种关系的程度”。所有组合的数值合在一起就是一张程度表。所谓模糊关系就是这张表。举例。设U和V都表示温度档位U{冷, 舒适, 热}V{小风, 中风, 大风}。我们可以定义一个模糊关系R表示“当前温度适合的风量”。这个关系不是要么适合要么不适合而是有程度的冷天开大风稍微有一点合适好让空气循环但又不会太冷隶属度可以给0.2冷天开小风非常合适隶属度给0.9热天开大风非常合适隶属度给0.95舒适天开大风有点不合适给0.1。这些数值组成一个3×3的表格就是一个模糊关系。控制规则“IF 温度是冷 THEN 风量是小”本质上是想说“冷”和“小风”之间有一种强关联“冷”和“大风”之间有弱关联——这不就是一张程度表吗理解到这一层模糊关系就不再是玄乎的数学名词了。1.3 为什么控制规则天然是一种模糊关系我自己的体会是把控制规则看成模糊关系比看成“推理命题”更贴近工程直觉。规则“IF x是A THEN y是B”不是在断言“所有A都导致B”而是在给“x取值在A这个集合、y取值在B这个集合”的组合分配一个关联强度。A和B本来就是模糊集合每个x对A有隶属度、每个y对B有隶属度那(x, y)这个组合对“A→B”这条规则的关联程度自然也可以是一个0到1的数。比如“IF 温差是正大 THEN 阀门开度是大”。如果当前温差对“正大”的隶属度是0.8而某个阀门开度对“大”的隶属度是0.6那么“把开度设为那个值”和“这条规则”的匹配度不会超过0.6。更严格的说法是只能用一种t范数把两个隶属度结合起来。最小值和乘积是最常用的两种。这正是下一章要说的模糊矩阵和合成运算的出发点。2. 模糊矩阵的表示与基本运算先把手里的牌理清楚2.1 有限论域下模糊关系就是一个矩阵实际工程里输入和输出论域通常被离散成有限个点。设U有m个元素V有n个元素那么模糊关系R就可以写成一个m×n矩阵R [rᵢⱼ]其中rᵢⱼ μR(xᵢ, yⱼ)这个矩阵的第i行对应U的第i个元素第j列对应V的第j个元素交叉处的数值就是“这个输入和这个输出组合下的关联程度”。拿温控例子来说输入论域U选择三个离散点温差负大(-3)、温差零(0)、温差正大(3)输出论域V选择阀门开度小(10%)、中(50%)、大(90%)。一条规则“IF 温差是负大 THEN 阀门是小”若用最小蕴含生成关系矩阵可能是小(10%)中(50%)大(90%)温差负大1.00.30.0温差零0.20.20.0温差正大0.00.00.0这个矩阵读起来非常直观负大温差和小阀门强关联负大和中阀门只有弱关联正大温差和小阀门无关。如果把三条规则都写进去再取并得到的就是整个规则库对应的模糊关系矩阵。这里一定要记住一个约定行放输入论域列放输出论域。后面写代码、读代码时这个方向一旦搞反整个推理结果都会反过来这是新手最容易犯的错。2.2 模糊矩阵的基本运算并、交、补、转置模糊关系既然也是模糊集合那么模糊集合的运算都可以逐元素搬到矩阵上。运算表达式控制里的直觉并μR∪S(x,y) max(μR(x,y), μS(x,y))多条规则对同一个组合的叠加交μR∩S(x,y) min(μR(x,y), μS(x,y))两种关系必须同时成立补μR̄(x,y) 1 - μR(x,y)关系取反转置μRT(x,y) μR(y,x)把输入输出方向调换矩阵形式下并交补都是逐元素操作和模糊集合的运算完全一致。比如两个关系矩阵R和S做并运算就是把对应位置的数值取最大得到的新矩阵表示“只要R或S任一成立的程度”。这些运算里控制里最常用的是并。因为一个规则库通常包含多条规则每条规则生成一个关系矩阵整个规则库的总体关系就是这些矩阵的并。在实际代码里通常就是逐元素取max实现起来非常轻。转置这个运算在控制里容易被忽略但在验证关系方向、做某些数学推导时很重要。一句话提醒除非你已经明确知道自己要干什么否则不要轻易对规则矩阵做转置转置后输入和输出的语义就互换了可能得到一台“反向控制器”。2.3 矩阵表示的几个注意点第一模糊关系矩阵不一定是方阵。输入论域和输出论域的元素数通常不同矩阵维度就是m×n读文献或看代码时先确认维度。第二矩阵里的数值不要求在同一行或同一列上归一化。这是一个常见的误解。模糊关系矩阵的每一行代表一个固定输入下各个输出的适配程度这些值不需要加起来等于1。很多初学者拿它当概率表试图归一化反而把语义搞坏了。第三论域离散点怎么选很关键。点太少输出解模糊后会呈台阶式跳变点太多规则矩阵膨胀推起来也不一定更快。工程里常用5到9个离散点或者干脆用连续隶属函数加“逐条规则激活”的方式不去显式构造整个矩阵。这一点后面第5章会再展开。3. 模糊关系合成串联规则与路径推断的那步关键运算3.1 为什么要有一个“合成”运算如果一个关系R描述U到V的关联另一个关系S描述V到W的关联我们自然想问能不能从U直接推导到W这就像地图软件里已知从A城到中转站B城的通行程度又知道从中转站B城到C城的通行程度现在要推算A城到C城的通行程度。普通关系里有复合运算如果xRy且ySz那么x和z就具有复合关系R∘S。模糊关系延续这个思路但对“xRy”和“ySz”都引入了程度问题。具体怎么把两个程度合成一个程度就是模糊关系合成的核心。3.2 合成定义sup-min型与sup-product型模糊关系合成最常见的定义是(R∘S)(x, z) sup_{y∈V} min( μR(x,y), μS(y,z) )这个公式叫sup-min合成也叫最大最小合成。因为有限论域下sup其实就是max工程上说“max-min合成”也经常指同一个东西。还有一种变体把min换成普通乘法(R∘S)(x, z) sup_{y∈V} ( μR(x,y) · μS(y,z) )叫sup-product合成也就是最大乘积合成。两种都是t范数在合成运算里的特例。t范数是一类用于实现“模糊与”的运算满足交换律、结合律、单调性和边界条件。不同的t范数代表不同的“同时成立”语义min更接近“木桶效应”product更接近“两个概率同时发生”的乘积逻辑。3.3 合成运算和普通矩阵乘法长得太像了如果把模糊关系矩阵和普通实数矩阵放在一起对照会发现几乎同构普通矩阵乘法T[i][j] Σₖ A[i][k] · B[k][j]模糊关系合成T[i][j] maxₖ min( A[i][k], B[k][j] )普通乘法是“乘积后求和”模糊合成是“取小后取大”。这个对应关系特别实用背下来基本就不会忘。我第一次学的时候就是在草稿纸上把它们并排写瞬间觉得所谓模糊矩阵乘法没那么神秘。用这个规则算一个例子。设R是一个2×3矩阵S是一个3×2矩阵R [[0.4, 0.8, 0.2], [0.2, 0.5, 1.0]]S [[0.6, 0.3], [1.0, 0.2], [0.0, 0.9]]计算T R∘S。T[0][0] max( min(0.4,0.6), min(0.8,1.0), min(0.2,0.0) ) max(0.4, 0.8, 0.0) 0.8T[0][1] max( min(0.4,0.3), min(0.8,0.2), min(0.2,0.9) ) max(0.3, 0.2, 0.2) 0.3T[1][0] max( min(0.2,0.6), min(0.5,1.0), min(1.0,0.0) ) max(0.2, 0.5, 0.0) 0.5T[1][1] max( min(0.2,0.3), min(0.5,0.2), min(1.0,0.9) ) max(0.2, 0.2, 0.9) 0.9所以T [[0.8, 0.3], [0.5, 0.9]]这个手算过程我建议读者至少在草稿上走一遍。因为后面所有模糊推理、模糊聚类都会反复用到同样的操作熟练之后再看代码就是“找max和min在哪”的问题。3.4 合成运算的路径直觉为什么合成要取小再取大用路径来理解最直观。想象从x到z中间必须经过某个中转点y。对每一个固定的yx到z的关联程度取决于两段路程x到y这一段、y到z这一段。如果两段都很通达那么这一条路径就是通达的如果其中一段很堵整条路径就被拖累了。取小运算表达的正是“瓶颈效应”——一条路径的通畅度等于两段中较不通畅的那一段的通过程度。接下来x到z可能有多个中转点y₁、y₂、y₃……每条中转路径都有一个瓶颈值最终我们选择其中最优的一条。取大运算表达的正是“多路径取最优”。把这两层含义叠起来就是sup-min合成。理解了这条路网比喻模糊关系合成就不再是天上掉下来的公式而是一种非常自然的路径推断。控制器里也用这个原理输入是模糊集合A规则关系是R那么输出模糊集合B A∘R。这个式子可以读成在所有可能输入状态y的帮助下A与R共同决定z的输出程度。A每给一个输入一个激活度R每给一个组合一个关联度两者通过min取“同时成立”的程度再对不同输入路径取max汇总。3.5 合成运算的一般化方向如果想把合成再推广可以把min换成任意t范数T(R∘S)(x, z) sup_{y∈V} T( μR(x,y), μS(y,z) )这就是更一般的模糊关系合成框架。选不同的t范数得到的推理性质会不同。控制里主要用min和product两种已经覆盖绝大多数工程场景。知道这个一般化背景以后看模糊推理的论文就不会被各种符号劝退。4. 模糊蕴含算子把“如果…那么…”翻译成矩阵的几种姿势4.1 一条规则如何生成一个关系矩阵第1章说过控制规则可以看成一种模糊关系现在要解决具体操作问题给定前件模糊集合A和后件模糊集合B如何构造关系R最直接的做法是取A和B的模糊笛卡尔积μR(x, y) T( μA(x), μB(y) )这里T仍然是一个t范数。当T取min时得到的R就是“最小蕴含”关系当T取乘积时得到的是“乘积蕴含”关系。对应到矩阵生成就是把前件隶属度向量和结论隶属度向量做一个“取小外积”或“乘积外积”。比如前件隶属度向量A [0.0, 0.2, 1.0]结论隶属度向量B [0.0, 0.3, 1.0]两者做取小外积B₁0.0B₂0.3B₃1.0A₁0.00.00.00.0A₂0.20.00.20.2A₃1.00.00.31.0矩阵里每个位置都是min(Aᵢ, Bⱼ)。这个矩阵的含义是前件匹配度是Aᵢ时对结论Bⱼ的传递程度是多少。前件完全不匹配0.0的那一行全是0匹配度最高的那个输入会完整保留结论集合的形状。4.2 不同蕴含算子的思路对比“蕴含”这个词容易让人想到数理逻辑里的“p→q”。在经典逻辑里p→q的真值表是只有p真q假时为假其余为真。把这个真值表推广到[0,1]区间就会得到一类“逻辑型”蕴含算子。控制里常用的规则关系生成方式虽然也叫蕴含但立场不同它们更强调“条件与结论同时成立的程度”属于“合取型”蕴含。几种常见算子的表达式对比如下算子名称表达式特点最小蕴含min(a, b)控制中最常用计算简单、输出直观乘积蕴含a·b控制中第二常用对前件变化更敏感布尔型蕴含max(1-a, b)逻辑型前件为0时结果为1有界和蕴含min(1, 1-ab)逻辑型中间带线性过渡序蕴含b若a≤b否则1?实际为 a≤b时1ab时b逻辑型强调大小次序为什么控制工程师偏爱最小蕴含和乘积蕴含而不是那些逻辑型蕴含因为控制规则不是在做严格的逻辑推理而是在做“条件匹配后把结论映射为输出”的数值变换。最小蕴含的物理意思很清楚输出程度不会超过前件匹配度也不会超过结论隶属度取两者较小值。这种“截断”效果在模糊控制器里正是我们想要的——规则匹配度不高输出就被压低不会出现规则没匹配还强行输出一个高值的情况。4.3 最小蕴含的裁剪与乘积蕴含的缩放合取型蕴含在后续推理中会造成不同的输出形状。最小蕴含的本质是“取小”相当于把结论模糊集合在高度等于激活度的地方平着切一刀保留从底部到切面这一截因此常被称为裁剪。乘积蕴含的本质是“缩放”它把结论模糊集合的每个隶属度都乘上激活度让整个输出形状按比例缩小因此常被称为缩放。两者在解模糊化后的数值表现有差别。我个人的工程体会是最小蕴含在激活度不高时输出更“保守”因为被裁剪后的输出面比较宽重心解模糊结果更靠近结论集合的中间区域乘积蕴含在激活度变化时输出变化更灵敏激活度微调也能反映到最终数值上。如果控制器在某个工况区显得反应迟钝可以试试把规则关系从最小蕴含换成乘积蕴含往往能改善。这里要提醒一句不要指望蕴含算子的选择解决所有控制问题。蕴含算子的影响主要在规则匹配度和结论形状这两个层面如果控制器本身规则覆盖率不够换算子只是治标不治本。4.4 多条规则的整体关系怎么拼单条规则生成一个关系矩阵规则库有多条规则就有多个矩阵。把这些矩阵“拼”成整体关系通常用并运算R_total R₁ ∪ R₂ ∪ … ∪ Rₙ即逐元素取max。用并运算的理由很直观一个输入输出组合只要被任意一条规则以一定程度支持这个程度就应该被保留。取并也就是保留所有规则的支持度信息。在二维连续情况下这个并运算会形成一张叠加了多个“山峰”的关系曲面离散情况下则是一个取了多次max的矩阵。我见过一些初学者在这里用求和来聚合规则结果矩阵数值很容易超过1变成一张错误的“伪概率表”。规则聚合一定要用max等符合模糊集合语义的运算不能按实数累加的思路来。这个坑非常好躲只要记得语义就行。5. 一个温控小例子的全流程推演从规则矩阵到输出数值5.1 最简单的温差-阀门场景用一个特别小的例子把前面所有内容串起来。设输入论域U是温差等级NB表示“温差负大”ZO表示“温差零”PB表示“温差正大”输出论域V是阀门开度小、中、大对应代表值10%、50%、90%。前件模糊集合定义如下每一行是U三个点的隶属度A_NB [1.0, 0.2, 0.0]A_ZO [0.2, 1.0, 0.2]A_PB [0.0, 0.2, 1.0]结论模糊集合定义如下每一行是V三个点的隶属度B_小 [1.0, 0.3, 0.0]B_中 [0.0, 1.0, 0.0]B_大 [0.0, 0.3, 1.0]三条规则IF 温差是NB THEN 阀门是小IF 温差是ZO THEN 阀门是中IF 温差是PB THEN 阀门是大用最小蕴含生成三条规则的关系矩阵。R1 A_NB 和 B_小 的取小外积[[1.0, 0.3, 0.0], [0.2, 0.2, 0.0], [0.0, 0.0, 0.0]]R2 A_ZO 和 B_中 的取小外积[[0.0, 0.2, 0.0], [0.0, 1.0, 0.0], [0.0, 0.2, 0.0]]R3 A_PB 和 B_大 的取小外积[[0.0, 0.0, 0.0], [0.0, 0.2, 0.2], [0.0, 0.3, 1.0]]三矩阵逐元素取max得到规则库总关系矩阵R[[1.0, 0.3, 0.0], [0.2, 1.0, 0.2], [0.0, 0.3, 1.0]]这个3×3矩阵就是“温差等级→阀门等级”的完整模糊关系。它读起来很有规律对角线强说明三个典型温差状态各走各的规则交叉项次强说明规则之间也有衔接。模糊控制器“平滑过渡”的秘密就在这些交叉项里。5.2 给定输入输出怎么推理出来假设当前实测温差对三个离散点的隶属度为A [0.8, 0.6, 0.1]意思是很靠近NB、也有一点ZO成分。输出模糊集合用合成推理法B A ∘ R逐列算B₁ max( min(0.8,1.0), min(0.6,0.2), min(0.1,0.0) ) max(0.8, 0.2, 0.0) 0.8B₂ max( min(0.8,0.3), min(0.6,1.0), min(0.1,0.3) ) max(0.3, 0.6, 0.1) 0.6B₃ max( min(0.8,0.0), min(0.6,0.2), min(0.1,1.0) ) max(0.0, 0.2, 0.1) 0.2所以输出模糊集合B [0.8, 0.6, 0.2]。注意一个小技巧如果你的输入经过模糊化后是模糊单点也就是只在某个精确值x₀处隶属度为1、其余为0那么B A∘R会直接退化为取R的第x₀行。这是实时控制器里最常用的优化手段因为它把整个合成运算降成了一个查表操作。拿到B后还需要解模糊才能得到阀门开度的精确值。用加权平均法u (0.8×10 0.6×50 0.2×90) / (0.8 0.6 0.2) (8 30 18) / 1.6 35输出是35%左右的开度介于“小”和“中”之间且更偏小。这个结果符合直觉实测温差偏向负大阀门应该偏小但由于温差并不完全是典型负大状态输出也相应做了平滑插值。5.3 两条推理路径本质上等价上面的整体合成法先把所有规则并成R再和输入合成。工程上更常见的做法是逐条规则推理先用A和每条规则的前件算激活度再用激活度裁剪或缩放对应结论最后把所有规则的输出模糊集合取并。用这个例子的三条规则算激活度α₁ max( min(0.8,1.0), min(0.6,0.2), min(0.1,0.0) ) max(0.8, 0.2, 0.0) 0.8 α₂ max( min(0.8,0.2), min(0.6,1.0), min(0.1,0.2) ) max(0.2, 0.6, 0.1) 0.6 α₃ max( min(0.8,0.0), min(0.6,0.2), min(0.1,1.0) ) max(0.0, 0.2, 0.1) 0.2然后每条规则输出裁剪后的结论集合再取并B₁ max( min(0.8,1.0), min(0.6,0.0), min(0.2,0.0) ) 0.8 B₂ max( min(0.8,0.3), min(0.6,1.0), min(0.2,0.3) ) 0.6 B₃ max( min(0.8,0.0), min(0.6,0.0), min(0.2,1.0) ) 0.2结果和整体合成法完全一致。这不是巧合。用公式写就是B(y) max_k max_x min( A(x), min(A_k(x), B_k(y)) ) max_k min( max_x min(A(x), A_k(x)), B_k(y) ) max_k min( α_k, B_k(y) )因为max和min之间的分配关系两种路径在最小蕴含下是等价的。正因如此工程代码里才敢放心地逐条规则激活不必维护一个巨大的总关系矩阵。知道这个等价关系读模糊控制源码时会清醒很多。5.4 用不到二十行代码把合成算出来最后给一段不依赖任何第三方库的纯Python实现核心就是max-min合成。这段代码不追求性能重在语义清楚。def max_min_compose(R, S): # R: m x p, S: p x n, 返回 m x n m, p len(R), len(S) n len(S[0]) T [[0.0] * n for _ in range(m)] for i in range(m): for j in range(n): best 0.0 for k in range(p): value min(R[i][k], S[k][j]) if value best: best value T[i][j] best return T推理时把输入行向量A当成1×m矩阵与关系矩阵R做max_min_compose得到1×n的输出行向量A_prime [0.8, 0.6, 0.1] # [1 x 3] R [ [1.0, 0.3, 0.0], [0.2, 1.0, 0.2], [0.0, 0.3, 1.0], ] B_prime max_min_compose([A_prime], R)[0] print(B_prime) # [0.8, 0.6, 0.2]如果输入是模糊单点甚至可以不跑这个合成函数直接取R对应行。很多嵌入式模糊控制器所谓的“查表法”本质就是模糊单点输入加离散关系矩阵的快速路径。6. 性质、常见误区与工程落地时的几条实在建议6.1 自反、对称、传递在控制里不必强求模糊关系有三个常见的数学性质自反性、对称性、传递性。自反性要求μR(x,x)1对每个x都成立。对称性要求μR(x,y)μR(y,x)。传递性要求R∘R ⊆ R即R和自身合成后仍然是R的子集。这三个性质在模糊聚类、模糊数据库等领域很有用。比如“相似关系”通常要求自反且对称再加传递闭包就能形成等价类用于样本归类。但在模糊控制里规则关系矩阵往往不对称也不自反更不传递。温差负大导致阀门小反过来阀门小并不会导致温差负大因果关系本身就是单向的。把一个控制规则矩阵强行改成对称矩阵只会扭曲规则语义。所以我的建议是控制方向的应用只要模糊关系满足“每个输入点都有规则覆盖”这一条就够用了。其他漂亮性质更多是数学研究或聚类场景的需要不必在控制器里硬套。6.2 工程落地的几个常见误区先讲一个我自己调试时踩过的坑矩阵方向搞反。有一次我把关系矩阵写成“行对应输出、列对应输入”合成时又用A∘R结果推理输出完全乱套。检查半天才发现是矩阵定义里输入输出方向没有固定。后来我养成了一个习惯在代码注释里现写清楚R[i][j]表示μR(输入i, 输出j)并在初始化矩阵的函数里打印维度断言从源头杜绝这类问题。第二个坑是论域覆盖不全。如果规则库的前件模糊集合没有覆盖整个输入论域某些输入点可能对所有规则的激活度都很低输出模糊集合趋近于零解模糊时可能除零或者输出一个奇怪数值。设计规则库时要把输入论域的两端和中间都铺上前件集合别留空洞。第三个坑是离散粒度。论域分点太多规则矩阵会迅速膨胀推起来也没必要地慢分点太少输出解模糊后是阶梯状不够平滑。工业上常见的做法是U取7到9个点V取5到7个点或者在连续隶属函数上做逐条规则激活不显式保存总矩阵。这两种做法本质都是模糊关系建模只是实现方式不同。第四个坑出现在解模糊环节。当输出的所有隶属度都接近0时加权平均法会得到0/0程序直接崩掉。工程上要有兜底要么返回上次输出值要么返回输出论域的中点要么用最大隶属度对应的代表值作为输出。这一条在实时控制器里特别重要。6.3 为什么建议先打印一张关系矩阵再看推理结果如果你正在实现一个模糊控制器我的第一个建议是把规则库生成的总关系矩阵打印出来逐行逐列看一遍。这张表比任何调试日志都直观。对角线上是不是明显强规则之间的交叉项是否合理有没有不该有关系的地方出现了高值这些信息能让你在还没进入闭环实验之前就发现大部分规则设计问题。等这张矩阵看得顺眼了再去做闭环调试。我后来带人做模糊控制相关项目基本都要求对方先能默写出规则关系矩阵再来谈控制器参数。模糊关系的本质是程度与结构矩阵只是它的载体。真正掌握它之后再看模糊聚类、模糊决策、模糊专家系统会轻松很多。这篇笔记把最核心的一张“程度表”讲透了后面的路就好走了。

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

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

免费获取报价 →
↑