前言:rbf算法用的不多,但他的思想引用到局部逼近,能夠更快求解參數(shù),在未來的發(fā)展應(yīng)該不錯
簡介
1>方法:先給定幾個中心點和聚類類似,然后判斷數(shù)據(jù)是屬于哪個中心點,那么屬于該中心的特性就比較大,RBF網(wǎng)絡(luò)能夠逼近任意非線性的函數(shù)??梢蕴幚硐到y(tǒng)內(nèi)難以解析的規(guī)律性,具有很好的泛化能力,并且具有較快的學(xué)習(xí)速度。
2>優(yōu)點:有很快的學(xué)習(xí)收斂速度,已成功應(yīng)用于非線性函數(shù)逼近、時間序列分析、數(shù)據(jù)分類、 模式識別、信息處理、圖像處理、系統(tǒng)建模、控制和故障診斷等。
3>全局逼近網(wǎng)絡(luò):當(dāng)網(wǎng)絡(luò)的一個或多個可調(diào)參數(shù)(權(quán)值或閾值)對任何一個輸出都有影響時,這樣的網(wǎng)絡(luò)稱為全局逼近網(wǎng)絡(luò)。由于對于每次輸入,網(wǎng)絡(luò)上的每一個權(quán)值都要調(diào)整,從而導(dǎo)致全局逼近網(wǎng)絡(luò)的學(xué)習(xí)速度很慢,比如BP網(wǎng)絡(luò)。
4>局部逼近網(wǎng)絡(luò):如果對于輸入空間的某個局部區(qū)域只有少數(shù)幾個連接權(quán)值影響輸出,則該網(wǎng)絡(luò)稱為局部逼近網(wǎng)絡(luò),比如RBF網(wǎng)絡(luò)。
原理:
RBF Network 通常只有三層:
1>輸入層
2>中間層:計算輸入 x 矢量與樣本矢量 c 歐式距離的 Radial Basis Function (RBF) 的值。隱含層的作用是把向量從低維度的m映射到高維度的P,這樣低維線性不可分
的情況到高維線性可分了。
3>輸出層:計算它們的線性組合。

RBF Kernel的特點:

先是用類似聚類的方式把區(qū)分出記憶樣本(圖中的圓心點),然后有用了BP的算法求解。

神經(jīng)網(wǎng)絡(luò)遇到的問題:
一般來講,可以通過增加神經(jīng)元和網(wǎng)絡(luò)層次來提升神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能力,使其得到的模型更加能夠符合數(shù)據(jù)的分布場景;但是實際應(yīng)用場景中,神經(jīng)網(wǎng)絡(luò)的層次一般情況不會太大,因為太深的層次有可能產(chǎn)生一些求解的問題
在DNN(深度神經(jīng)網(wǎng)絡(luò))的求解中有可能存在兩個問題:梯度消失和梯度爆炸;我們在求解梯度的時候會使用到鏈?zhǔn)角髮?dǎo)法則,實際上就是一系列的連乘,如果每一層都小于1的話,則梯度越往前乘越小,導(dǎo)致梯度消失,而如果連乘的數(shù)字在每層 都是大于1的,則梯度越往前乘越大,導(dǎo)致梯度爆炸.
用代碼實現(xiàn)一個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):
"""
進行模型訓(xùn)練
:param X: 矩陣,x的維度必須是給定的n * input_dim
:param Y: 列的向量組合,要求維度必須是n * 1
:return:
"""
# 隨機初始化中心點(permutation API的作用是打亂順序,如果給定的是一個int類型的數(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)于計算RBF中的激活函數(shù)值
G = self._calcAct(X)
# calculate output weights (pseudoinverse)
# 計算權(quán)重(pinv API:計算矩陣的逆) ==> 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ù)測值
plt.plot(x, z, 'r-', linewidth=2)
plt.xlim(-1.2, 1.2)
plt.show()
結(jié)果:
