rbf神经网络 c语言,RBF神经网络极简介绍及其算法R语言实现
最近deep learning的研究和話題開始又火了起來。然而我卻還停留在RBF神經網絡的階段。真是屌絲得不能再屌絲。對SVM也還是一知半解,機器學習最多也就是個入門級別,看來離成為一名數據科學家和數據工作者的道路還很遠。這一周時間在研究神經網絡,當然內容是很初級的。所以這篇日志比較適合入門者。我寫下它也權當是學習過程的記錄。寫了點R代碼,也共享出來。這篇日記不涉及任何數學公式。RBF在我看來,本質上就是非參數回歸模型(參見Element of statistical learning的11章)。依據Cover的理論,它先將數據非線性映射到一個更高維度的空間中,然后再在高維空間用線性模型來做回歸或者分類。從而得到一個較好的效果。Vapnik曾經說過,一個好的理論是最為實用的。Cover的理論體現了這一點。Cover理論是說,數據在高維空間更傾向于線性可分的,或者更傾向于用線性模型來擬合。從這個理論出發,發展出來了一系列模型。都取得了不錯的效果。RBF神經網絡,是首先利用RBF,即徑向基函數,來首先將數據映射到一個更高的空間。關于RBF,可以參看我的讀書筆記。之后的在高維空間上的線性模型,是比較容易實現的。這里就不多說了。基于上面的描述,RBF神經網絡的學習過程包含了兩步,第一步要學習RBF的參數。一般來說選擇Gaussian函數作為RBF,則其參數包括兩個,位置參數和刻度參數,即center和width。最簡單的方法是用kmeans聚類,學習出center,而用每個聚類中的方差來作為width的估計。學習完RBF的參數之后,我們需要學習高維空間中線性模型的系數,該系數,可以使用基本的最小二乘方法,但是很可能遇見矩陣求逆很麻煩的情況。因此,往往是用遞歸最小二乘RLS,給出其中需要求逆的矩陣的一個遞歸形式,使得計算上比較方便。關于RBF神經網絡更多的內容,請參看神經網絡與機器學習一書。閑話不多說了,下面直接上代碼。代碼用R語言寫成,其中包含3個函數,simData用來生成模擬的數據,用以RBF網絡的訓練和檢測。Euc_dist用以計算兩個向量的歐式距離。mysign則給出某個值的符號。訓練RBF的算法即為上述的,最為基礎和簡單的Kmeans和RLS。simData=function(radius,width,distance,sample_size){aa1=runif(sample_size/2)aa2=runif(sample_size/2)rad=(radius-width/2)+width*aa1theta=pi*aa2x=rad*cos(theta)y=rad*sin(theta)label=1*rep(1,length(x))x1=rad*cos(-theta)+rady1=rad*sin(-theta)-distancelabel1=-1*rep(1,length(x1))n_row=length(x)+length(x1)data=matrix(rep(0,3*n_row),nrow=n_row,ncol=3)data[,1]=c(x,x1)data[,2]=c(y,y1)data[,3]=c(label,label1)data}dataSim=simData(radius=10,width=6,distance=-6,sample_size=3000)plot(dataSim[,1],dataSim[,2],col=ifelse(dataSim[,3]==1,"red","green"),xlab="x",ylab="y")
Euc_dist=function(a,b){sqrt(sum((a-b)^2))}mysign=function(d){1*(d>=0)+(-1)*(d<0)}#############算法主體部分######################################num_input=dim(dataSim)[2]-1 #輸入訓練樣本為矩陣num_hidden_node=6 #隱層結點數num_out=1 #輸出層結點數data_train=dataSimnum_train=dim(data_train)[1]########初始化c_threshold=1e-3c_delta=Infw=matrix(rep(0,num_hidden_node*num_out),nrow=num_hidden_node,ncol=num_out) #權重矩陣sig=0.01P=matrix(rep(0,6^2),nrow=6) #RLS算法中的R^-1for(i in 1:6){P[i,i]=1*sig^(-1)}c=simData(radius=10,width=6,distance=-6,sample_size=num_hidden_node) #RBF中心的初值c=c[,-3]iter_train_min=10 #訓練次數epochs=50 #輪次w_threshold=1e-8mse_threshold=1e-6w_delta=Infn=1m=1eta=1 #學習速率err=0 #錯誤檢測計數器pos_vector=rep(1,num_train) #位置向量,用以標記屬于某個聚類的樣本的位置mse=vector()ee=vector()################Kmeans算法while(c_delta>c_threshold && n<=num_train){x=data_train[n,-3]y=data_train[n,3]eu_dist=vector()for(i in 1:num_hidden_node){eu_dist[i]=Euc_dist(x,c[i,])}eu_min_value=min(eu_dist)eu_min_pos=order(eu_dist)[1]c[eu_min_pos,]=c[eu_min_pos,]+eta*(x-c[eu_min_pos,])pos_vector[n]=eu_min_posn=n+1}############計算每個聚類中的方差tem_vec=vector()sigma=vector()for(i in 1:num_hidden_node){tem_vec=(pos_vector==i)dist_temp=0for(j in 1:num_train){if(tem_vec[j]==TRUE)dist_temp=Euc_dist(c[i,],data_train[j,-3])+dist_temp}sigma[i]=dist_temp/sum(tem_vec)}g=matrix(rep(0,num_hidden_node),nrow=num_hidden_node)#####################訓練輸出層權重for(epoch in 1:epochs){random_seq=sample(seq(1:num_train),replace=FALSE)data_randomized_tr=data_train[random_seq,]for(m in 1:num_train){x=data_randomized_tr[m,-3]d=data_randomized_tr[m,3]for(i in 1:num_hidden_node)g[i,]=exp(-t(x-c[i,])%*%(x-c[i,])/(2*sigma[i]^2))#########RLS算法pai=P%*%gkk=pai/(1+t(g)%*%pai)[1,1]e=d-mysign(t(w)%*%g)w_delta=t(kk*e[1,1])ee[m]=d-mysign(t(w)%*%g)w=w+t(w_delta)P=P-kk%*%t(g)%*%P}mse[epoch]=mean(ee^2)if(mse[epoch]1e-6)err=err+1}err/num_test最后得到的效果還行,3000個訓練樣本,2000個檢測樣本,最終分類錯誤率在8%以內。當然,由于隨機數,如果你在自己機器上跑上述代碼,獲得的結果應該與我的不同。上一篇:R語言學習系列(數據挖掘之決策樹算法實現--ID3代碼篇)
下一篇:用R語言求置信區間
總結
以上是生活随笔為你收集整理的rbf神经网络 c语言,RBF神经网络极简介绍及其算法R语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网上书店系统源代码java_java版网
- 下一篇: Xilinx ZYNQ Ultrasca