机器学习算法——神经网络4(RBF神经网络)
RBF(Radial Basis Function,徑向基函數(shù))網(wǎng)絡(luò)是一種單隱層前饋神經(jīng)網(wǎng)絡(luò)。它使用徑向基函數(shù)作為隱層神經(jīng)元激活函數(shù),而輸出層是對(duì)隱層神經(jīng)元輸出的線性組合。
所以,RBF神經(jīng)網(wǎng)絡(luò)是一種三層神經(jīng)網(wǎng)絡(luò),其包括輸入層、隱層、輸出層。從輸入層到隱層的變換是非線性的,從隱層到輸出層的變換是線性的。RBF神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。
其中,我們稱之為徑向基函數(shù),最常見的徑向基函數(shù)是高斯徑向基函數(shù)(或稱為“高斯核函數(shù)”或者RBF核函數(shù))。?高斯核函數(shù)定義如下:
其中,是第i個(gè)神經(jīng)元的中心點(diǎn),為高斯核的寬度。為樣本點(diǎn)到中心點(diǎn)的歐式距離。
假定輸入為d維向量x,輸出為實(shí)值,則RBF網(wǎng)絡(luò)可定義為:
其中,q為隱層神經(jīng)元個(gè)數(shù),wj是第j個(gè)隱層神經(jīng)元所對(duì)應(yīng)的權(quán)重,cj是第j個(gè)隱層神經(jīng)元所對(duì)應(yīng)的中心。
用均方誤差定義誤差函數(shù),目標(biāo)是為了最小化(累積)誤差函數(shù):
。
利用BP算法反向傳播誤差,并利用梯度下降法分別求得RBF網(wǎng)絡(luò)參數(shù),RBF需要的網(wǎng)絡(luò)參數(shù)為 權(quán)重w,基函數(shù)的中心 c和高斯核寬度?。
輸出層的神經(jīng)元線性權(quán)重為:
隱層神經(jīng)元中心點(diǎn):
隱層的高斯核寬度:
對(duì)RBF不同的參數(shù)分別設(shè)置不同的學(xué)習(xí)率,經(jīng)過多輪迭代直至誤差函數(shù)收斂,結(jié)束訓(xùn)練。
RBF神經(jīng)網(wǎng)絡(luò)與BP神經(jīng)網(wǎng)絡(luò)的比較:
1. RBF的網(wǎng)絡(luò)更加簡(jiǎn)單,一般是單隱層的網(wǎng)絡(luò);
2. RBF的輸入項(xiàng)經(jīng)過高斯轉(zhuǎn)換映射到了高維空間,而BP網(wǎng)絡(luò)就是輸入項(xiàng)與權(quán)值之間的線性組合;
3. RBF網(wǎng)絡(luò)的函數(shù)逼近能力和收斂速度一般要優(yōu)于BP網(wǎng)絡(luò)。
Python代碼實(shí)現(xiàn)RBF網(wǎng)絡(luò):
先構(gòu)建RBF網(wǎng)絡(luò),代碼為:
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 #隱含層神經(jīng)元個(gè)數(shù)self.w = 0 #線性權(quán)值self.c = 0 #神經(jīng)元中心點(diǎn)self.sigma = 0 #高斯核寬度#RBF一共要學(xué)習(xí)三個(gè)參數(shù),w(權(quán)重),c(基函數(shù)中心),sigma(高斯核寬度)self.r = {"w": r_w, "c": r_c, "sigma": r_sigma} #參數(shù)迭代的學(xué)習(xí)率,self.errList = [] #誤差列表self.n_iters = 0 #實(shí)際迭代次數(shù)self.tol = 1.0e-5 #最大容忍誤差self.X = 0 #訓(xùn)練集特征self.y = 0 #訓(xùn)練集結(jié)果self.n_samples = 0 #訓(xùn)練集樣本數(shù)量self.n_features = 0 #訓(xùn)練集特征數(shù)量def init(self): #初始化參數(shù)sigma = np.random.random((self.h, 1))#(h,1) h隱藏神經(jīng)元的個(gè)數(shù)(50,1)c = np.random.random((self.h, self.n_features))#(h,1) 基函數(shù)中心(50,1)w = np.random.random((self.h+1, 1))#(h+1,1)權(quán)重(51,1)return sigma, c, w#計(jì)算徑向基距離函數(shù)def guass(self, sigma, X, ci):return np.exp(-np.linalg.norm((X-ci), axis=1)**2/(2*sigma**2))#按行向量處理#隱藏層輸出數(shù)據(jù)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#輸出層輸入數(shù)據(jù)def addIntercept(self,X): # X(500, 50),return np.hstack((X, np.ones((self.n_samples, 1))))#輸出(500,51)#計(jì)算整體誤差def calSSE(self, prey, y): #prey = yi_ouputreturn 0.5 * (np.linalg.norm(prey-y))**2#求l2范數(shù)的平方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#訓(xùn)練def train(self, X, y, iters):self.n_samples, self.n_features = X.shape #樣本量500個(gè),特征1個(gè)#初始化參數(shù)sigma, c, w = self.init() #w(51,1) c(50,1)for i in range(iters):#正向計(jì)算過程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)點(diǎn)乘得(500,1)error = self.calSSE(yi_output, y)#計(jì)算誤差if error < self.tol: #在誤差內(nèi),直接可以跳出循環(huán)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']是學(xué)習(xí)率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']是學(xué)習(xí)率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預(yù)測(cè)函數(shù)為:
#預(yù)測(cè)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主函數(shù)為:
if __name__ == "__main__":#hermit多項(xiàng)式為f(x) = 1.1(1-x+2x^2)exp(-x^2/2)X = np.linspace(-5, 5, 500)[:, np.newaxis] #等分找到500個(gè)樣本點(diǎn),然后np.newaxis增加一個(gè)維度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個(gè)隱層神經(jīng)元,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()上面設(shè)置的迭代次數(shù)為1000,輸出的圖像為(上面是看的與Hemit多項(xiàng)式擬合結(jié)果,圖2顯示的是攜帶次數(shù)與誤差的結(jié)果):
大家也可以設(shè)置不同的迭代次數(shù),比如,設(shè)置成100,得到的圖像為:?
?
?RBF網(wǎng)絡(luò)講解到此結(jié)束,歡迎大家留言討論。
總結(jié)
以上是生活随笔為你收集整理的机器学习算法——神经网络4(RBF神经网络)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hrbusrt 1900 权限问题
- 下一篇: 电子眼拍原理