python调用scikit-fuzzy实现模糊推理的说明(二)

前言

在我的上一篇博客中,对scikit-fuzzy的调用进行了简要说明,并用一个大佬常用的案例进行了说明,在近期的学习中,发现了skfuzzy中的其他功能,包括参考值的自动设置和可视化展示,下面分别进行介绍。

一、案例说明

同样的,还是经典的2个输入,1个输出,3个参考值,9条规则,相比于上一篇博客,我们对输入相对于参考值的隶属度函数进行详细介绍。并进行可视化展示。

二、输入属性的参考值自动设置与隶属度函数设置

1.参考值自动设置

相比于传统的人工设置(程序如下),实现参考值的自动设置无疑大大降低了模糊推理的入门难度。
人工设置代码如下:

# 输出设置3个参考值
y['N'] = fuzz.trimf(y_range, [1, 1, 5])
y['M'] = fuzz.trimf(y_range, [1, 5, 10])
y['P'] = fuzz.trimf(y_range, [5, 10, 10])

自动设置代码如下

x_stain.automf(3)  # 设置3个参考值,自动生成
x_oil.automf(3)

其中需要设置参考值个数

2.隶属度函数

对于输出,我们设置了3个参考值,采用的是三角形隶属度函数,其中三个参数分分别对应三角隶属度函数的【左下,上,右下】。其可视化如图1。可视化程序如下所示:

# 参考值设置可视化
x_stain.view(), x_oil.view(), y.view()

图1

对于2个输入,我们采用skfuzzy库的函数自动生成,本案例中所生成的是梯形隶属度函数,其可视化如图2,3所示。至于是不是自动生成的都是体型,还没有过验证。事实上,如果不考虑高斯隶属度函数的话,梯形确实是最复杂的隶属度函数了,也因此会精度比较高。
在这里插入图片描述
在这里插入图片描述

三、规则设置及可视化

9条规则的模糊规则矩阵如下所示:

输入参考值NMP
NN`MM
MNMP
PMMP

相对应的程序可以在下面的完整程序中找到,而规则的可视化程序如下所示:

# 规则设置可视化
rule0.view(), rule1.view(), rule2.view()

可视化结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我没看懂是啥意思~~~~·

四、模糊推理及可视化

五、总结

完整程序如下所示:

import numpy as np
import skfuzzy as fuzz
import skfuzzy.control as ctrl
import matplotlib.pyplot as plt

# 设置变量范围
# 输入
x_stain_range = np.arange(1, 11, 1, np.float32)  # 输入1
x_oil_range = np.arange(1, 11, 1, np.float32)    # 输入2
# 输出
y_range = np.arange(1, 11, 1, np.float32)

# 创建模糊控制变量
x_stain = ctrl.Antecedent(x_stain_range, 'stain')      # 输入1
x_oil = ctrl.Antecedent(x_oil_range, 'oil')            # 输入2
y = ctrl.Consequent(y_range, 'powder')   # 输出

# 定义模糊集和其隶属度函数
x_stain.automf(3)  # 设置3个参考值,自动生成
x_oil.automf(3)
# 输出设置3个参考值
y['N'] = fuzz.trimf(y_range, [1, 1, 5])
y['M'] = fuzz.trimf(y_range, [1, 5, 10])
y['P'] = fuzz.trimf(y_range, [5, 10, 10])

# 参考值设置可视化
x_stain.view(), x_oil.view(), y.view()

# 设定输出的解模糊方法——质心解模糊方式
y.defuzzify_method = 'centroid'

# 输出为N的规则
rule0 = ctrl.Rule(antecedent=((x_stain['poor'] & x_oil['poor']) |
                              (x_stain['average'] & x_oil['poor'])),
                  consequent=y['N'], label='rule N')

# 输出为M的规则
rule1 = ctrl.Rule(antecedent=((x_stain['good'] & x_oil['poor']) |
                              (x_stain['poor'] & x_oil['average']) |
                              (x_stain['average'] & x_oil['average']) |
                              (x_stain['poor'] & x_oil['average']) |
                              (x_stain['good'] & x_oil['good'])),
                  consequent=y['M'], label='rule M')

# 输出为P的规则
rule2 = ctrl.Rule(antecedent=((x_stain['average'] & x_oil['good']) |
                              (x_stain['good'] & x_oil['good'])),
                  consequent=y['P'], label='rule P')

# 规则设置可视化
rule0.view(), rule1.view(), rule2.view()

# 系统和运行环境初始化
system = ctrl.ControlSystem(rules=[rule0, rule1, rule2])
sim = ctrl.ControlSystemSimulation(system)

# 运行系统
sim.input['stain'] = 4
sim.input['oil'] = 7
sim.compute()
output_powder = sim.output['powder']

# 打印输出结果
print(output_powder)

# 画图y
y.view(sim=sim)
plt.show()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sweet_Chanyelo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值