美文网首页大数据 爬虫Python AI Sql
RBF神经网络以及Python实现

RBF神经网络以及Python实现

作者: 乐观的程序员 | 来源:发表于2020-04-11 09:37 被阅读0次

RBF网络能够逼近任意非线性的函数。可以处理系统内难以解析的规律性,具有很好的泛化能力,并且具有较快的学 习速度。当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。

由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢,比如BP网络。如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络,比如RBF网络。接下来重点先介绍RBF网络的原理,然后给出其实现。先看如下图

正则化的RBF神经网路请参照博客园的文章(链接:http://www.cnblogs.com/zhangchaoyang/articles/2591663.html)。

下面是一个比较好的Python的RBF网络实现。

from scipy import *

from scipy.linalg import norm, pinv

from matplotlib import pyplot as plt

class RBF:

def __init__(self, indim, numCenters, outdim):

self.indim = indim

self.outdim = outdim

self.numCenters = numCenters

self.centers = [random.uniform(-1, 1, indim) for i in xrange(numCenters)]

self.beta = 8

self.W = random.random((self.numCenters, self.outdim))

def _basisfunc(self, c, d):

assert len(d) == self.indim

return exp(-self.beta * norm(c-d)**2)

def _calcAct(self, X):

# calculate activations of RBFs

G = zeros((X.shape[0], self.numCenters), 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: matrix of dimensions n x indim

y: column vector of dimension n x 1 """

# choose random center vectors from training set

rnd_idx = random.permutation(X.shape[0])[:self.numCenters]

self.centers = [X[i,:] for i in rnd_idx]

print "center", self.centers

# calculate activations of RBFs

G = self._calcAct(X)

print G

# calculate output weights (pseudoinverse)

self.W = dot(pinv(G), Y)

def test(self, X):

""" X: matrix of dimensions n x indim """

G = self._calcAct(X)

Y = dot(G, self.W)

return Y

if __name__ == '__main__':

n = 100

x = mgrid[-1:1:complex(0,n)].reshape(n, 1)

# set y and add random noise

y = sin(3*(x+0.5)**3 - 1)

# y += random.normal(0, 0.1, y.shape)

# rbf regression

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

plt.plot(x, z, 'r-', linewidth=2)

# plot rbfs

plt.plot(rbf.centers, zeros(rbf.numCenters), 'gs')

for c in rbf.centers:

# RF prediction lines

cx = arange(c-0.7, c+0.7, 0.01)

cy = [rbf._basisfunc(array([cx_]), array([c])) for cx_ in cx]

plt.plot(cx, cy, '-', color='gray', linewidth=0.2)

plt.xlim(-1.2, 1.2)

plt.show()

python高薪就业(视频、学习路线、免费获取)​www.jianshu.com

相关文章

网友评论

    本文标题:RBF神经网络以及Python实现

    本文链接:https://www.haomeiwen.com/subject/jgacmhtx.html