其他

RBF神经网络及Python实现(附源码)

2017-03-02 ACdreamers 机器学习算法与Python学习

作者:ACdreamers

http://blog.csdn.net/acdreamers/article/details/46327761

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


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


正则化的RBF神经网路请参照博客园的文章(链接:http://www.cnblogs.com/zhangchaoyang/articles/2591663.html)。下面是一个比较好的Python的RBF网络实现。最后提供Github上的一个C++实现的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()  



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存