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

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

什么是AForge.NET?

AForge.NET是一个为开发人员和研究人员开发的框架,它可以用于计算机视觉,遗传算法,图像处理,神经网络,机器人学习与控制,机器学习和模糊系统。

AForge.NET的官方文档比较丰富,网上也有一些相关文章,但是多是关于视觉和神经网络的,而我个人对模糊系统比较感兴趣,故写下自己的一些感受。

模糊系统和模糊理论简述

模糊系统主要是区别于经典系统(或称为常规系统)。在研究人机系统,管理系统,特别是经济和社会系统时,由于加入人的逻辑、推理、判断,很多决策很难做到完全精确,这些和人有关的系统就拥有了某种模糊性。

在常规系统中,如果一个系统在某刻的状态和输入一旦决定,下个时刻的状态和输出就可以确定。如果下一个状态不能确定,但是可以给出概率分布,就成为随机系统。如果概率分布都不能给出,但是可以给出所有可能状态的集合,而且所有可能状态的集合使用模糊集合来表示,就成为模糊系统。

客观世界中普遍存在着模糊现象,比如“年轻人”和“老年人”就是模糊概念,它们没有明确内涵和外延,但是使用这些概念时却很少产生误解和歧义。可以说值逻辑只是理想世界的模型,而不是现实世界的模型。

隶属度函数(Membership Function)和模糊集合(Fuzzy sets)

隶属度函数是模糊系统的数学基础,它突破了经典集合理论的局限,模糊概念的定量表示成为可能。

棕色的曲线就是一个隶属度函数,0是不属于,1是完全属于。由于模糊性,所以用[0,1]上的数代替0和1。

而这个值就是就是属于模糊集合的程度。

而一个模糊集合可以分为两个部分,其中一个成为core,它是一个每个X的隶属度都是1的宽松集合。

还有一部分成为boundary,它包含了所有隶属度在0,1之间的元素。

隶属度函数的选择主要由模糊集合决定。如果某个集合含有大量的值或者它是连续的,那么一个参数化表示的隶属度函数是适合的,一般分段的线性隶属度函数(Piecewise linear membership functions)是比较好的,它简单而且在计算上是高效的。较常用的是梯形或者三角形,由4或3个参数定义。

以温度为例,在实际生活中我们常说多少度,冷不冷。多少度可以是一个确定的数值或者区间,但是冷不冷就不能固定化,很难找到固定的爆破值。一般可以大致成为冷,暖和,热。

可以认为该隶属度函数为A(x)=暖和。

 

这是热。

AForge.NET表示模糊集合和隶属度函数

需要用到到AForge,AForge.Fuzzy和AForge.Controls。

AForge是核心类,AForge.Fuzzy有关模糊系统的,而AForge.Controls是一些控件,比较常用的是表格(chart)控件。

可以去http://code.google.com/p/aforge/下载,然后引用需要的。我直接用的NuGet。

AForge.Fuzzy在NuGet没有哈。

PiecewiseLinearFunction类无疑是最灵活的,但是如果隶属度函数是梯形或者三角形,有个更快捷的类可供使用:TrapezoidalFunction。

比如我们要建立一个梯形的隶属度函数,如果:

有4个点要注意,(10,0)和(40,0),它们是boundary的边界。(20,0)和(30,0)是core的边界。

TrapezoidalFunction functionCool = new TrapezoidalFunction(10, 20, 30, 40);

FuzzySet fsCool = new FuzzySet("COLD", functionCool);

通过FuzzySet.GetMembership(i)获取隶属度。然后给chart控件一个二维数组就可以绘制了。

double[,] coolValues = new double[50, 2]; for (int i = 0; i < 50; i++) {     coolValues[i, 0] = i;     coolValues[i, 1] = fsCool.GetMembership(i); }
chart.UpdateDataSeries("COLD", coolValues); 

效果:

当然缺失一半边界的函数也是常用的

关键点是(30,0)和(40,0)。

TrapezoidalFunction functionCool = new TrapezoidalFunction(30,40,TrapezoidalFunction.EdgeType.Right); FuzzySet fsCool = new FuzzySet("WARM", functionCool);

double[,] coolValues = new double[50, 2]; for (int i = 0; i < 50; i++) {     coolValues[i, 0] = i;     coolValues[i, 1] = fsCool.GetMembership(i); }

chart.UpdateDataSeries("WARM", coolValues); 

效果:

三角形的函数:

TrapezoidalFunction functionCool = new TrapezoidalFunction(20,30,40);

当然PiecewiseLinearFunction可以有更丰富的表现,只需制定其中的关键点就可以构成很多函数了。

AForge.Point[] points = new AForge.Point[6];

points[0] = new AForge.Point(10, 0); points[1] = new AForge.Point(12, 0.8f); points[2] = new AForge.Point(20, 0.9f); points[3] = new AForge.Point(30, 1); points[4] = new AForge.Point(40, 0.1f); points[5] = new AForge.Point(50, 0);

PiecewiseLinearFunction membershipFunction = new PiecewiseLinearFunction(points);

FuzzySet fsCool = new FuzzySet("HOT", membershipFunction);

double[,] coolValues = new double[50, 2]; for (int i = 0; i < 50; i++) {     coolValues[i, 0] = i;     coolValues[i, 1] = fsCool.GetMembership(i); }

chart.UpdateDataSeries("HOT", coolValues); 

效果图:

还有一个特别的隶属度函数:SingletonFunction。它只要用于经典数值。

SingletonFunction membershipFunction = new SingletonFunction(20);

 

相关下载:http://www.ctdisk.com/file/4466992

时间: 2024-10-25 16:12:12

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

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

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

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

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

二型模糊控制程序 隶属度

问题描述 二型模糊控制程序 隶属度 大家谁有二型模糊控制的程序的资料?怎么建立隶属度函数?希望大家帮帮忙 解决方案 google下,有很多资料的.

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

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

子句判断、启动强度和去模糊化--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 Mat

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

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

javascript函数库-集合框架_javascript技巧

Classes: Collections Arrays ArrayList SortedList extends ArrayList HashMap HashSet */ /**************** Collections NOTE:sort() return a new List ****************/ function Collections(){} Collections.sort=function(){ if(arguments.length==1){  var s=

BC高精准度函数库:bcdiv

bcdiv (PHP3 , PHP4) bcdiv ---&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 将二个高精准度数字相除 语法 : string bcdiv(string left operand, string right operand [ , int scale] ); 说明 : 将参数left operand除以right operand,且传回结果.参数scale是非必需的,scale是用来设定

BC高精准度函数库:bcadd

bcadd (PHP3 , PHP4) bcadd ---&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 将二个高精准度数字相加 语法 : string bcadd(string left operand, string right operand [ , int scale] ); 说明 : 将参数left operand与right operand相加,传回的字符串为相加的和.参数scale是非必需的,sca