分類:
人工神經網絡
2009-05-29 17:51
1401人閱讀
收藏
舉報
人工神經網絡算法是模擬 人的神經網絡的一種算法.
該算法像人一樣,,具有一定的學習能力,。 人工神經網絡可以學會它所能表達的任何東西.
該算法在模擬人類抽象思維方面較傳統的算法具有優(yōu)勢,如圖像識別 (人臉識別,,車牌識別),, 聲音識別方面已經有成熟的運用。
舉個簡單的例子可以說明人工神經網絡和傳統算法的差別所在 (等會也要實現):
假設要解決這個問題: 寫一個程序,, 判斷 0, 1, 2, 3 ... 9 這10個數的奇偶性
1. 如果是傳統算法,, 則是模擬人的邏輯思維,對這個問題進行形式化和邏輯化 :
if (input 模 2 == 零) {
input 是 偶數
} else {
input 是 奇數
}
2. 如果是ANN算法,,則要提供一組正確的數據對處理這個問題的神經網絡ANN進行訓練 :
未進行訓練的神經網絡,,就像剛出生的嬰兒一樣,什么都不懂,。這個時候, 你要教他 0 是偶數,, 1是奇數....,
教完之后問ANN懂了沒有,懂了則停止訓練 (網絡已經形成),,不懂則繼續(xù)訓練.
while (1) {
訓練;
if (測試通過) {
跳出循環(huán);
}
}
訓練完之后,,這個ANN以后便能夠正確處理 奇偶性判斷的問題了.
處理上面這個問題,只需要模擬一個神經元即可,,再復雜的問題,,可能需要多個神經元,再再復雜,,需要多層多神經元的配合來實現 (以后再研究)
下面是實現:
-
-
-
-
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
-
-
- int M[10];
- int X[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- int Y[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
- int O[10];
- int ST = 52;
-
-
-
-
- void initM ()
- {
- int x = 0;
- srand ((unsigned int)time(0));
- for (x = 0; x < 10; ++x) {
-
- M[x] = rand () % 100;
- }
- }
-
-
- int active (int m, int x)
- {
- int o = m * x;
- if (o > ST) {
- return 1;
- } else {
- return 0;
- }
- }
-
-
- void calcY ()
- {
- int x = 0;
- for (x = 0; x < 10; ++x) {
- O[x] = active (M[x], X[x]);
- }
- }
-
-
-
-
- int adjustM ()
- {
- int err = 0;
- int x = 0;
- for (x = 0; x < 10; ++x) {
- if (O[x] != Y[x])
- {
- err ++;
- if (0 == O[x]) {
- M[x] += X[x];
- } else {
- M[x] -= X[x];
- }
- }
- }
- return err;
- }
-
-
-
- void printM ()
- {
- int x = 0;
- for (x = 0; x < 10; ++x) {
- printf ("M[%i] = %i/n", x, M[x]);
- }
- }
-
-
- void test (int input)
- {
- printf ("[%i] [%i] ", M[input], X[input]);
- if (active (M[input], X[input]))
- {
- printf ("%d 是 偶數/n", input);
- } else {
- printf ("%d 是 奇數/n", input);
- }
- }
-
- int main ()
- {
- int n = 0;
- initM ();
-
-
- while (1) {
- n ++;
- calcY ();
- int err = adjustM ();
- if (0 >= err) {
-
- break;
- }
- printf ("錯誤數 %d/n", err);
- }
-
- printM ();
- printf ("閾值 %d 訓練次數 %d/n", ST, n);
-
-
- while (1) {
- int a = 0;
- scanf ("%i", &a);
- if (0 > a || 9 < a) {
- break;
- }
-
- test (a);
- }
- return 0;
- }
測試, 選擇 閾值 52 作為測試,,經過25次訓練之后,,能夠給100 % 回答問題.
- M[0] = 53
- M[1] = 26
- M[2] = 40
- M[3] = 11
- M[4] = 59
- M[5] = 4
- M[6] = 21
- M[7] = -1
- M[8] = 68
- M[9] = 4
- 閾值 52 訓練次數 25
|