子句判断、启动强度和去模糊化--AForge.NET框架的使用(三)

原文:子句判断、启动强度和去模糊化--AForge.NET框架的使用(三)

使用AForge.NET进行模糊运算

上一篇说来一些模糊运算的数学问题,用AForge.NET做相关运算就很简单了。

1.联集运算中的标准联集

数学:s (p,q) = max (p,q)

程序:

public class MaximumCoNorm : ICoNorm { public float Evaluate( float membershipA, float membershipB )     { return Math.Max( membershipA, membershipB );     } }

2.交集运算中的标准交集

数学:t (p,q) = min (p,q)

程序:

public class MinimumNorm : INorm { public float Evaluate( float membershipA, float membershipB )     { return Math.Min( membershipA, membershipB );     } }

3.交集运算中的代数乘积:

数学:t (p,q) = pq

程序:

public class ProductNorm : INorm { public float Evaluate( float membershipA, float membershipB )     { return membershipA * membershipB;     } }

 

4.逻辑非

数学:t(p)=1-p

程序:

public class NotOperator : IUnaryOperator { public float Evaluate( float membership )     { return ( 1 - membership );     } }

我比较好奇AForge.NET没有实现彻底联集和彻底交集,只有自己补上了。

子句判断(Clause)

这个严格来说只是一个辅助用的类,它可以判断特定的子句是否可以构建。

依旧用温度举例,语意变量temperature的hot隶属度0.4,warm隶属度0.6。那么temperature is hot和temperature is warm都可以构建。

LinguisticVariable lvTemperature = new LinguisticVariable("Temperature", 0, 50);

TrapezoidalFunction function1 = new TrapezoidalFunction(10, 15, TrapezoidalFunction.EdgeType.Right); FuzzySet fsCold = new FuzzySet("Cold", function1); TrapezoidalFunction function2 = new TrapezoidalFunction(10, 15, 20, 25); FuzzySet fsCool = new FuzzySet("Cool", function2); TrapezoidalFunction function3 = new TrapezoidalFunction(20, 25, 30, 35); FuzzySet fsWarm = new FuzzySet("Warm", function3); TrapezoidalFunction function4 = new TrapezoidalFunction(30, 35, TrapezoidalFunction.EdgeType.Left); FuzzySet fsHot = new FuzzySet("Hot", function4);

lvTemperature.AddLabel(fsCold); lvTemperature.AddLabel(fsCool); lvTemperature.AddLabel(fsWarm); lvTemperature.AddLabel(fsHot);

Clause fuzzyClause1 = new Clause(lvTemperature, fsHot); lvTemperature.NumericInput = 35; float result1 = fuzzyClause1.Evaluate(); Console.WriteLine("temperature is hot  ====>  {0}", result1.ToString());

Clause fuzzyClause2 = new Clause(lvTemperature, fsCold); lvTemperature.NumericInput = 35; float result2 = fuzzyClause2.Evaluate(); Console.WriteLine("temperature is cold  ====>  {0}", result2.ToString());  

效果:

很明显在35度时,temperature is hot 可以构建,temperature is cold则不行。

这个类在自己写东西的时候一般用不上,但是如果要编写泛用性的或者拿给别人用的系统,那么最后每个子句都检查一下。

启动强度(Firing Strength)

启动强度(Firing Strength)是衡量规则和输入的匹配度的量。

举个例子,语意变量Steel为Cold 的隶属度是0.6,Stove为Hot的隶属度为0.4。

那么规则R1:IF Steel is Cold and Stove is Hot then Pressure is Low 的Firing Strength=min(x,y)=0.4

规则R2:IF Steel is Cold and not (Stove is Warm or Stove is Hot) then Pressure is Medium"的Firing Strength=0.4

(以上算法只是这里采用的而已,不同的运算规则会有不同结果,比如0.24之类的)

       

 TrapezoidalFunction function1 = new TrapezoidalFunction( 10, 15, TrapezoidalFunction.EdgeType.Right);         FuzzySet fsCold = new FuzzySet("Cold", function1);         TrapezoidalFunction function2 = new TrapezoidalFunction(10, 15, 20, 25);         FuzzySet fsCool = new FuzzySet("Cool", function2);         TrapezoidalFunction function3 = new TrapezoidalFunction(20, 25, 30, 35);         FuzzySet fsWarm = new FuzzySet("Warm", function3);         TrapezoidalFunction function4 = new TrapezoidalFunction( 30, 35, TrapezoidalFunction.EdgeType.Left);         FuzzySet fsHot = new FuzzySet("Hot", function4);

LinguisticVariable lvSteel = new LinguisticVariable("Steel", 0, 80);

lvSteel.AddLabel(fsCold);         lvSteel.AddLabel(fsCool);         lvSteel.AddLabel(fsWarm);         lvSteel.AddLabel(fsHot);

LinguisticVariable lvStove = new LinguisticVariable("Stove", 0, 80); 

lvStove.AddLabel(fsCold);         lvStove.AddLabel(fsCool);         lvStove.AddLabel(fsWarm);         lvStove.AddLabel(fsHot); 

TrapezoidalFunction function5 = new TrapezoidalFunction( 20, 40, TrapezoidalFunction.EdgeType.Right);         FuzzySet fsLow = new FuzzySet("Low", function5);         TrapezoidalFunction function6 = new TrapezoidalFunction(20, 40, 60, 80);         FuzzySet fsMedium = new FuzzySet("Medium", function6);         TrapezoidalFunction function7 = new TrapezoidalFunction( 60, 80, TrapezoidalFunction.EdgeType.Left);         FuzzySet fsHigh = new FuzzySet("High", function7); 

LinguisticVariable lvPressure = new LinguisticVariable("Pressure", 0, 100); 

lvPressure.AddLabel(fsLow);         lvPressure.AddLabel(fsMedium);         lvPressure.AddLabel(fsHigh);

Database db = new Database();         db.AddVariable(lvSteel);         db.AddVariable(lvStove);         db.AddVariable(lvPressure);

Rule r1 = new Rule(db, "R1", "IF Steel is Cold and Stove is Hot then Pressure is Low");         Rule r2 = new Rule(db, "R2", "IF Steel is Cold and not (Stove is Warm or Stove is Hot) then Pressure is Medium");         Rule r3 = new Rule(db, "R3", "IF Steel is Cold and Stove is Warm or Stove is Hot then Pressure is High");

lvSteel.NumericInput = 12;         lvStove.NumericInput = 32;

float result1 = lvSteel.GetLabelMembership("Cold", lvSteel.NumericInput);         Console.WriteLine("membership of Cold  ===>   {0}", result1); float result2 = lvStove.GetLabelMembership("Hot", lvStove.NumericInput);         Console.WriteLine("membership of Hot  ===>  {0}", result2); float result3 = r1.EvaluateFiringStrength();         Console.WriteLine(r1.GetRPNExpression());         Console.WriteLine("firing strength of R1  ===>  {0}",result3); float result4 = r2.EvaluateFiringStrength();         Console.WriteLine(r2.GetRPNExpression());         Console.WriteLine("firing strength of R2  ===>  {0}", result4); 

 

 

去模糊化(defuzzification )

这可以说是模糊系统的最后一步,将经过模糊推理之后产生的结论,转换为一明确数值,称之为“去模糊化”。

至于这一步骤的必要性,一般有两个原因:

1.不同的模糊规则产生的结果不一致,有的是集合,有的是具体的数据,需要一个统一。

2.模糊系统一般不单独使用,它和其他系统(如神经网络)等搭配时,输出值必须是数值。

去模糊化常用方法有最大隶属度法、取中位数法和重心法。

AForge.Net的实现是CentroidDefuzzifier,即重心法。

当论域为连续时:

当论域为离散时:

InferenceSystem IS = new InferenceSystem( fuzzyDB, new CentroidDefuzzifier( 1000 ) );

至此大部分知识准备就完成了,下一篇会给出一个完整一些的示例。

最后找到一个有关模糊集合的PPT,大家可以参考一下:
http://www.ctdisk.com/file/4496068

时间: 2024-12-29 06:56:11

子句判断、启动强度和去模糊化--AForge.NET框架的使用(三)的相关文章

Js判断密码强度并显示提示信息

  用javascipt实现的Ajax判断密码强弱的功能,大多数有用户注册功能的网站,都会有这么一个功能,作为WEB程序员,应该会写这种小模块哦,不懂的就看下这个例子,觉得挺简单,当初帮助了不少人学会了密码强度的检测. 表单部分,用来显示密码框和密码强度提示信息:   JavaScript部分,比较主要,在此判断密码强度,这里一共用了四个自定义函数分别实现密码字符串的类型判断.模式统计.返回密码强度级别.根据密码框失去焦点来显示不同的颜色,以警示密码强度值,具体代码:     这两段代码可以合成

java-Java如何判断声音强度

问题描述 Java如何判断声音强度 希望实现声音强度如果大于某值则进行采集,直到声音小于某值,否则不进行记录 解决方案 http://www.pudn.com/downloads524/sourcecode/multimedia/audio/detail2172892.html 解决方案二: http://www.pudn.com/downloads524/sourcecode/multimedia/audio/detail2172892.html 解决方案三: http://www.codef

JavaScript判断密码强度(自写代码)_javascript技巧

在一些网站注册的时候经常可以看到密码强度提示,例如优酷:  今天自己做了一个JS密码强度判断,效果如下:  以下是代码: 复制代码 代码如下: <html> <head> <title>JS判断密码强度</title> <script language=javascript> //判断输入密码的类型 function CharMode(iN){ if (iN>=48 && iN <=57) //数字 return 1;

模糊集合和隶属度函数--AForge.NET框架的使用(一)

原文:模糊集合和隶属度函数--AForge.NET框架的使用(一) 什么是AForge.NET? AForge.NET是一个为开发人员和研究人员开发的框架,它可以用于计算机视觉,遗传算法,图像处理,神经网络,机器人学习与控制,机器学习和模糊系统. AForge.NET的官方文档比较丰富,网上也有一些相关文章,但是多是关于视觉和神经网络的,而我个人对模糊系统比较感兴趣,故写下自己的一些感受. 模糊系统和模糊理论简述 模糊系统主要是区别于经典系统(或称为常规系统).在研究人机系统,管理系统,特别是经

模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)

原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在宣告陈述时每个语意量只能和在同一变数中的语意比较. 举个很简单的例子,我们有一个名为temperature的语意变数,它包含4个语意量,名为cold.cool.warm.hot,这也是各自的标签名,同时它们还有各自的隶属度函数. 那么我们就在接下来的系统中使用诸如temperature is hot

基于AForge.Net框架的扑克牌识别

原文:基于AForge.Net框架的扑克牌识别 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译  下载源代码 - 148.61 KB  下载demo - 3.1 MB   介绍 (图片上的字:方块4,方块J,黑桃2) 用机器人配上扑克牌识别系统,就可以在二十一点一类的扑克游戏中扮演荷官或是人类玩家的角色.实现这样的程序同样也是学习计算机视觉和模式识别的好途径. 本文涉及到的AForge.NET框架技术有二值化.边缘检测.仿射变换.B

php 框架-PHP怎么去熟悉使用各种框架

问题描述 PHP怎么去熟悉使用各种框架 PHP怎么去熟悉使用各种框架,就是在项目里面使用,各个框架的优势和缺点都是些什么? 解决方案 看官方文档并用心使用 解决方案二: 选用一种(比如ThinkPHP),然后看官方文档,然后实践下去. 解决方案三: NO.1 Laravel - 巨匠级PHP开发框架 现在最流行的一款PHP框架,功能强大,学习和使用也非常简单方便,即使你是PHP新手,也不用担心入门问题. NO.2 Phalcon - 最快的PHP框架 Phalcon是基于C语言的拥有高性能和低功

进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)

原文:进化计算简介和遗传算法的实现--AForge.NET框架的使用(六) 开学了,各种忙起来了- 上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾.matlab用着实在不习惯,就又琢磨了一下进化计算. 进化计算简介 进化计算算不上新的方法了,已经有大量研究人员作出了努力,这导致了大量的进化计算算法出现.他们不仅研究算法本身,还致力于扩大算法的应用范围. 众所周知,现实世界存在大量复杂问题,它们中一部分无法用常规方法在合理的时间内获得精确解,而另一部分甚至没有行之有效

人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五)

原文:人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五) 前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参考相关书籍,我推荐<模糊数学教程>,国防工业出版社,讲的很全,而且很便宜(我买成7元钱). 人工神经网络的简介 人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型.它是一种运算模型,由大量神经元和相互的连接组成,每个神经元代表一种特定的输出函数,称为激励函数(activati