如何生成自定义的隶属函数Scikit Fuzzy模块?

时间:2019-06-03 08:42:10

标签: python fuzzy-logic skfuzzy

我正在开发一种模糊系统,用于根据旅程距离和活跃用户数量来预测航班价格的上涨。这样,用户数量越多,价格就越高。

为此,我已经定义了先行词(输入)后续项(输出)

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 :(得分:0)

您使用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])