径向基(RBF)神经网络python代码实现

from scipy.linalg import norm, pinv
from matplotlib import pyplot as plt
import numpy


class RBF:
    def __init__(self, indim, numcenters, outdim):
        self.indim = indim
        self.outdim = outdim
        self.numcenters = numcenters
        self.centers = [numpy.random.uniform(-1, 1, indim) for i in range(numcenters)]
        self.beta = 8
        self.W = numpy.random.random((numcenters, outdim))

    def _basisfunc(self, c, d):
        assert len(d) == self.indim
        return numpy.exp(-self.beta * norm(c - d) ** 2)

    def _calcAct(self, X):
        # calculate activations of RBFs
        G = numpy.zeros((X.shape[0], self.numcenters), float)
        for ci, c in enumerate(self.centers):
            for xi, x0 in enumerate(X):
                G[xi, ci] = self._basisfunc(c, x0)
        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 = numpy.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 = numpy.dot(pinv(G), Y)

    def test(self, X):
        """ X: matrix of dimensions n x indim """
        G = self._calcAct(X)
        Y = numpy.dot(G, self.W)
        return Y


if __name__ == '__main__':
    n = 100
    x = numpy.mgrid[-1:1:complex(0, n)].reshape(n, 1)
    # set y and add random noise
    y = numpy.sin(3 * (x + 0.5) ** 3 - 1)
    # y += random.normal(0, 0.1, y.shape)
    # rbf regression
    rbf = RBF(1, 20, 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, numpy.zeros(rbf.numcenters), 'gs')
    # for c in rbf.centers:
    #     # RF prediction lines
    #     cx = numpy.arange(c - 0.7, c + 0.7, 0.01)
    #     cy = [rbf._basisfunc(numpy.array([cx_]), numpy.array([c])) for cx_ in cx]
    #     plt.plot(cx, cy, '-', color='black', linewidth=0.2)
    # plt.xlim(-1.2, 1.2)
    plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值