什么是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
AForge.Net