Как сгенерировать пользовательскую функцию членства модуля Scikit Fuzzy? - PullRequest
1 голос
/ 03 июня 2019

Я разрабатываю нечеткую систему для прогнозирования увеличения цены полета в зависимости от расстояния поездки и количества активных пользователей.Таким образом, чем больше число пользователей будет выше, тем больше будет цена.

Для этого я определил Antecents (Входы) & Последовательные (Выходы) :

distance = ctrl.Antecedent(np.arange(1, 20000, 1), 'distance')
users = ctrl.Antecedent(np.arange(0, 50, 1), 'users')
price = ctrl.Consequent(np.arange(0, 10000, 1), 'price')

Я могу автоматически генерировать функции членства следующим образом:

distance.automf(3)
users.automf(3)
price.automf(5)

Но я хотел бы сделать пользовательские функции членства такими:

distance['low'] = fuzz.trimf(distance.universe, [50, 1000, 2000])
distance['medium'] = fuzz.trimf(distance.universe, [2000, 3000, 5000])
distance['high'] = fuzz.trimf(distance.universe, [5000, 10000, 20000])

И аналогичноа также для других.

Но при вычислениях я получаю:

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.

Полагаю, эта ошибка связана с неправильным выбором значений в пользовательских функциях членства.

Из-за отсутствия достаточного количества примеров в официальной документации я не могу найти основную причину или понять правильную методологию выбора значений x, y, z в функциях членства.

где,x, y, z:

distance['low'] = fuzz.trimf(distance.universe, [x, y, z])
.
.
users['low'] = fuzz.trimf(users.universe, [x, y, z])
. 
.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 15 июня 2019

Вы определили distance, используя np.arange(1, 20000, 1), но создали нечеткий distance, начиная с 50 в distance['low'] = fuzz.trimf(distance.universe, [50, 1000, 2000]).Поэтому я считаю, что вы можете решить эту проблему, просто сделав это:

distance['low'] = fuzz.trimf(distance.universe, [1, 1000, 2000])
...