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

How to generate custom membership function Scikit Fuzzy module?

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

为此我定义了 前因(输入) & 后因(输出) :

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])

你只需要做两件事就可以修复这个错误,因为我亲身经历过并修复了它。不幸的是,我还不能分享我的代码,因为我的 Ph.D 仍在考虑中。并且必须首先受到保护。不过,我会告诉你怎么做,你做好了,你的问题就迎刃而解了。

第一步是修正距离的前因以覆盖 1 到 2000,如下所示:

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

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

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

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

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