Machine Learning-感知器學習演算法
引言
這裡開始介紹神經網路方面的知識(Neural Networks)。首先我們會介紹幾個監督式學習的演算法,隨後便是非監督式的學習。
一、感知器學習演算法基本介紹
1.神經網路
就像進化計算,神經網路又是一個類似的概念。神經網路由一個或者多個神經元組成。而一個神經元包括輸入、輸出和“內部處理器”。神經元從輸入端接受資訊,通過“內部處理器”將這些資訊進行一定的處理,最後通過輸出端輸出。
2.感知器
感知器(Perceptron),是神經網路中的一個概念,在1950s由Frank Rosenblatt第一次引入。
3.單層感知器
單層感知器(Single Layer Perceptron)是最簡單的神經網路。它包含輸入層和輸出層,而輸入層和輸出層是直接相連的。
圖1.1
圖1.1便是一個單層感知器,很簡單一個結構,輸入層和輸出層直接相連。
接下來介紹一下如何計算輸出端。
利用公式1計算輸出層,這個公式也是很好理解。首先計算輸入層中,每一個輸入端和其上的權值相乘,然後將這些乘機相加得到乘機和。對於這個乘機和做如下處理,如果乘機和大於臨界值(一般是0),輸入端就取1;如果小於臨界值,就取-1。
以下就給出一段單層感知器的程式碼。
- //////////////////////////////////////////////////////////////////////////
- //singlelayer perceptrons(SLP)
- bool slp_calculate_output(constdouble * inputs,constdouble * weights,intnInputs,int & output)
- {
- if(NULL ==inputs || NULL == weights)
- return false;
- double sum =0.0;
- for (int i = 0 ; i < nInputs ; ++i)
- {
- sum += (weights[i] * inputs[i]);
- }
- //這裡我們對乘機和的處理:如果大於0,則輸出值為1;其他情況,輸出值為-1
- if(sum >0.0)
- output = 1;
- else
- output = -1;
- }
- //////////////////////////////////////////////////////////////////////////
單層感知器其簡單的特性,可以提供快速的計算。它能夠實現邏輯計算中的NOT、OR、AND等簡單計算。
但是對於稍微複雜的異或就無能無力。下面介紹的多層感知器,就能解決這個問題。
4.多層感知器
多層感知器(Multi-Layer Perceptrons),包含多層計算。
相對於單層感知器,輸出端從一個變到了多個;輸入端和輸出端之間也不光只有一層,現在又兩層:輸出層和隱藏層。
圖2.2
圖2.2就是一個多層感知器。
對於多層感知器的計算也是比較簡單易懂的。首先利用公式1計算每一個。
看一下它程式碼,就能明白它的工作原理。
- //////////////////////////////////////////////////////////////////////////
- //Multi-Layerperceptrons(MLP)
- const unsignedint nInputs =4;
- const unsignedint nOutputs = 3;
- const unsignedint nHiddens = 4;
- struct mlp
- {
- doubleinputs[nInputs+1];//多一個,存放的bias,一般存放入1
- doubleoutputs[nOutputs];
- doublehiddens[nHiddens+1]; //多一個,存放的bias,一般存放入1
- doubleweight_hiddens_2_inputs[nHiddens+1][nInputs+1];
- doubleweight_outputs_2_hiddens[nOutputs][nHiddens+1];
- };
- //這裡我們對乘機和的處理:如果大於0,則輸出值為1;其他情況,輸出值為-1
- double sigmoid (double val)
- {
- if(val >0.0)
- return1.0;
- else
- return-1.0;
- }
- //計算輸出端
- bool mlp_calculate_outputs(mlp * pMlp)
- {
- if(NULL ==pMlp)
- return false;
- double sum =0.0;
- //首先計算隱藏層中的每一個結點的值
- for (int h = 0 ; h < nHiddens ; ++h)
- {
- doublesum = 0.0;
- for (int i = 0 ; i < nInputs + 1 ; ++i)
- {
- sum += pMlp->weight_hiddens_2_inputs[h][i]*pMlp->inputs[i];
- }
- pMlp->hiddens[h] = sigmoid (sum);
- }
- //利用隱藏層作為“輸入層”,計算輸出層
- for (int o = 0 ; o < nOutputs ; ++o)
- {
- doublesum = 0.0;
- for (int h = 0 ; h < nHiddens + 1 ; ++h)
- {
- sum += pMlp->weight_outputs_2_hiddens[o][h]*pMlp->hiddens[h];
- }
- pMlp->outputs[o] = sigmoid (sum);
- }
- return true;
- }
- //////////////////////////////////////////////////////////////////////////
二、感知器學習演算法
1.感知器學習
其實感知器學習演算法,就是利用第一節介紹的單層感知器。首先利用給的正確資料,計算得到輸出值,將輸出值和正確的值相比,由此來調整每一個輸出端上的權值。
公式2便是用來調整權值,首先 是一個“學習引數”,一般我將它設定成小於1的正數。T便是訓練資料中的正確結果, 便是第i個輸入端的輸入值,便是第i個輸入端上面的權值。
2.程式碼
對於其介紹,我還是附上程式碼。
- //////////////////////////////////////////////////////////////////////////
- //PerceptronLearning Algorithm(PLA)
- const unsignedint nTests =4; //訓練資料的數量
- const unsignedint nInputs =2; //輸入端的數量
- const double alpha =0.2; //學習引數
- struct slp
- {
- doubleinputs[nInputs];
- doubleoutput;
- }; //單層感知器
- //計算輸出值
- int compute(double *inputs,double * weights)
- {
- double sum =0.0;
- for (int i = 0 ; i < nInputs; ++i)
- {
- sum += weights[i]*inputs[i];
- }
- //bias
- sum += 1.0 * weights[nInputs];
- if(sum >0.0)
- return1;
- else
- return-1;
- }
- //
- int _tmain(int argc,_TCHAR* argv[])
- {
- //正確的訓練資料
- slp slps[nTests] = {
- {-1.0,-1.0,-1.0},
- {-1.0, 1.0, 1.0},
- { 1.0,-1.0, 1.0},
- { 1.0, 1.0, 1.0}
- };
- doubleweights[nInputs + 1] = {0.0};
- boolbLearningOK = false;
- //感知器學習演算法
- while(!bLearningOK)
- {
- bLearningOK = true;
- for (int i = 0 ; i < nTests ; ++i)
- {
- intoutput = compute(slps[i].inputs,weights);
- if(output!= (int)slps[i].output)
- {
- for(int w = 0 ; w < nInputs ; ++w)
- {
- weights[w] += alpha *slps[i].output * slps[i].inputs[w];
- }
- weights[nInputs] += alpha *slps[i].output ;
- bLearningOK = false;
- }
- }
- }
- for(int w = 0 ; w < nInputs + 1 ; ++w)
- {
- cout<<"weight"<<w<<":"<<weights[w] <<endl;
- }
- cout<<"\n";
- for (int i = 0 ;i < nTests ; ++i)
- {
- cout<<"rightresult:"<<slps[i].output<<"\t";
- cout<<"caculateresult:" << compute(slps[i].inputs,weights)<<endl;
- }
- //
- char temp ;
- cin>>temp;
- return 0;
- }
2.效果圖
下面附上執行效果圖
三、總結
感知器學習演算法,算是神經網路中的最簡單的學習演算法。但是通過這個進入學習神經網路學習演算法,是個不錯的選擇。
感知器學習演算法,只要是利用了單層感知器。這篇文章中,我們還了解到了另一種感知器:多層感知器。多層感知器主要是用於方向傳播學習演算法中,這個我後面的文章中會進行介紹。
相關文章
- Machine Learning-樸素貝葉斯演算法Mac演算法
- Docker學習—MachineDockerMac
- 最簡單的深度學習演算法——感知器的前世今生深度學習演算法
- 初探神經網路與深度學習 —— 感知器神經網路深度學習
- 使用Octave來學習Machine Learning(二)Mac
- 使用Octave來學習Machine Learning(一)Mac
- Machine Learning:PageRank演算法Mac演算法
- AI學習筆記之——如何理解機器學習(Machine Learning)AI筆記機器學習Mac
- 機器學習(Machine Learning)&深度學習(Deep Learning)資料機器學習Mac深度學習
- Python Learning-目錄Python
- 感知器演算法及其python 實現 V2.0演算法Python
- 演算法學習演算法
- Machine Learning(1)-分類演算法Mac演算法
- 演算法題 - Shuffling Machine演算法Mac
- Machine Learning Mastery 部落格文章翻譯:深度學習與 KerasMacAST深度學習Keras
- Mathematics for Machine Learning--學習筆記(線性代數篇)Mac筆記
- 吳恩達《Machine Learning》精煉筆記 1:監督學習與非監督學習吳恩達Mac筆記
- TLD演算法學習演算法
- 演算法學習思路演算法
- 演算法學習指南演算法
- Gusfield演算法學習演算法
- 加密演算法學習加密演算法
- 【火爐煉AI】深度學習001-神經網路的基本單元-感知器AI深度學習神經網路
- 《深度學習》PDF Deep Learning: Adaptive Computation and Machine Learning series深度學習APTMac
- 如何學習和利用深度學習演算法框架深度學習演算法框架
- 【演算法學習】組合數學演算法
- 《演算法的樂趣》,快樂學習演算法,學習貼近生活的演算法演算法
- 【演算法學習】尺取法演算法
- RSA演算法之學習演算法
- 演算法學習計劃演算法
- 演算法學習筆記演算法筆記
- 演算法學習之路|划拳演算法
- EM演算法學習(三)演算法
- 【演算法學習】莫隊演算法
- 演算法學習-CDQ分治演算法
- 林軒田機器學習技法課程學習筆記3 — Kernel Support Vector Machine機器學習筆記Mac
- 林軒田機器學習技法課程學習筆記2 — Dual Support Vector Machine機器學習筆記Mac
- 演算法學習 - 基礎排序演算法演算法排序