前面4篇文章說的是模糊系統,它不同於傳統的值邏輯,理論基礎是模糊數學,所以有些朋友看着有點迷糊,如果有興趣建議參考相關書籍,我推薦《模糊數學教程》,國防工業出版社,講的很全,而且很便宜(我買成7元錢)。
人工神經網絡的簡介
人工神經網絡是一種應用類似於大腦神經突觸聯接的結構進行信息處理的數學模型。它是一種運算模型,由大量神經元和相互的連接組成,每個神經元代表一種特定的輸出函數,稱為激勵函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重(weight),用於模擬記憶。整個網絡的輸出則依網絡的連接方式、權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。
人工神經網絡的優勢很明顯,主要體現在以下三個方面:
1.具有自學習功能
2.具有聯想存儲功能
3.具有高速尋找優化解的能力
更多知識請參閱相關資料
AForge.Net單層網絡實現AND運算
AForge.Net中有關神經網絡的實現主要在AForge.Neuro中,用install-package AForge.Neuro獲取。
我們按照一般步驟來:
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][];
input[0] = new double[] { 0, 0 }; output[0] = new double[] { 0 };
input[1] = new double[] { 0, 1 }; output[1] = new double[] { 0 };
input[2] = new double[] { 1, 0 }; output[2] = new double[] { 0 };
input[3] = new double[] { 1, 1 }; output[3] = new double[] { 1 };
2.選擇激勵函數和學習規則
AForge.Net中的激勵函數需實現IActivationFunction 接口,AForge.Net中實現了3種:
BipolarSigmoidFunction
SigmoidFunction
ThresholdFunction(閾函數)
我們的激勵函數(activation function)就選用閾函數了。
接下來考慮學習函數了。
AForge.Net中學習函數要實現ISupervisedLearning或者IUnsupervisedLearning接口,程序庫實現了5種:
其中Perceptron Learning(感知學習)可以說是第一個神經網絡的學習算法,它出現於1957年,常用於可線性分割的數據的分類。
代碼:
//建立網絡,層數1,輸入2,輸出1,激勵函數閾函數
ActivationNetwork network = new ActivationNetwork(new ThresholdFunction(), 2, 1);
//學習方法為感知器學習算法
PerceptronLearning teacher = new PerceptronLearning(network);
3.訓練網絡
teacher.RunEpoch(input, output);
4.獲取輸出進行處理
因為本來就模擬算法,所以沒有什么處理,我們模擬一下看效果就行了。
//模擬
for (int i = 0; i < 4; i++)
{
Console.WriteLine("input{0}: ===> {1},{2} sim{0}: ===> {3}", i, input[i][0], input[i][1], network.Compute(input[i])[0]);
}
完整代碼:
//整理輸入輸出數據
double[][] input = new double[4][]; double[][] output = new double[4][];
input[0] = new double[] { 0, 0 }; output[0] = new double[] { 0 };
input[1] = new double[] { 0, 1 }; output[1] = new double[] { 0 };
input[2] = new double[] { 1, 0 }; output[2] = new double[] { 0 };
input[3] = new double[] { 1, 1 }; output[3] = new double[] { 1 };
for (int i = 0; i < 4; i++)
{
Console.WriteLine("input{0}: ===> {1},{2} output{0}: ===> {3}",i,input[i][0],input[i][1],output[i][0]);
}
//建立網絡,層數1,輸入2,輸出1,激勵函數閾函數
ActivationNetwork network = new ActivationNetwork(new ThresholdFunction(), 2, 1);
//學習方法為感知器學習算法
PerceptronLearning teacher = new PerceptronLearning(network);
//定義絕對誤差
double error = 1.0;
Console.WriteLine();
Console.WriteLine("learning error ===> {0}", error);
//輸出學習速率
Console.WriteLine();
Console.WriteLine("learning rate ===> {0}",teacher.LearningRate);
//迭代次數
int iterations = 0;
Console.WriteLine();
while (error > 0.001)
{
error = teacher.RunEpoch(input, output);
Console.WriteLine("learning error ===> {0}", error);
iterations++;
}
Console.WriteLine("iterations ===> {0}", iterations);
Console.WriteLine();
Console.WriteLine("sim:");
//模擬
for (int i = 0; i < 4; i++)
{
Console.WriteLine("input{0}: ===> {1},{2} sim{0}: ===> {3}", i, input[i][0], input[i][1], network.Compute(input[i])[0]);
}
效果:
人工神經網絡和模糊系統結合前景
我解釋一下為什么說完模糊邏輯以后要說人工神經網絡。雖然模糊邏輯和神經網絡是兩個截然不同的領域,它們的基礎理論相差較遠,一個是新模型,一個是新集合理論。但從客觀實踐和理論的溶合上講是完全可以令它們結合的。把模糊邏輯和神經網絡相結合就產生了—種新的技術領域:這就是模糊神經網絡。
常見的形式有:
1.邏輯模糊神經網絡
2.算術模糊神經網絡
3.混合邏輯神經網絡
我個人感覺二者的結合其實就是一個學習和優化權系數的問題。
對於邏輯模糊神經網絡采用基於誤差的學習算法,對於算術模糊神經系統一般用模糊BP算法,遺傳算法。這兩塊的相關技術都比較成熟了。而對於混合邏輯神經網絡,一般沒有特定算法,而且多用於計算而非學習。
可能有朋友覺得前兩種也是比較新的,我起初也是這樣想的,但我檢索了近十年的相關論文(從萬方下的),大部分思想和方法都可以從諸如Cybernetics等雜志的早期數據中(1980年上下)找到。
最后附上3篇有關Perceptron Learning的資料:http://www.ctdisk.com/file/4525564