文章轉載自:http://www.52analysis.com/R/1627.html
神經網路(最佳化演算法)
人工神經網路(ANN),簡稱神經網路,是一種模仿生物神經網路的結構和功能的數學模型或計算模型。神經網路由大量的人工神經元連接進行計算。大多數情況下人工神經網路能在外界資訊的基礎上改變內部結構,是一種自適應系統。現代神經網路是一種非線性統計性資料建模工具,常用來對輸入和輸出間複雜的關係進行建模,或用來探索資料的模式。
人工神經網路從以下四個方面去類比人的智能行為:
物理結構:人工神經元將類比生物神經元的功能
計算類比:人腦的神經元有局部計算和儲存的功能,通過串連構成一個系統。人工神經網路中也有大量有局部處理能力的神經元,也能夠將資訊進行大規模平行處理
儲存與操作:人腦和人工神經網路都是通過神經元的串連強度來實現記憶儲存功能,同時為概括、類比、推廣提供有力的支援
訓練:同人腦一樣,人工神經網路將根據自己的結構特性,使用不同的訓練、學習過程,自動從實踐中獲得相關知識
神經網路是一種運算模型,由大量的節點(或稱“神經元”,或“單元”)和之間相互聯結構成。每個節點代表一種特定的輸出函數,稱為激勵函數。每兩個節點間的串連都代表一個對於通過該串連訊號的加權值,稱之為權重,這相當於人工神經網路的記憶。網路的輸出則依網路的串連方式,權重值和激勵函數的不同而不同。而網路自身通常都是對自然界某種演算法或者函數的逼近,也可能是對一種邏輯策略的表達。
一、感知器
感知器相當於神經網路的一個單層,由一個線性組合器和一個二值閾值原件構成:
構成ANN系統的單層感知器:
感知器以一個實數值向量作為輸入,計算這些輸入的線性組合,如果結果大於某個閾值,就輸出1,否則輸出‐1。
感知器函數可寫為:sign(w*x)有時可加入偏置b,寫為sign(w*x+b)
學習一個感知器意味著選擇權w0,…,wn的值。所以感知器學習要考慮的候選假設空間H就是所有可能的實數值權向量的集合
演算法訓練步驟:
1、定義變數與參數x(輸入向量),w(權值向量),b(偏置),y(實際輸出),d(期望輸出),a(學習率參數)
2、初始化,n=0,w=0
3、輸入訓練樣本,對每個訓練樣本指定其期望輸出:A類記為1,B類記為-1
4、計算實際輸出y=sign(w*x+b)
5、更新權值向量w(n+1)=w(n)+a[d-y(n)]*x(n),0
6、判斷,若滿足收斂條件,演算法結束,否則返回3
注意,其中學習率a為了權值的穩定性不應過大,為了體現誤差對權值的修正不應過小,說到底,這是個經驗問題。
從前面的敘述來看,感知器對於線性可分的例子是一定收斂的,對於不可分問題,它沒法實現正確分類。這裡與我們前面講到的支援向量機的想法十分的相近,只是確定分類直線的辦法有所不同。可以這麼說,對於線性可分的例子,支援向量機找到了“最優的”那條分類直線,而單層感知器找到了一條可行的直線。
我們以鳶尾花資料集為例,由於單層感知器是一個二分類器,所以我們將鳶尾花資料也分為兩類,“setosa”與“versicolor”(將後兩類均看做第2類),那麼資料按照特徵:花瓣長度與寬度做分類。
運行下面的代碼:
#感知器訓練結果:
a<-0.2
w<-rep(0,3)
iris1<-t(as.matrix(iris[,3:4]))
d<-c(rep(0,50),rep(1,100))
e<-rep(0,150)
p<-rbind(rep(1,150),iris1)
max<-100000
eps<-rep(0,100000)
i<-0
repeat{
v<-w%*%p;
y<-ifelse(sign(v)>=0,1,0);
e<-d-y;
eps[i+1]<-sum(abs(e))/length(e)
if(eps[i+1]<0.01){
print("finish:");
print(w);
break;
}
w<-w+a*(d-y)%*%t(p);
i<-i+1;
if(i>max){
print("max time loop");
print(eps[i])
print(y);
break;
}
}
#繪圖程式
plot(Petal.Length~Petal.Width,xlim=c(0,3),ylim=c(0,8),
data=iris[iris$Species=="virginica",])
data1<-iris[iris$Species=="versicolor",]
points(data1$Petal.Width,data1$Petal.Length,col=2)
data2<-iris[iris$Species=="setosa",]
points(data2$Petal.Width,data2$Petal.Length,col=3)
x<-seq(0,3,0.01)
y<-x*(-w[2]/w[3])-w[1]/w[3]
lines(x,y,col=4)
#繪製每次迭代的平均絕對誤差
plot(1:i,eps[1:i],type="o")
分類結果如圖:
這是運行了7次得到的結果。與我們前面的支援向量機相比,顯然神經網路的單層感知器分類不是那麼的可信,有些弱。
我們可以嘗試來做交叉驗證,可以發現交叉驗證結果並不理想。 二、線性神經網路
儘管當訓練範例線性可分時,感知器法則可以成功地找到一個權向量,但如果範例不是線性可分時它將不能收斂。因此,人們設計了另一個訓練法則來克服這個不足,稱為delta法則。
如果訓練樣本不是線性可分的,那麼delta法則會收斂到目標概念的最佳近似。
delta法則的關鍵思想是使用梯度下降來搜尋可能權向量的假設空間,以找到最佳擬合訓練範例的權向量。
我們將演算法描述如下:
1、定義變數與參數。x(輸入向量),w(權值向量),b(偏置),y(實際輸出),d(期望輸出),a(學習率參數)(為敘述簡便,我們可以將偏置併入權值向量中)
2、初始化w=0
3、輸入樣本,計算實際輸出與誤差。e(n)=d-x*w(n)