月度归档: 2012 年 2 月

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

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

    开学了,各种忙起来了。

    上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾。matlab用着实在不习惯,就又琢磨了一下进化计算。

    进化计算简介

    进化计算算不上新的方法了,已经有大量研究人员作出了努力,这导致了大量的进化计算算法出现。他们不仅研究算法本身,还致力于扩大算法的应用范围。

    众所周知,现实世界存在大量复杂问题,它们中一部分无法用常规方法在合理的时间内获得精确解,而另一部分甚至没有行之有效的解决方案。

    最著名的例子就是TSP问题,该问题意在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。

    而进化计算可以应用于这些问题,因为大多数情况下这类问题允许我们在合理时间内给出较优解。

    进化计算并不能保证找到特定问题的最佳解决方案,但是可以找到一个很好的解决办法,该方案可能是非常接近的最佳解决方案。

    进化算法的分支和运用

    进化计算是一些算法的统称,主要包括Genetic Algorithms (GA遗传算法), Genetic Programming (GP遗传规划) 和 Gene Expression Programming (GEP基因表达式编程)。

    进化算法主要可以解决以下类别问题:

    1.函数优化

    2.符号回归

    3.时间序列预测

    4.旅行商问题

    遗传算法简介

    Genetic Algorithms(遗传算法)最早由John Holland基于进化观点在1960提出。从那时起相关研究不断进行。

    大部分研究成果运用到很多领域,并取得了很好的效果。虽然遗传算法的历史悠久,但是目前还是不断有新的方法被提出,扩宽了运用领域。

     

    遗传算法基于达尔文的“适者生存”理论和遗传学机理的生物进化过程。算法作用于每一代的基因,而每个基因都是问题的可能解。

    一般遗传算法的运用有以下4个步骤:

    1.随机选择个体,并进行交叉

    2.变异

    3.计算适应度

    4.选择下一个世代的个体

    算法的停止条件一般是指定的迭代数目完成或者得到一个可靠解。

    交叉算法中最简单的单点交叉,即随机选择两个基因的一个点,交换两个基因的一部分。

    基因1:0
    …
  • 人工神经网络简介和单层网络实现AND运算–AForge.NET框架的使用(五)

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

    前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参考相关书籍,我推荐《模糊数学教程》,国防工业出版社,讲的很全,而且很便宜(我买成7元钱)。

    人工神经网络的简介

    人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。它是一种运算模型,由大量神经元和相互的连接组成,每个神经元代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),用于模拟记忆。整个网络的输出则依网络的连接方式、权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

    人工神经网络的优势很明显,主要体现在以下三个方面:

    1.具有自学习功能

    2.具有联想存储功能

    3.具有高速寻找优化解的能力

    更多知识请参阅相关资料

    AForge.Net单层网络实现AND运算

    AForge.Net中有关神经网络的实现主要在AForge.Neuro中,用install-package AForge.Neuro获取。

    ann1-1

    我们按照一般步骤来:

    1.构建模型

    AND运算的话不用多讲,整理一下输入输出:

    [0,0]  ===>  [0]

    [1,0]  ===>  [0]

    [0,1]  ===>  [0]

    [1,1]  ===>  [1]

    可以很容易看出,输入是2个,输出是1个节点,层数单层足矣。

    代码:

    //整理输入输出数据 double[][] input = new double[4][]; double[][] output = new double[4][]; 
    …
  • 模糊系统架构和简单实现–AForge.NET框架的使用(四)

    模糊系统架构和简单实现–AForge.NET框架的使用(四)

    先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子。

    我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量机,没法抽出来当例子,就用了个最老的自动车辆的例子。

    模糊系统(Fuzzy System)架构

    前面零零散散说来一下有关模糊系统和模糊理论的东西,这里来个总结。

    模煳系统的基本架构如图8.1所示,其中主要的功能方块包括:(1)模煳化机构、(2)模煳规则库、(3)模煳推论引擎、以及(4)去模煳化机构。

    fuzzy4-1

    模糊化机构是有关模糊集合和隶属度函数的内容。

    模糊规则前文也有提及,去模糊化只涉及了重心法一种,这里简单说一下模糊推理引擎。

    模糊推理引擎是模煳系统的核心,它可以藉由近似推论或模煳推论的进行,来模拟人类的思考决策模式,以达到解决问题的目地。

    比如:

    前提(premise)一:x is A’

    前提(premise)二:if x is A,y is B

    结论:y is B’

    fuzzy4-2

    模糊推理系统的简单实现

    在AForge.Net中的对应类是InferenceSystem。

    在程序实现中一个模糊推理系统(Fuzzy Inference System )由数据库(Database)和规则库(Rulebase)组成,一般操作如下:

    1.获取数值输入

    2.通过数据库(Database)将数值输入转为语意含义

    3.验证规则库(Rulebase)中的哪些规则被输入激活

    4.组合被激活的规则,得到模糊输出(Fuzzy Output)

    5.去模糊化(实现IDefuzzifier接口)

    下面看看例子,这个例子是关于控制车辆避免正面冲撞的系统。

    输入为距离,论域[0,120],隶属度函数

    fuzzy4-6

    输出为角度,论域[-10,50],隶属度函数

    fuzzy4-7

    核心代码:

    // 隶属度函数(距离) 
    …
  • 子句判断、启动强度和去模糊化–AForge.NET框架的使用(三)

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

    使用AForge.NET进行模糊运算

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

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

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

    程序:

    publicclass MaximumCoNorm : ICoNorm {publicfloatEvaluate(float membershipA,float membershipB ) {return Math.Max( membershipA, membershipB ); } }

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

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

    程序:

    publicclass MinimumNorm : INorm {publicfloatEvaluate(float membershipA,float membershipB ) {return 
    …
  • 模糊语意变数、规则和模糊运算–AForge.NET框架的使用(二)

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

    语意变数(Linguistic Variable)

    语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合。在宣告陈述时每个语意量只能和在同一变数中的语意比较。

    举个很简单的例子,我们有一个名为temperature的语意变数,它包含4个语意量,名为cold、cool、warm、hot,这也是各自的标签名,同时它们还有各自的隶属度函数。

    那么我们就在接下来的系统中使用诸如temperature is hot或者temperature is not hot等等了。

    //语意变数的声明 LinguisticVariablelvTemperature = new LinguisticVariable("Temperature",0,50);//模糊集合和隶属度函数 TrapezoidalFunctionfunction1 = new TrapezoidalFunction(10,15, TrapezoidalFunction.EdgeType.Right); FuzzySetfsCold = new FuzzySet("Cold", function1); TrapezoidalFunctionfunction2 = new TrapezoidalFunction(10,15,20,25); FuzzySetfsCool = new FuzzySet("Cool", function2); TrapezoidalFunctionfunction3 = new TrapezoidalFunction(20,25,30,35); FuzzySetfsWarm = 
    …
  • 模糊集合和隶属度函数–AForge.NET框架的使用(一)

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

    什么是AForge.NET?

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

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

    模糊系统和模糊理论简述

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

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

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

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

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

    membership1

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

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

    membership2

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

    c1

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

    c2

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

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

    c3

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

    c4

    c5

    这是热。

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

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

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

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

    membership3

    AForge.Fuzzy在NuGet没有哈。

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

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

    c3

    有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);
    …