模糊集合和隸屬度函數–AForge.NET架構的使用(一)

來源:互聯網
上載者:User
什麼是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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.