栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()

对于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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357119.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号