模糊集合和隶属度函数--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(, , , );
FuzzySet fsCool = new FuzzySet("COLD", functionCool);
通过FuzzySet.GetMembership(i)获取隶属度。然后给chart控件一个二维数组就可以绘制了。
double[,] coolValues = new double[, ];
for (int i = ; i < ; i++)
{
coolValues[i, ] = i;
coolValues[i, ] = fsCool.GetMembership(i);
}
chart.UpdateDataSeries("COLD", coolValues);
效果:

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

关键点是(30,0)和(40,0)。
TrapezoidalFunction functionCool = new TrapezoidalFunction(,,TrapezoidalFunction.EdgeType.Right);
FuzzySet fsCool = new FuzzySet("WARM", functionCool);
double[,] coolValues = new double[, ];
for (int i = ; i < ; i++)
{
coolValues[i, ] = i;
coolValues[i, ] = fsCool.GetMembership(i);
}
chart.UpdateDataSeries("WARM", coolValues);
效果:

三角形的函数:

TrapezoidalFunction functionCool = new TrapezoidalFunction(,,);
当然PiecewiseLinearFunction可以有更丰富的表现,只需制定其中的关键点就可以构成很多函数了。
AForge.Point[] points = new AForge.Point[];
points[] = new AForge.Point(, );
points[] = new AForge.Point(, 0.8f);
points[] = new AForge.Point(, 0.9f);
points[] = new AForge.Point(, );
points[] = new AForge.Point(, 0.1f);
points[] = new AForge.Point(, );
PiecewiseLinearFunction membershipFunction = new PiecewiseLinearFunction(points);
FuzzySet fsCool = new FuzzySet("HOT", membershipFunction);
double[,] coolValues = new double[, ];
for (int i = ; i < ; i++)
{
coolValues[i, ] = i;
coolValues[i, ] = fsCool.GetMembership(i);
}
chart.UpdateDataSeries("HOT", coolValues);
效果图:

还有一个特别的隶属度函数:SingletonFunction。它只要用于经典数值。
SingletonFunction membershipFunction = new SingletonFunction();

相关下载:http://www.ctdisk.com/file/4466992
模糊集合和隶属度函数--AForge.NET框架的使用(一)的更多相关文章
- 如何将Matlab中“模糊控制设计器”的隶属度函数导出图片(figure)
如何将Matlab中"模糊控制设计器"的隶属度函数导出图片(figure)详情参考matlab官方帮助手册:plotmf()函数https://www.mathworks.com/ ...
- 模糊系统架构和简单实现--AForge.NET框架的使用(四)
原文:模糊系统架构和简单实现--AForge.NET框架的使用(四) 先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子. 我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量 ...
- 模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)
原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在 ...
- 进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)
原文:进化计算简介和遗传算法的实现--AForge.NET框架的使用(六) 开学了,各种忙起来了… 上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾.matlab用着实在不 ...
- 基于MATLAB实现的云模型计算隶属度
”云”或者’云滴‘是云模型的基本单元,所谓云是指在其论域上的一个分布,可以用联合概率的形式(x, u)来表示 云模型用三个数据来表示其特征 期望:云滴在论域空间分布的期望,一般用符号Εx表示. 熵:不 ...
- 子句判断、启动强度和去模糊化--AForge.NET框架的使用(三)
原文:子句判断.启动强度和去模糊化--AForge.NET框架的使用(三) 使用AForge.NET进行模糊运算 上一篇说来一些模糊运算的数学问题,用AForge.NET做相关运算就很简单了. 1.联 ...
- 基于AForge.Net框架的扑克牌识别
原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译 下载源代码 - 148.61 KB ...
- 人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五)
原文:人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五) 前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参 ...
- 操作系统是怎么工作的——函数的堆栈框架/嵌入式代码
1.函数堆栈框架 1.1框架模型 call指令: 1)将eip中的下一条指令的地址A保存在栈顶: 2)设置eip指向被调用程序的代码处. ret指令:将地址A恢复到eip中 这样就将函数的调用变为顺序 ...
随机推荐
- 判断一个js对象,是否具有某个属性
一个对象,想必我们关注的最多的应该是它上面的属性有哪些吧.那么,怎么判断一个对象是否具有某个属性呢? /*下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同.*/ / ...
- tcp/ip状态图
开启一个连接需要三次握手,终止一个tcp连接需要4次握手,对应的客户端和服务器连接状态也随之而改变. 1.服务器出现大量的CLOSE_WAIT? 通常,CLOSE_WAIT 状态在服务器停留时间很短, ...
- win8.1 Dism 应用实例
使用win8.1安装镜像制作wimboot启动 制作wim启动映像文件 Dism /Export-Image /WIMBoot/SourceImageFile:z:\sources\install.w ...
- FLEX 图片拷贝
在用FLEX做GIS相关的开发的时候,遇到一个问题.因为是监控类的系统,所以需要要求地图上的ICON的实时更新,从而会出现重复加载的情况.就是重复请求相同的图片用做背景,尤其是在加载的ICON较多的时 ...
- Android控件Editext、TextView属性详解
EditText属性描述 android:layout_gravity="center_vertical"//设置控件显示的位置:默认top,这里居中显示,还有bottom and ...
- HDU1247 Hat’s Words 【trie树】
Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- [转] gdb 查看vector, list, map 内容
转:http://blog.chinaunix.net/uid-13982689-id-34282.html先下载gdb_stl_utils.tar.gz, extract it, and run m ...
- 字符串格式化 String.format() 案例
转换符 转换符 说 明 %s 字符串类型 %c 字符类型 %b 布尔类型 %d 整数类型(十进制 ...
- gis基本概念之"投影变换"-浅谈
目录 1,概述 2,常用的投影方法有 正解变换 反解变换 数值变换 3,定义投影 4,投影变换 1,栅格(投影变换) 2,要素(投影变换) 注意 1,概述 因为GIS描述的是位于地球表面的信息,所以根 ...
- 东软实训1 -jsp内置对象及其常用方法
JSP 的内置对象及方法详细说明 一. request 对象 客户端的请求信息被封装在 request 对象中,通过它才能了解到客户的需 求,然后做出响应.它是 HttpServletRequest ...