简单函数模糊规则的实现

frules的Python项目详细描述


Build StatusCoverage Status

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
未绘制java OpenGL顶点   swing无法在Java框架中设置文本   java使用xmemcached客户端访问AWS ElastiCache   java将元素添加到默认arraylist   java从给定位置向后逐个字符地读取文件   java将为此处显示的代码创建多少个对象?   Java异步返回CompletableFuture   java在滚动视图中显示图像   我想为用Netbeans开发的Java项目创建安装程序,并使用Mysql Xampp   java是否可以将COUNT与不同的JPA投影一起使用?   java如何定制javafx。场景图表NumberAxis用于更改20个主要记号的硬编码上限   javajavax。xml。ws。WebServiceException:无法访问WSDL   Jboss中的java多线程   java类不是抽象类,并且不重写抽象方法actionPerformed(ActionEvent)   基于java Spring安全令牌的身份验证   java如何在Spring MVC的自定义验证器中从属性文件中读取参数值   使用OpenCV和java在Android中点击获取图像维度?   java无法解析为变量解析。通用域名格式