【问题标题】:SkFuzzy Giving "ValueError: Unexpected input: quality"SkFuzzy 给出“ValueError:意外输入:质量”
【发布时间】:2021-04-05 13:00:46
【问题描述】:

使用 SCI-KIT LEARN 中的 SKFUZZ 在 Python 中编写的代码集如下:

import skfuzzy as fuzz
import numpy as np
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt

# New Antecedent/Consequent objects hold universe variables and membership
# functions
quality = ctrl.Antecedent(np.arange(0, 11, 1),'quality')
service = ctrl.Antecedent(np.arange(0, 11, 1), 'service')
tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')

# Auto-membership function population is possible with .automf(3, 5, or 7)
quality.automf(5)
service.automf(5)

tip['lower'] = fuzz.gaussmf(tip.universe,5,2)
tip['low'] = fuzz.gaussmf(tip.universe,10,2)
tip['average'] = fuzz.gaussmf(tip.universe,15,2)
tip['high'] = fuzz.gaussmf(tip.universe,20,1)
tip['higher'] = fuzz.gaussmf(tip.universe,23,0.5)


rule1 = ctrl.Rule(((quality['poor'] | quality['mediocre']) and (service['poor'] | service['mediocre'])), tip['lower'])
rule2 = ctrl.Rule(((quality['average'] | quality['mediocre']) and (service['poor'] | service['mediocre'])), tip['low'])
rule3 = ctrl.Rule(((quality['average'] | quality['decent']) and (service['mediocre'] | service['average'])), tip['average'])
rule4 = ctrl.Rule(((quality['decent'] | quality['good']) and (service['poor'] | service['mediocre'])), tip['average'])
rule5 = ctrl.Rule(((quality['decent'] | quality['good']) and (service['decent'] | service['mediocre'])), tip['high'])
rule6 = ctrl.Rule(((quality['decent'] | quality['good']) and (service['decent'] | service['good'])), tip['higher'])


tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6])

tipping = ctrl.ControlSystemSimulation(tipping_ctrl)


tipping.input['service'] = 10
tipping.input['quality'] = 10
tipping.compute()

print(tipping.output['tip'])
tip.view(sim=tipping)

在执行代码集时出现以下错误。错误是一个价值错误,不确定我为什么会得到这个?是因为我输入规则的方式吗?:

Traceback (most recent call last):
  File "/Users/gaurangsmacbookpro/Desktop/Gaurang/PYTHON_CODE/FuzzyLogic/employee_salary.py", line 60, in <module>
    tipping.input['quality'] = 10
  File "/usr/local/lib/python3.8/site-packages/skfuzzy/control/controlsystem.py", line 168, in __setitem__
    raise ValueError("Unexpected input: " + key)
ValueError: Unexpected input: quality

有人可以告诉我我在这里做错了什么吗?有点出乎意料。

【问题讨论】:

    标签: python python-3.x fuzzy-logic skfuzzy


    【解决方案1】:

    在执行前用 value() 检查输入值并按顺序排列代码。

    【讨论】:

    • 我没学过,你能举个例子吗?
    【解决方案2】:

    尝试自动定义您的输入成员函数,而不是使用 automf()。

    例如

    quality['poor'] = fuzz.gaussmf(quality.universe, 1, 5)
    quality['mediocre'] = fuzz.gaussmf(quality.universe, 5, 10)
    etc.
    

    【讨论】:

      【解决方案3】:

      很难弄清楚使用 skfuzzy 到底出了什么问题。我在不同的场合都面临过类似的挑战。

      规则定义是模糊将先行词注册到内存中的地方。不是模糊化步骤。请按照以下步骤确保您的前身得到注册。

      • 将出现的orand 分别替换为|&amp;

      • 您可以通过以下代码检查您的antecedentconsequence 变量是否已注册

      对于输入变量

      <code>
          for inp_var in problem.input.sim.ctrl.antecedents:
              print(inp_var)
      </code>
      

      对于输出变量

      <code>
          for out_var in problem.input.sim.ctrl.consequents:
              print(out_var)
      </code>
          
      
      • 仅针对一条规则尝试此操作,并检查适用于您的用例的一个参数(可能是 |and)。

      【讨论】:

        【解决方案4】:

        您的代码绝对没问题,但是通过使用and 而不是&amp;,您是在告诉它只接受一个先行词。在下面找到现在完美运行的编辑程序。复制它,或者你可以编辑你的原始代码,你应该没问题。

        import skfuzzy as fuzz
        import numpy as np
        from skfuzzy import control as ctrl
        import matplotlib.pyplot as plt
        
        # New Antecedent/Consequent objects hold universe variables and membership
        # functions
        quality = ctrl.Antecedent(np.arange(0, 11, 1),'quality')
        service = ctrl.Antecedent(np.arange(0, 11, 1), 'service')
        tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')
        
        # Auto-membership function population is possible with .automf(3, 5, or 7)
        quality.automf(5)
        service.automf(5)
        
        tip['lower'] = fuzz.gaussmf(tip.universe,5,2)
        tip['low'] = fuzz.gaussmf(tip.universe,10,2)
        tip['average'] = fuzz.gaussmf(tip.universe,15,2)
        tip['high'] = fuzz.gaussmf(tip.universe,20,1)
        tip['higher'] = fuzz.gaussmf(tip.universe,23,0.5)
        
        
        rule1 = ctrl.Rule(((quality['poor'] | quality['mediocre']) & (service['poor'] | 
        service['mediocre'])), tip['lower'])
        rule2 = ctrl.Rule(((quality['average'] | quality['mediocre']) & (service['poor']   
        | service['mediocre'])), tip['low'])
        rule3 = ctrl.Rule(((quality['average'] | quality['decent']) & 
        (service['mediocre'] | service['average'])), tip['average'])
        rule4 = ctrl.Rule(((quality['decent'] | quality['good']) & (service['poor'] | 
        service['mediocre'])), tip['average'])
        rule5 = ctrl.Rule(((quality['decent'] | quality['good']) & (service['decent'] | 
        service['mediocre'])), tip['high'])
        rule6 = ctrl.Rule(((quality['decent'] | quality['good']) & (service['decent'] | 
        service['good'])), tip['higher'])
        
        
        tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6])
        
        tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
        
        
        tipping.input['service'] = 10
        tipping.input['quality'] = 10
        tipping.compute()
        
        print(tipping.output['tip'])
        tip.view(sim=tipping)
        

        【讨论】:

          猜你喜欢
          • 2018-08-25
          • 2012-11-07
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2016-04-11
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多