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

通過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); 

效果:

 

membership4

 

當然缺失一半邊界的函數也是常用的

 

c4

 

關鍵點是(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);

效果:

 

membership5

 

三角形的函數:

 

membership6

 

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

效果圖:

 

membership7

 

還有一個特別的隸屬度函數:SingletonFunction。它只要用於經典數值。

SingletonFunction membershipFunction = new SingletonFunction(20);

 

membership8

 

 

相關下載:http://www.ctdisk.com/file/4466992

AForge.Net

 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM