推理过程的去模糊化(Defuzzification)方法详解

准备工作

1.在一个空调阀门控制系统中,模糊推理过程的简化步骤

(1)定义输入变量T和H的隶属函数

(2)建立规则库

(3)计算每个规则的激活强度

(4)聚合所有规则的输出

(5)解模糊化(去模糊化)得到具体数值

2.以下是空调阀门控制系统的完整示例

(1)场景:空调阀门控制系统

(2)输入变量:

温度T=28∘C

湿度H=70%

(3)模糊规则库:

如果T 高 且 H 高,则 Y 全开。

如果T 中 或 H 中,则 Y 半开。

如果T 低 且 H 低,则 Y 关闭。

(4)步骤说明:

1)模糊化:T=28 ∘C 的隶属度:

中温(Medium):0.8

高温(High):0.2

2)H=70% 的隶属度:

中湿(Medium):0.4

高湿(High):0.6

(5)规则评估:

规则1:激活强度 = min(0.2, 0.6) = 0.2 → 裁剪“全开”隶属函数至高度0.2。

规则2:激活强度 = max(0.8, 0.4) = 0.8 → 裁剪“半开”隶属函数至高度0.8。

规则3:激活强度 = 0 → 无贡献。

(6)聚合:将规则1和规则2的裁剪结果取最大值,得到综合输出隶属度。

(7)解模糊化:使用重心法计算聚合后的隶属度曲线质心,假设得到Y=65%。

3.去模糊化(Defuzzification)在推理过程中的位置

由示例可知,去模糊化模糊推理的最后一步,目标是将模糊推理输出的隶属度分布转换为精确的数值,用于实际控制或决策。先再次回顾一下去模糊化的前后操作过程:

去模糊化的前一步:聚合 (Aggregation)

(1)目标:将所有规则的输出隶属度合并为一个综合的模糊输出集合

(2)方法:将每条规则裁剪后的输出隶属函数取最大值求和,得到最终的模糊输出隶属度分布。

(3)示例的聚合过程:

规则1的裁剪输出为高度0.2的“全开”隶属函数。

规则2的裁剪输出为高度0.8的“半开”隶属函数。

聚合结果 = max(规则1输出, 规则2输出)。

图1 聚合过程

解模糊化 (Defuzzification)

目标:将模糊的输出隶属度转换为精确的控制值(如阀门开度Y=65%)

图2 解模糊过程

        以上内容可以看我的CSND文章:图解模糊推理过程(超详细步骤)-CSDN博客

        以下是主流去模糊化方法的超详细介绍:

一、重心法(Centroid Method,面积中心法)

1.重心法原理

计算模糊输出隶属度曲线下面积的质心,将该质心的横坐标作为最终的精确输出值。一个典型的重心法示意图以及具体步骤:

图3 重心法示意图

(1)模糊推理结果:在模糊控制系统中,经过模糊推理后,通常会得到一个模糊输出,这个模糊输出由多个模糊集合(隶属函数)组成,每个模糊集合都有一个相应的隶属度。如图2中,其中一个模糊集合{高度0.8的“半开”隶属函数,高度0.2的“全开”隶属函数},聚合后的结果为:该集合的隶属度是max(高度0.8的“半开”隶属函数,高度0.2的“全开”隶属函数)=0.8

(2)隶属度曲线下的面积:对于每个模糊集合,其隶属度函数在定义域内形成一条曲线。曲线与定义域轴之间的区域构成了一个面积(运行空调阀门控制系统,可得如图4中的灰色背景部分,python代码在下面)。

图4 重心法解模糊化

(3)质心计算:质心(重心)是这个面积的中心点,其横坐标即为解模糊后的精确输出值。质心的计算可以通过积分来实现,具体公式如下:

2.步骤

(1)模糊输出隶属度函数:假设我们有三个模糊集合(例如,"低温"、"中温"、"高温"),每个集合都有一个隶属度函数,这些函数在输出变量的定义域内形成不同的曲线。

(2)计算曲线下面积:对于每个模糊集合,计算其隶属度函数曲线与定义域轴之间的面积。这可以通过数值积分方法实现。

(3)确定面积的质心:将所有模糊集合的面积综合考虑,找到这些面积的质心。质心的位置由上述公式计算得出。

(4)最终输出值:质心的横坐标即为解模糊后的精确输出值,它综合了所有模糊集合的信息,给出了一个明确的数值结果。

3.python示例

以下是基于上文提供的场景和步骤的Python实现代码,它将绘制重心法计算聚合后的隶属度曲线,并标识出曲线与轴之间的区域面积以及质心位置:

import numpy as np

import matplotlib.pyplot as plt



# 设置字体为SimHei显示中文

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号



# 定义三角形隶属函数

def triangular_mf(x, a, b, c):

    # 避免除以零的情况

    if b == a or b == c:

        return np.zeros_like(x)

    return np.maximum(0, np.minimum((x - a) / (b - a), (c - x) / (c - b)))



# 定义裁剪隶属函数

def clip_mf(x, mf, height):

    return np.minimum(mf, height)



# 定义解模糊化(重心法)

def centroid_defuzzification(x, aggregated_mf):

    # 避免除以零的情况

    denominator = np.trapz(aggregated_mf, x)

    if denominator == 0:

        return 0

    return np.trapz(x * aggregated_mf, x) / denominator



# 定义输出变量 Y 的隶属函数

def valve_mf(x):

    # 调整参数以避免除以零的情况

    closed = triangular_mf(x, 0, 10, 50)

    half_open = triangular_mf(x, 20, 50, 80)

    fully_open = triangular_mf(x, 50, 90, 100)

    return closed, half_open, fully_open



# 生成输入值

x_valve = np.linspace(0, 100, 1000)



# 获取隶属函数

closed, half_open, fully_open = valve_mf(x_valve)



# 规则评估

rule1_activation = 0.2  # 规则1的激活强度

rule2_activation = 0.8  # 规则2的激活强度



# 裁剪隶属函数

clipped_fully_open = clip_mf(x_valve, fully_open, rule1_activation)

clipped_half_open = clip_mf(x_valve, half_open, rule2_activation)



# 聚合

aggregated_mf = np.maximum(clipped_fully_open, clipped_half_open)



# 解模糊化

y_centroid = centroid_defuzzification(x_valve, aggregated_mf)



# 绘制图形

plt.figure(figsize=(10, 6))



# 绘制裁剪后的隶属函数

plt.plot(x_valve, clipped_fully_open, 'b--', linewidth=1, alpha=0.7, label='规则1:全开(裁剪后)')

plt.plot(x_valve, clipped_half_open, 'g--', linewidth=1, alpha=0.7, label='规则2:半开(裁剪后)')



# 绘制聚合后的隶属度曲线

plt.plot(x_valve, aggregated_mf, 'r', linewidth=2, label='聚合后的隶属度曲线')



# 填充曲线与轴之间的区域

plt.fill_between(x_valve, aggregated_mf, 0, color='gray', alpha=0.3, label='曲线下的面积')



# 标识质心

plt.axvline(x=y_centroid, color='m', linestyle='--', linewidth=2, label=f'质心 (Y={y_centroid:.2f}%)')



# 设置图形属性

plt.title('重心法解模糊化')

plt.xlabel('冷气阀门打开度 (%)')

plt.ylabel('隶属度')

plt.legend()

plt.grid(True)

plt.show()

代码说明:

(1)三角形隶属函数:定义了三角形隶属函数triangular_mf,用于生成隶属度曲线。

(2)裁剪隶属函数:定义了clip_mf函数,用于根据规则的激活强度裁剪隶属函数。

(3)解模糊化:实现了重心法解模糊化函数centroid_defuzzification,计算聚合后的隶属度曲线的质心。

(4)输出隶属函数:定义了冷气阀门打开度 Y 的三个隶属函数(关闭、半开、全开)。

(5)规则评估与裁剪:根据规则的激活强度裁剪对应的隶属函数。

(6)聚合:将裁剪后的隶属函数取最大值,得到综合隶属度曲线。

(7)绘图:绘制了裁剪后的隶属函数、聚合后的隶属度曲线,并填充了曲线与轴之间的区域,标识出质心位置。

4.特点

(1)优点:输出平滑,综合所有隶属度信息。适合连续控制场景(如温度调节)。

(2)缺点:计算复杂(需积分运算)。实时性较差,适合离线或高算力系统。

(3)适用场景:高精度控制系统(如工业机器人)。

二、最大值平均法(Mean of Maxima, MoM)

1.原理

取隶属度函数达到最大值的所有点,然后计算这些点的平均值作为最终的解模糊化结果。原理步骤:

(1)确定隶属度函数的最大值点:找到隶属度函数μ(y) 达到最大值的所有点y。

(2)计算最大值点的平均值:对这些最大值点进行平均,得到最终的解模糊化值。

公式:

2.python示例

代码如下:

import numpy as np

import matplotlib.pyplot as plt



# 设置字体为SimHei显示中文

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号



# 定义三角形隶属函数

def triangular_mf(x, a, b, c):

    return np.maximum(0, np.minimum((x - a) / (b - a), (c - x) / (c - b)))



# 定义输出变量 Y 的隶属函数

def valve_mf(x):

    closed = triangular_mf(x, 0, 10, 50)

    half_open = triangular_mf(x, 20, 50, 80)

    fully_open = triangular_mf(x, 50, 90, 100)

    return closed, half_open, fully_open



# 生成输入值

x_valve = np.linspace(0, 100, 1000)



# 获取隶属函数

closed, half_open, fully_open = valve_mf(x_valve)



# 聚合后的隶属度曲线(假设已经通过某些规则得到)

aggregated_mf = np.maximum(half_open, fully_open * 0.7)



# 找到隶属度函数的最大值

max_value = np.max(aggregated_mf)

# 找到所有接近最大值的点,考虑浮点数精度问题

tolerance = 1e-5

max_points = x_valve[np.abs(aggregated_mf - max_value) < tolerance]



# 如果没有找到最大值点,则设置为0

if len(max_points) == 0:

    mom = 0

else:

    # 计算最大值点的平均值

    mom = np.mean(max_points)



# 绘制图形

plt.figure(figsize=(10, 6))



# 绘制聚合后的隶属度曲线

plt.plot(x_valve, aggregated_mf, 'r', linewidth=2, label='聚合后的隶属度曲线')



# 标识最大值点

for point in max_points:

    plt.axvline(x=point, color='b', linestyle='--', linewidth=1, alpha=0.7)



# 标识最大值平均法结果

plt.axvline(x=mom, color='m', linestyle='--', linewidth=2, label=f'MoM 结果 (Y={mom:.2f}%)')



# 填充曲线与轴之间的区域

plt.fill_between(x_valve, aggregated_mf, 0, color='gray', alpha=0.3, label='曲线下的面积')



# 设置图形属性

plt.title('最大值平均法解模糊化')

plt.xlabel('冷气阀门打开度 (%)')

plt.ylabel('隶属度')

plt.legend()

plt.grid(True)

plt.show()

代码说明:

(1)隶属函数定义:定义了三角形隶属函数 triangular_mf,用于生成隶属度曲线。

(2)聚合后的隶属度曲线:假设已经通过某些规则得到了聚合后的隶属度曲线 aggregated_mf。

(3)找到最大值点:通过 np.max 和 np.where 找到隶属度函数的最大值点。

(4)计算平均值:对最大值点进行平均,得到最终的解模糊化值 mom。

(5)绘图:绘制了聚合后的隶属度曲线、最大值点和最大值平均法结果,并填充了曲线下的面积。

图5 最大值平均法的示意图

3.特点

(1)优点:计算简单,实时性强。结果明确,无歧义。

(2)缺点:忽略隶属度分布形状,可能输出不连续。对多峰隶属度敏感。

(3)适用场景:快速决策系统(如电梯调度)。

三、中心平均法(Center Average)

1.原理:对各规则的输出隶属函数中心加权平均。

2.公式:

其中:wi表示第i条规则的激活强度。c i表示第i条规则输出隶属函数的中心点。

3.步骤:

(1)确定每条规则输出隶属函数的中心(如三角形顶点)。

(2)以激活强度为权重,计算加权平均。

4.示例:

规则1:激活强度0.6,中心点5。

规则2:激活强度0.4,中心点8。

最终输出:

5.特点

(1)优点:计算效率高,适合实时系统。结合多规则贡献,结果稳定。

(2)缺点:依赖隶属函数中心定义,不适合非对称函数。

(3)适用场景:多规则协作系统(如汽车巡航控制)。

四、高度法(Height Method)

1.原理:取隶属度最大点对应的横坐标值。

2.公式:

3.步骤:

(1)找到隶属度最大的点y。

(2)若有多个相同最大点,取第一个或最后一个。

4.示例:

输出隶属度在y=7 处达到最大值0.9。

最终输出:Y=7。

5.特点

(1)优点:计算极快,适合超实时系统。无需复杂数学运算。

(2)缺点:完全忽略隶属度分布,可能输出跳变。对噪声敏感。

(3)适用场景:低功耗嵌入式系统(如智能家居传感器)。

五、面积平分法(Bisector of Area)

1.原理:找到一条垂直直线,将隶属度曲线下面积平分为两部分。

2.公式:

3.步骤:

(1)计算隶属度曲线总面积。

(2)找到面积平分点Y。

4.特点

(1)优点:输出稳定,对称分布时与重心法一致。对异常值鲁棒性强。

(2)缺点:计算复杂,需迭代求解。

(3)适用场景:需平衡分布权重的场景(如金融风险评估)。

六、最大值左/右法(Left/Right Maximum)

1.原理:取隶属度最大区域的最左或最右端点。

左最大法:取第一个最大值点。

右最大法:取最后一个最大值点。

2.示例:

输出隶属度在区间 [4, 6] 内均为最大值0.8。

左最大法输出Y=4,右最大法输出Y=6。

3.特点

(1)优点:明确倾向保守或激进策略。

(2)缺点:输出偏向极端,可能不稳定。

(3)适用场景:风险偏好明确的决策(如投资策略选择)。

七、方法对比与选择指南

方法

计算复杂度

实时性

平滑性

适用场景

重心法

高精度控制(机器人、温控)

最大值平均法

快速决策(电梯调度)

中心平均法

多规则协作系统(汽车控制)

高度法

极低

极高

嵌入式系统(智能家居)

面积平分法

平衡权重场景(风险评估)

左/右最大法

风险偏好决策(金融、医疗)

八、选择依据

1.实时性要求:

高实时性:高度法、最大值平均法。

允许延迟:重心法、面积平分法。

2.输出稳定性:

平滑输出:重心法、中心平均法。

明确极值:左/右最大法。

3.计算资源:

受限设备:高度法、中心平均法。

高性能平台:重心法、面积平分法。

        去模糊化方法将模糊逻辑的输出转化为实际可执行的精确值,方法选择需综合考虑系统实时性、输出平滑性及计算资源。重心法和中心平均法适合高精度控制,而高度法和最大值平均法适合快速响应场景。实际应用中可通过实验对比不同方法的效果,结合领域知识选择最优策略。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搏博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值