Решение, чтобы решить ошибку утверждения и Значение ошибки? - PullRequest
0 голосов
/ 12 марта 2020

Это мой код с некоторой проблемой.

AssertionError: Общая площадь равна нулю при дефаззификации!

ValueError: Невозможно рассчитать четкие выходные данные, вероятно из-за слишком разреженной системы. Убедитесь, что этот набор входных значений будет активировать хотя бы один подключенный термин в каждом антецеденте через текущий набор правил. Вершина этих двух ошибок - шоу после того, как я запускаю свой код.

Ниже кода отображается полное сообщение об ошибке после запуска. могу я узнать в чем и в чем проблема?

import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl

Temp = ctrl.Antecedent(np.arange(0,101,1),'temperature')
Temp['Low'] = fuzz.trapmf(Temp.universe, [0,0,20,30])
Temp['Medium'] = fuzz.trimf(Temp.universe, [25,50,70])
Temp['High'] = fuzz.trapmf(Temp.universe, [60,80,100,100])

Humidity = ctrl.Antecedent(np.arange(0,101,1),'Humidity')
Humidity['Poor']=fuzz.trapmf(Humidity.universe, [0,0,10,20])
Humidity['Fair']=fuzz.trimf(Humidity.universe, [15,30,50])
Humidity['Good'] = fuzz.trapmf(Humidity.universe, [45,60,100,100])

CO = ctrl.Antecedent(np.arange(0,101,1),'CO')
CO['Low'] = fuzz.trapmf(CO.universe, [0,0,25,35])
CO['Medium'] = fuzz.trimf(CO.universe, [30,50,70])
CO['High'] = fuzz.trapmf(CO.universe, [65,80,100,100])

CO2 = ctrl.Antecedent(np.arange(0,101,1),'CO2')
CO2['Low'] = fuzz.trapmf(CO2.universe, [0,0,10,20])
CO2['Medium'] = fuzz.trimf(CO2.universe, [15,30,50])
CO2['High'] = fuzz.trapmf(CO2.universe, [45,60,100,100])

Condition = ctrl.Consequent(np.arange(0,101,1),'Health Condition')
Condition['Very Good']=fuzz.trapmf(Condition.universe, [0,0,10,30])
Condition['Good']=fuzz.trimf(Condition.universe, [20,30,40])
Condition['Medium']=fuzz.trimf(Condition.universe, [35,50,65])
Condition['Bad']=fuzz.trimf(Condition.universe, [60,70,80])
Condition['Dangerous']=fuzz.trapmf(Condition.universe, [75,90,100,100])

Temp.view()
Humidity.view()
CO.view()
CO2.view()
Condition.view()

rule1 = ctrl.Rule(Temp['Medium'] & Humidity['Fair'] & CO['Low'] & CO2['Low'], Condition['Good'])
rule2 = ctrl.Rule(Temp['Medium'] & Humidity['Good'] & CO['Medium'] & CO2['Low'], Condition['Very Good'])
rule3 = ctrl.Rule(Temp['Low'] & Humidity['Poor'] & CO['High'] & CO2['High'], Condition['Dangerous'])
rule4 = ctrl.Rule(Temp['High'] & Humidity['Poor'] & CO['Medium'] & CO2['Low'], Condition['Bad'])
rule5 = ctrl.Rule(Temp['Low'] & Humidity['Fair'] & CO['Medium'] & CO2['Medium'], Condition['Medium'])

rule1.view()
rule2.view()
rule3.view()
rule4.view()
rule5.view()

Health_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5])
HealthResult = ctrl.ControlSystemSimulation(Health_ctrl)

HealthResult.input['temperature'] =45
HealthResult.input['Humidity'] =40
HealthResult.input['CO'] =50
HealthResult.input['CO2'] =75

HealthResult.compute()

print(HealthResult.output['Health Condition'])
Condition.view(sim=HealthResult)



---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/skfuzzy/control/controlsystem.py in defuzz(self)
    586                 return defuzz(ups_universe, output_mf,
--> 587                               self.var.defuzzify_method)
    588             except AssertionError:

3 frames
/usr/local/lib/python3.6/dist-packages/skfuzzy/defuzzify/defuzz.py in defuzz(x, mfx, mode)
    247         zero_truth_degree = mfx.sum() == 0  # Approximation of total area
--> 248         assert not zero_truth_degree, 'Total area is zero in defuzzification!'
    249 

AssertionError: Total area is zero in defuzzification!

During handling of the above exception, another exception occurred:
ValueError                                Traceback (most recent call last)
<ipython-input-4-f358e5f1a15d> in <module>()
     56 HealthResult.input['CarbonDioxide'] =75
     57 
---> 58 HealthResult.compute()
     59 
     60 print(HealthResult.output['Health Condition'])

/usr/local/lib/python3.6/dist-packages/skfuzzy/control/controlsystem.py in compute(self)
    371         for consequent in self.ctrl.consequents:
    372             consequent.output[self] = \
--> 373                 CrispValueCalculator(consequent, self).defuzz()
    374             self.output[consequent.label] = consequent.output[self]
    375 

/usr/local/lib/python3.6/dist-packages/skfuzzy/control/controlsystem.py in defuzz(self)
    587                               self.var.defuzzify_method)
    588             except AssertionError:
--> 589                 raise ValueError("Crisp output cannot be calculated, likely "
    590                                  "because the system is too sparse. Check to "
    591                                  "make sure this set of input values will "

ValueError: Crisp output cannot be calculated, likely because the system is too sparse. Check to make sure this set of input values will activate at least one connected Term in each Antecedent via the current set of Rules.

1 Ответ

1 голос
/ 27 апреля 2020

Когда он говорит, что «слишком разреженный» говорит о том, что есть зоны, где правило не активировано, следовательно, нельзя рассчитать площадь (hiper-area), поэтому нельзя вычислить центр тяжести (деление на ноль в основном). В вашем случае:

Правило 1: C0 и C02 имеют 0 членство

Правило 2: Влажность и C02 имеют 0 членство

Правило 3: Температура, Влажность и CO имеют 0 членство

Правило 4: Tempreature и CO2 имеют 0 членства.

Следовательно, область не создается

...