You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scikit-fuzzy新API构建模糊系统时绘图无响应问题咨询

问题分析与解决方案

嘿,我帮你排查了下代码和问题,绘图无响应的核心原因其实很明确,另外还有几个小细节可以优化,一起来看看:

核心问题:绘图窗口无响应的根源

scikit-fuzzy的view()方法是基于matplotlib实现的,但在库的新版本中,它不再自动触发plt.show()来显示图形。如果你的代码是作为普通Python脚本运行,没有这个显式调用的话,绘图窗口会卡在“无响应”状态——因为matplotlib的事件循环没启动,图形没法正常渲染。

快速修复步骤:

  1. 先导入matplotlib的pyplot模块:
import matplotlib.pyplot as plt
  1. 在所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:43