scikit-fuzzy新API下Tipping Problem如何更改defuzzification method?
scikit-fuzzy 新API切换去模糊方法的操作指引
针对你已跑通的新API版本小费问题示例,不需要改动核心规则、隶属度函数的定义逻辑,只要在对应环节调整参数,就能在默认centroid方法之外切换测试其他去模糊方案,所有操作完全兼容原有示例代码。
可选用的内置去模糊方法
除默认的centroid(重心法)外,框架内置支持的可选项固定为以下几个,传入时必须使用严格小写字符串,否则会触发参数校验报错:
bisector:区域二分法mom:最大隶属度平均值som:最大隶属度最小值lom:最大隶属度最大值
两种常用的设置方式
1. 全局指定输出变量的去模糊方法
在初始化输出 consequent 变量时直接传入参数,后续所有涉及该变量的计算都会默认使用指定方法,替代原有默认的centroid逻辑。
你原有示例中定义小费输出变量的代码类似:
tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')
调整后增加defuzzify_method参数即可全局生效:
tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip', defuzzify_method='mom')
2. 临时切换方法做对比测试
如果需要在同一段控制逻辑下测试不同方法的输出差异,不需要反复修改初始化代码,可以在每次执行compute()前,临时修改输出变量实例的defuzzify_method属性即可:
# 初始化控制仿真器、设置输入值的原有逻辑保持不变 simulation = ctrl.ControlSystemSimulation(tipping_ctrl) simulation.input['service'] = 9.3 simulation.input['food'] = 6.5 # 临时切换为lom方法计算 tip.defuzzify_method = 'lom' simulation.compute() print("lom方法输出的小费值:", simulation.output['tip']) # 临时切换为bisector方法计算 tip.defuzzify_method = 'bisector' simulation.compute() print("bisector方法输出的小费值:", simulation.output['tip'])
常见注意事项
- 不要直接调用老版本独立的
fuzzy.defuzz()函数处理新API生成的隶属度曲线,新API的去模糊逻辑是绑定在Consequent类实例上的,独立调用极易触发参数不匹配报错。 - 临时修改的
defuzzify_method属性是全局绑定在输出变量上的,修改后如果不主动改回,后续所有compute操作都会沿用最后设置的方法。 - 批量对比不同方法时,可以循环遍历所有内置方法名,每次修改属性后重新跑compute取输出值,不需要反复新建控制逻辑。
内容的提问来源于stack exchange,提问作者BasicTex
相关产品推荐
相关产品推荐

