如何生成自定义会员函数Scikit模糊模块?



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

为此,我定义了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])
. 
.

我在这里错过了什么?

您使用np.arange(1, 20000, 1)定义了distance,但您从distance['low'] = fuzz.trimf(distance.universe, [50, 1000, 2000])中的50开始创建了模糊化distance。 所以我相信你可以通过简单地这样做来解决错误:

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

您只需做两件事即可修复错误,因为我亲身经历过并修复了它。不幸的是,我还不能分享我的代码,因为它仍在考虑我的博士学位,必须首先受到保护。 尽管如此,我会告诉你该怎么做,如果你做得好,你的问题就会得到解决。

第一步是更正从 1 到 2000 的距离的先行,如下所示:

distance = ctrl.Antecedent(np.arange(0, 20001, 1), 'distance')

并且也进行此调整以从 1 开始。

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

最后一步是查看您的模糊规则。您没有共享它们,所以我不知道涵盖的内容和未涵盖的内容,但是您需要编写涵盖所有可能的输出或先行结果的规则。例如,当两个条件(输入)都是极端高、极低或直接相反(如低距离和高用户)或相反或相反时,您希望系统做什么?只需确保涵盖所有可能的结果即可。

最后,正如我从使用该软件包中了解到的那样,输入似乎是矢量化的,因此相反的极端输入(例如一个低而另一个高),规则必须涵盖两个方向。如果不是这种情况,附加规则仍然不会损害您的最终结果。如果这个答案没有解决错误,我很乐意讨论。

最新更新