前言
在我的上一篇博客中,对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()
对于2个输入,我们采用skfuzzy库的函数自动生成,本案例中所生成的是梯形隶属度函数,其可视化如图2,3所示。至于是不是自动生成的都是体型,还没有过验证。事实上,如果不考虑高斯隶属度函数的话,梯形确实是最复杂的隶属度函数了,也因此会精度比较高。
三、规则设置及可视化
9条规则的模糊规则矩阵如下所示:
输入参考值 | N | M | P |
---|---|---|---|
N | N` | M | M |
M | N | M | P |
P | M | M | P |
相对应的程序可以在下面的完整程序中找到,而规则的可视化程序如下所示:
# 规则设置可视化
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()