使用Python skfuzzy库自定义三角隶属函数遇阻,寻求解决方法
解决skfuzzy中前件自定义三角隶属函数的问题
我来帮你搞定这个自定义三角隶属函数的难题!从你给出的代码片段来看,大概率是没掌握手动定义隶属函数的正确姿势,我给你整理了完整的实现步骤和示例代码:
关键要点
首先要明确:skfuzzy的Antecedent(前件)支持手动绑定自定义隶属函数,核心是用skfuzzy.trimf()生成三角隶属函数,然后赋值给前件的模糊集合。
完整示例代码
# 导入必要库,注意要单独导入control模块 import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl # 1. 定义前件(位置偏差x_pos)的论域 x_pos = ctrl.Antecedent(np.arange(-0.25, 0.25, 0.001), 'x_pos') # 2. 自定义三角隶属函数:给x_pos添加5个模糊集合 # fuzz.trimf(论域数组, [左端点, 峰值点, 右端点]) x_pos['NB'] = fuzz.trimf(x_pos.universe, [-0.25, -0.25, -0.1]) # 负大 x_pos['NS'] = fuzz.trimf(x_pos.universe, [-0.15, -0.075, 0]) # 负小 x_pos['Z'] = fuzz.trimf(x_pos.universe, [-0.05, 0, 0.05]) # 零 x_pos['PS'] = fuzz.trimf(x_pos.universe, [0, 0.075, 0.15]) # 正小 x_pos['PB'] = fuzz.trimf(x_pos.universe, [0.1, 0.25, 0.25]) # 正大 # 3. 定义后件(这里以5个后件为例,你可以根据需求调整论域) # 示例后件1:伺服角度 servo_angle = ctrl.Consequent(np.arange(0, 180, 1), 'servo_angle') # 同样可以给后件自定义隶属函数,或者用automf快速生成 servo_angle.automf(5) # 自动生成5个模糊集合,也可以手动用trimf定义 # 4. 可视化前件的隶属函数,验证效果 x_pos.view()
常见问题排查
- 如果你之前报错,可能是没导入
skfuzzy.control模块:一定要写from skfuzzy import control as ctrl,而不是只导入skfuzzy - 自定义隶属函数时,要确保
trimf的三个点在论域范围内,比如你的x_pos论域是[-0.25,0.25],所以顶点不能超出这个区间 - 给前件添加模糊集合时,直接通过
前件['集合名'] = 隶属函数的方式赋值即可
扩展说明
如果需要更复杂的隶属函数(比如梯形、高斯),可以用fuzz.trapmf()、fuzz.gaussmf()等函数,用法和trimf类似,只需要传入对应的参数即可。
内容的提问来源于stack exchange,提问作者CR7
相关产品推荐
相关产品推荐

