日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习算法——神经网络4(RBF神经网络)

發布時間:2023/12/14 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习算法——神经网络4(RBF神经网络) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RBF(Radial Basis Function,徑向基函數)網絡是一種單隱層前饋神經網絡。它使用徑向基函數作為隱層神經元激活函數,而輸出層是對隱層神經元輸出的線性組合

所以,RBF神經網絡是一種三層神經網絡,其包括輸入層、隱層、輸出層。從輸入層到隱層的變換是非線性的,從隱層到輸出層的變換是線性的。RBF神經網絡結構如下圖所示。

其中,我們稱之為徑向基函數,最常見的徑向基函數是高斯徑向基函數(或稱為“高斯核函數”或者RBF核函數)。?高斯核函數定義如下:

其中,是第i個神經元的中心點,為高斯核的寬度。為樣本點到中心點的歐式距離。

假定輸入為d維向量x,輸出為實值,則RBF網絡可定義為:

其中,q為隱層神經元個數,wj是第j個隱層神經元所對應的權重,cj是第j個隱層神經元所對應的中心。

用均方誤差定義誤差函數,目標是為了最小化(累積)誤差函數:

利用BP算法反向傳播誤差,并利用梯度下降法分別求得RBF網絡參數,RBF需要的網絡參數為 權重w,基函數的中心 c和高斯核寬度?。

輸出層的神經元線性權重為:

隱層神經元中心點:

隱層的高斯核寬度:

對RBF不同的參數分別設置不同的學習率,經過多輪迭代直至誤差函數收斂,結束訓練。

RBF神經網絡與BP神經網絡的比較:

1. RBF的網絡更加簡單,一般是單隱層的網絡;

2. RBF的輸入項經過高斯轉換映射到了高維空間,而BP網絡就是輸入項與權值之間的線性組合;

3. RBF網絡的函數逼近能力和收斂速度一般要優于BP網絡。

Python代碼實現RBF網絡:

先構建RBF網絡,代碼為:

import numpy as np import matplotlib.pyplot as pltclass RBFNetwork(object):def __init__(self, hidden_nums, r_w, r_c, r_sigma):self.h = hidden_nums #隱含層神經元個數self.w = 0 #線性權值self.c = 0 #神經元中心點self.sigma = 0 #高斯核寬度#RBF一共要學習三個參數,w(權重),c(基函數中心),sigma(高斯核寬度)self.r = {"w": r_w, "c": r_c, "sigma": r_sigma} #參數迭代的學習率,self.errList = [] #誤差列表self.n_iters = 0 #實際迭代次數self.tol = 1.0e-5 #最大容忍誤差self.X = 0 #訓練集特征self.y = 0 #訓練集結果self.n_samples = 0 #訓練集樣本數量self.n_features = 0 #訓練集特征數量def init(self): #初始化參數sigma = np.random.random((self.h, 1))#(h,1) h隱藏神經元的個數(50,1)c = np.random.random((self.h, self.n_features))#(h,1) 基函數中心(50,1)w = np.random.random((self.h+1, 1))#(h+1,1)權重(51,1)return sigma, c, w#計算徑向基距離函數def guass(self, sigma, X, ci):return np.exp(-np.linalg.norm((X-ci), axis=1)**2/(2*sigma**2))#按行向量處理#隱藏層輸出數據def change(self, sigma, X, c):#sigma(50,1), X(500,1), c(50,1)newX = np.zeros((self.n_samples, len(c)))#newX(500,50)for i in range(len(c)):newX[:, i] = self.guass(sigma[i], X, c[i])return newX#輸出層輸入數據def addIntercept(self,X): # X(500, 50),return np.hstack((X, np.ones((self.n_samples, 1))))#輸出(500,51)#計算整體誤差def calSSE(self, prey, y): #prey = yi_ouputreturn 0.5 * (np.linalg.norm(prey-y))**2#求l2范數的平方def l2(self, X, c):#c(50,1)m, n = np.shape(X) #m=50,n=1newX = np.zeros((m, len(c)))for i in range(len(c)):newX[:, i] = np.linalg.norm((X-c[i]), axis=1)**2return newX#訓練def train(self, X, y, iters):self.n_samples, self.n_features = X.shape #樣本量500個,特征1個#初始化參數sigma, c, w = self.init() #w(51,1) c(50,1)for i in range(iters):#正向計算過程hi_output = self.change(sigma, X, c)#隱層輸出(500,50)yi_input = self.addIntercept(hi_output)#yi_input(500,51)輸出層輸入yi_output = np.dot(yi_input, w)#輸出層輸出 (500,51)與(51,1)點乘得(500,1)error = self.calSSE(yi_output, y)#計算誤差if error < self.tol: #在誤差內,直接可以跳出循環breakself.errList.append(error)#否則,將誤差存入列表中#誤差反向傳播過程deltaw = np.dot(yi_input.T, (yi_output-y)) #yi_input.T(51,500) · (500,1)=(51,1)w = w - self.r['w']*deltaw / self.n_samples #self.r['w']是學習率deltasigma = np.divide(np.multiply(np.dot(np.multiply(hi_output, self.l2(X, c)).T,(yi_output-y)), w[:-1]), sigma**3)sigma -= self.r['sigma']*deltasigma/self.n_samples #self.r['sigma']是學習率deltac1 = np.divide(w[: -1], sigma**2)deltac2 = np.zeros((1, self.n_features))for j in range(self.n_samples): # n_samples:500deltac2 += (yi_output-y)[j] * np.dot(hi_output[j], X[j]-c)deltac = np.dot(deltac1, deltac2)c -= self.r['c']*deltac/self.n_samplesself.n_iters = iif i % 100 == 0:print("第%s輪迭代得誤差為:%s" %(i, error))self.c = cself.w = wself.sigma = sigma

預測函數為:

#預測def predict(self, X):hi_output = self.change(self.sigma, X, self.c)yi_input = self.addIntercept(hi_output)yi_output = np.dot(yi_input, self.w)return yi_output

主函數為:

if __name__ == "__main__":#hermit多項式為f(x) = 1.1(1-x+2x^2)exp(-x^2/2)X = np.linspace(-5, 5, 500)[:, np.newaxis] #等分找到500個樣本點,然后np.newaxis增加一個維度y = np.multiply(1.1*(1-X+2*X**2),np.exp(-0.5*X**2))rbf =RBFNetwork(50, 0.1, 0.2, 0.1)#有50個隱層神經元,r_w=0.1, r_c=0.2, r_sigma=0.1rbf.train(X, y, 1000)fig, ax = plt.subplots(nrows=2)ax[0].plot(X, y, color = 'blue', linewidth = 2.0)hat_y = rbf.predict(X)ax[0].plot(X, rbf.predict(X), color = 'red', linewidth = 2.0)ax[1].plot(rbf.errList, color = 'blue', linewidth =2.0)plt.show()

上面設置的迭代次數為1000,輸出的圖像為(上面是看的與Hemit多項式擬合結果,圖2顯示的是攜帶次數與誤差的結果):

大家也可以設置不同的迭代次數,比如,設置成100,得到的圖像為:?

?

?RBF網絡講解到此結束,歡迎大家留言討論。

總結

以上是生活随笔為你收集整理的机器学习算法——神经网络4(RBF神经网络)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。