前言:rbf算法用的不多,但他的思想引用到局部逼近国章,能夠更快求解參數(shù)具钥,在未來(lái)的發(fā)展應(yīng)該不錯(cuò)
簡(jiǎn)介
1>方法:先給定幾個(gè)中心點(diǎn)和聚類(lèi)類(lèi)似,然后判斷數(shù)據(jù)是屬于哪個(gè)中心點(diǎn)液兽,那么屬于該中心的特性就比較大骂删,RBF網(wǎng)絡(luò)能夠逼近任意非線性的函數(shù)∷膯可以處理系統(tǒng)內(nèi)難以解析的規(guī)律性宁玫,具有很好的泛化能力,并且具有較快的學(xué)習(xí)速度柑晒。
2>優(yōu)點(diǎn):有很快的學(xué)習(xí)收斂速度欧瘪,已成功應(yīng)用于非線性函數(shù)逼近、時(shí)間序列分析匙赞、數(shù)據(jù)分類(lèi)佛掖、 模式識(shí)別、信息處理涌庭、圖像處理芥被、系統(tǒng)建模、控制和故障診斷等坐榆。
3>全局逼近網(wǎng)絡(luò):當(dāng)網(wǎng)絡(luò)的一個(gè)或多個(gè)可調(diào)參數(shù)(權(quán)值或閾值)對(duì)任何一個(gè)輸出都有影響時(shí)拴魄,這樣的網(wǎng)絡(luò)稱(chēng)為全局逼近網(wǎng)絡(luò)。由于對(duì)于每次輸入席镀,網(wǎng)絡(luò)上的每一個(gè)權(quán)值都要調(diào)整羹铅,從而導(dǎo)致全局逼近網(wǎng)絡(luò)的學(xué)習(xí)速度很慢,比如BP網(wǎng)絡(luò)愉昆。
4>局部逼近網(wǎng)絡(luò):如果對(duì)于輸入空間的某個(gè)局部區(qū)域只有少數(shù)幾個(gè)連接權(quán)值影響輸出,則該網(wǎng)絡(luò)稱(chēng)為局部逼近網(wǎng)絡(luò)麻蹋,比如RBF網(wǎng)絡(luò)跛溉。
原理:
RBF Network 通常只有三層:
1>輸入層
2>中間層:計(jì)算輸入 x 矢量與樣本矢量 c 歐式距離的 Radial Basis Function (RBF) 的值。隱含層的作用是把向量從低維度的m映射到高維度的P,這樣低維線性不可分
的情況到高維線性可分了。
3>輸出層:計(jì)算它們的線性組合芳室。
RBF Kernel的特點(diǎn):
先是用類(lèi)似聚類(lèi)的方式把區(qū)分出記憶樣本(圖中的圓心點(diǎn))专肪,然后有用了BP的算法求解。
神經(jīng)網(wǎng)絡(luò)遇到的問(wèn)題:
一般來(lái)講堪侯,可以通過(guò)增加神經(jīng)元和網(wǎng)絡(luò)層次來(lái)提升神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能力嚎尤,使其得到的模型更加能夠符合數(shù)據(jù)的分布場(chǎng)景;但是實(shí)際應(yīng)用場(chǎng)景中伍宦,神經(jīng)網(wǎng)絡(luò)的層次一般情況不會(huì)太大芽死,因?yàn)樘畹膶哟斡锌赡墚a(chǎn)生一些求解的問(wèn)題
在DNN(深度神經(jīng)網(wǎng)絡(luò))的求解中有可能存在兩個(gè)問(wèn)題:梯度消失和梯度爆炸;我們?cè)谇蠼馓荻鹊臅r(shí)候會(huì)使用到鏈?zhǔn)角髮?dǎo)法則次洼,實(shí)際上就是一系列的連乘关贵,如果每一層都小于1的話,則梯度越往前乘越小卖毁,導(dǎo)致梯度消失揖曾,而如果連乘的數(shù)字在每層 都是大于1的,則梯度越往前乘越大亥啦,導(dǎo)致梯度爆炸.
用代碼實(shí)現(xiàn)一個(gè)rbf神經(jīng)網(wǎng)絡(luò)如下:
from scipy.linalg import norm, pinv
import numpy as np
from matplotlib import pyplot as plt
np.random.seed(28)
class RBF:
"""
RBF徑向基神經(jīng)網(wǎng)絡(luò)
"""
def __init__(self, input_dim, num_centers, out_dim):
"""
初始化函數(shù)
:param input_dim: 輸入維度數(shù)目
:param num_centers: 中間的核數(shù)目
:param out_dim:輸出維度數(shù)目
"""
self.input_dim = input_dim
self.out_dim = out_dim
self.num_centers = num_centers
self.centers = [np.random.uniform(-1, 1, input_dim) for i in range(num_centers)]
self.beta = 8
self.W = np.random.random((self.num_centers, self.out_dim))
def _basisfunc(self, c, d):
return np.exp(-self.beta * norm(c - d) ** 2)
def _calcAct(self, X):
# calculate activations of RBFs
G = np.zeros((X.shape[0], self.num_centers), float)
for ci, c in enumerate(self.centers):
for xi, x in enumerate(X):
G[xi, ci] = self._basisfunc(c, x)
return G
def train(self, X, Y):
"""
進(jìn)行模型訓(xùn)練
:param X: 矩陣炭剪,x的維度必須是給定的n * input_dim
:param Y: 列的向量組合,要求維度必須是n * 1
:return:
"""
# 隨機(jī)初始化中心點(diǎn)(permutation API的作用是打亂順序翔脱,如果給定的是一個(gè)int類(lèi)型的數(shù)據(jù)奴拦,那么打亂range(int)序列)
rnd_idx = np.random.permutation(X.shape[0])[:self.num_centers]
self.centers = [X[i, :] for i in rnd_idx]
# calculate activations of RBFs
# 相當(dāng)于計(jì)算RBF中的激活函數(shù)值
G = self._calcAct(X)
# calculate output weights (pseudoinverse)
# 計(jì)算權(quán)重(pinv API:計(jì)算矩陣的逆) ==> Y=GW ==> W = G^-1Y
self.W = np.dot(pinv(G), Y)
def test(self, X):
""" X: matrix of dimensions n x indim """
G = self._calcAct(X)
Y = np.dot(G, self.W)
return Y
# 構(gòu)造數(shù)據(jù)
n = 100
x = np.linspace(-1, 1, n).reshape(n, 1)
y = np.sin(3 * (x + 0.5) ** 3 - 1)
# y = y + np.random.normal(0, 0.1, n).reshape(n, 1)
# RBF神經(jīng)網(wǎng)絡(luò)
rbf = RBF(1, 10, 1)
rbf.train(x, y)
z = rbf.test(x)
# plot original data
plt.figure(figsize=(12, 8))
# 展示原始值,黑色
plt.plot(x, y, 'k-')
# plot learned model
# 展示預(yù)測(cè)值
plt.plot(x, z, 'r-', linewidth=2)
plt.xlim(-1.2, 1.2)
plt.show()
結(jié)果: