使用scikit-fuzzy新API构建模糊系统时绘图无响应问题咨询
问题分析与解决方案
嘿,我帮你排查了下代码和问题,绘图无响应的核心原因其实很明确,另外还有几个小细节可以优化,一起来看看:
核心问题:绘图窗口无响应的根源
scikit-fuzzy的view()方法是基于matplotlib实现的,但在库的新版本中,它不再自动触发plt.show()来显示图形。如果你的代码是作为普通Python脚本运行,没有这个显式调用的话,绘图窗口会卡在“无响应”状态——因为matplotlib的事件循环没启动,图形没法正常渲染。
快速修复步骤:
- 先导入matplotlib的pyplot模块:
import matplotlib.pyplot as plt
- 在所有
view()调用的最后,加上plt.show():
比如你的代码里,在vol.view(sim=vol_suara)之后加上这行,就能让图形窗口正常显示了。
代码里的其他小优化(非绘图相关,但能让代码更整洁)
- 重复规则冗余:你写的rule2和rule3完全一样,这会导致规则被重复加载,虽然不影响计算结果,但没必要留着,删掉其中一个就行。
- 命名混淆问题:你把输出变量的名称设为
'UKURAN VOLUME',但输入变量已经有'UKURAN',虽然语法没问题,但容易搞混,建议改成更清晰的'VOLUME',对应的输出打印也要跟着调整。
修复后的完整代码
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl import matplotlib.pyplot as plt # 新增导入 # 清晰集定义 keramaian = ctrl.Antecedent(np.arange(0, 30, 1), 'KERAMAIAN') ukuran = ctrl.Antecedent(np.arange(0, 25, 1), 'UKURAN') vol = ctrl.Consequent(np.arange(0, 100, 1), 'VOLUME') # 修正输出变量名 # 模糊化 ukuran['Kecil'] = fuzz.trimf(ukuran.universe, [0, 0, 13]) ukuran['Sedang'] = fuzz.trimf(ukuran.universe, [0, 12, 24]) ukuran['Besar'] = fuzz.trimf(ukuran.universe, [12, 24, 24]) keramaian['sunyi'] = fuzz.trimf(keramaian.universe, [0, 0, 15]) keramaian['Cukup Ramai'] = fuzz.trimf(keramaian.universe, [0, 15, 29]) keramaian['Berisik'] = fuzz.trimf(keramaian.universe, [15, 29, 29]) vol['Pelan'] = fuzz.trimf(vol.universe, [0, 0, 40]) vol['Sedang'] = fuzz.trimf(vol.universe, [30, 50, 70]) vol['Kencang'] = fuzz.trimf(vol.universe, [60, 99, 99]) # 规则集:删除重复的rule3 rule1 = ctrl.Rule(ukuran['Kecil'] & keramaian['Berisik'], vol['Kencang']) rule2 = ctrl.Rule(ukuran['Kecil'] & keramaian['Cukup Ramai'], vol['Kencang']) rule4 = ctrl.Rule(ukuran['Sedang'] & keramaian['Berisik'], vol['Sedang']) rule5 = ctrl.Rule(ukuran['Sedang'] & keramaian['Cukup Ramai'], vol['Sedang']) rule6 = ctrl.Rule(ukuran['Sedang'] & keramaian['sunyi'], vol['Sedang']) rule7 = ctrl.Rule(ukuran['Besar'] & keramaian['Berisik'], vol['Pelan']) rule8 = ctrl.Rule(ukuran['Besar'] & keramaian['Cukup Ramai'], vol['Pelan']) rule9 = ctrl.Rule(ukuran['Besar'] & keramaian['sunyi'], vol['Pelan']) vol_suara_ctrl = ctrl.ControlSystem([rule1, rule2, rule4, rule5, rule6, rule7, rule8, rule9]) vol_suara = ctrl.ControlSystemSimulation(vol_suara_ctrl) keramaian['sunyi'].view() vol_suara.input['KERAMAIAN'] = int(input("Masukkan jumlah keramaian?\n")) vol_suara.input['UKURAN'] = int(input("Masukkan ukuran speaker?\n")) # 去模糊化 vol_suara.compute() vol.view(sim=vol_suara) plt.show() # 新增图形显示调用 print(vol_suara.output['VOLUME']) # 修正输出字段名
额外说明
如果你的代码是在Jupyter Notebook这类交互式环境中运行,可能不需要plt.show(),但在普通Python脚本里必须加——这是新版本scikit-fuzzy和旧版本的一个明显差异:旧版本可能在view()内部自动帮你调用了plt.show(),新版本则把这个控制权交给了用户,让你更灵活地控制图形显示时机。
内容的提问来源于stack exchange,提问作者jadoel
相关产品推荐
相关产品推荐

