简单函数模糊规则的实现
frules的Python项目详细描述
frules-简单函数模糊规则
frules代表fuzzy/funnational规则。它使工作变得容易 带有模糊规则和变量。
安装:
pip install frules
语言变量和表达式
表达是frules的核心概念。Expression类表示 linguistic variable的子范围 在模糊逻辑中。
古典数学中的变量取数值。在模糊逻辑中, 语言变量是非数字的,用 表达。表达式映射连续变量,如nemerical 与语言对应的温度。例如温度可以 被描述为冷、热或热。两者之间没有严格的界限 寒冷和温暖-这就是为什么这些表达是模糊的。
为了创建新的表达式,我们使用函数 连续变量并返回truth value。真值范围 介于0和1之间-这是一个连续值的隶属度 语言变量。
fromfrules.expressionsimportExpression#We know that anything over 50 degrees is hot and below 40 is't hothot=Expression(lambdax:min(1,max((x-40)/10.,0)))
这个丑陋的lambda是一些模糊集的表示。如果我们看看 它的行为,我们将看到它实际上返回1 50,40以下为0,40到50之间为线性值:
>>>map(lambdax:{x:min(1,max((x-40)/10.,0))},xrange(35,55,2))[{35:0},{37:0},{39:0},{41:0.1},{43:0.3},{45:0.5},{47:0.7},{49:0.9},{51:1},{53:1}
在实践中使用大量lambda会使代码变得一团糟。模糊的 这样描述的表达式也很难编写,因为 他们必须满足的一些价值主张。
这就是为什么我们不使用原始函数并封装它们 用表达式。此外,frules还提供了一组帮助程序,可以简化 新表达式的定义。的完整表达式集示例 温度变量可能是这样的:
fromfrules.expressionsimportExpressionasEfromfrules.expressionsimportltrapezoid,trapezoid,rtrapezoidcold=E(ltrapezoid(10,20),"cold")# anything below 10, more is fuzzywarm=E(trapezoid(10,20,30,35),"warm")# anything between 20 and 30hot=E(rtrapezoid(30,35),"hot")# anything over 35, less is fuzzy
可以使用逻辑运算符重用/混合表达式:
cold_or_hot=cold||warmnot_hot=!hot
当我们开始使用模糊规则时,可选名称将很有帮助。
模糊规则
尽管表达式定义了语言变量,但它们并不严格 绑定到任何变量。它们是我们用来形容的形容词 某些东西及其意义完全取决于上下文。两个person 并且data可以是big但是这个特殊的形容词有slighlty 每种情况下都有不同的含义。
Rule对象将连续变量与表达式绑定。规则也 也可以通过评估来了解它们对于给定的连续 输入。
>>> from frules.rules import Rule >>> is_hot = Rule(temperature=hot) >>> is_hot.eval(temperature=5) 0.8
可以使用逻辑运算符(&和|)混合规则来创建 允许模糊推理的更复杂规则:
fromfrules.expressionsimportExpressionasEfromfrules.rulesimportRuleasRfromfrules.expressionsimportltrapezoid,trapezoid,rtrapezoid# car age expressionsold=E(ltrapezoid(2001,2008),"old")new=E(rtrapezoid(2013,2014),"new")not_so_old=-(old&new)# power expressionsstrong=E(rtrapezoid(50,100),"strong")weak=E(ltrapezoid(50,100),"weak")# price expressionexpensive=E(rtrapezoid(25000,30000),"expensive")cheap=-expensive# yes expressionyes=E(lambdayes:float(yes),"yes")# converts bool to float# rulesis_attractive=R(production_year=not_so_old)&R(horsepower=strong)should_buy=is_attractive&R(price=cheap)
有了这样一套规则,我们可以做一些推理:
>>> should_buy (((age = !(old & new) & horsepower = strong) & !None = None) & cost = !expensive) >>> should_buy.eval(horsepower=70, production_year=2012, price=15000) 0.4 >>> >>> candidates = { ... "car1": {"horsepower": 70, "production_year": 2012, "price": 15000}, ... "car2": {"horsepower": 150, "production_year": 2010, "price": 30000}, ... "car3": {"horsepower": 90, "production_year": 2014, "price": 10000}, ... "car4": {"horsepower": 85, "production_year": 2009, "price": 35000}, ... } >>> max(candidates.iteritems(), key=lambda (key, inputs): is_hot.eval(**inputs)) ('car3', {'horsepower': 90, 'price': 10000, 'production_year': 2014})