Python实现的径向基(RBF)神经网络示例

  • Post category:Python

径向基(RBF)神经网络是一种常用的神经网络模型,它的主要特点具有良好的非线性逼近能力和快速的训练速度。在Python中,可以使用numpy和scikit-learn库来实现RBF神经网络。下面将介绍两个示例,分别是使用RBF神经网络进行分类和回归。

示例一:使用RBF神经网络进行分类

首先,我们需要生成分类数据。可以使用scikit-learn库中的make_classification函数生成分类数据。下面是一个生成分类数据的示例:

from sklearn.datasets import make_classification

# 生成分类数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=0)

接下来,我们将数据划分为训练集和测试集。可以使用scikit-learn库中的train_test_split函数来划分数据集。下面是一个划分数据集的示例:

from sklearn.model_selection import train_test_split

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

然后,我们可以使用numpy和scikit-learn库来实现RBF神经网络。下面是一个RBF神经网络的实现:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score

class RBFNet:
    def __init__(self, n_hidden, sigma=1.0):
        self.n_hidden = n_hidden
        self.sigma = sigma
        self.centers = None
        self.weights = None

    def _gaussian(self, x, center):
        return np.exp(-self.sigma * np.linalg.norm(x - center) ** 2)

    def _calculate_centers(self, X):
        kmeans = KMeans(n_clusters=self.n_hidden, random_state=0).fit(X)
        self.centers = kmeans.cluster_centers_

    def _calculate_weights(self, X, y):
        self.weights = np.zeros((self.n_hidden,))

        for i, c in enumerate(self.centers):
            phi = np.array([self._gaussian(x, c) for x in X])
            self.weights[i] = np.dot(phi, y) / np.sum(phi)

    def fit(self, X, y):
        self._calculate_centers(X)
        self._calculate_weights(X, y)

    def predict(self, X):
        y_pred = np.zeros((X.shape[0],))

        for i, x in enumerate(X):
            phi = np.array([self._gaussian(x, c) for c in self.centers])
            y_pred[i] = np.dot(phi, self.weights)

        return y_pred

在上面的代码中,我们定义了一个RBFNet类,它包含了RBF神经网络的主要方法。在初始化方法中,我们定义了RBF神经网络的参数,包括隐藏层节点数和高斯函数的标准差。在_fit()方法中,我们使用KMeans算法来计算隐藏层节点的中心,并使用最小二乘法来计算权重。在_predict()方法中,我们使用计算出的中心和权重来预测输出。

最后,我们可以使用训练集来训练RBF神经网络,并使用测试集来评估其性能。下面是一个训练和测试RBF神经网络的示例:

# 训练RBF神经网络
rbf = RBFNet(n_hidden=10, sigma=1.0)
rbf.fit(X_train, y_train)

# 预测测试集
y_pred = rbf.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print("Accuracy:", acc)

在上面的代码中,我们使用训练集来训练RBF神经网络,并使用测试集来预测输出。最后,我们使用accuracy_score函数来计算分类准确率。

示例二:使用RBF神经网络进行回归

首先,我们需要生成回归数据。可以使用scikit-learn库中的make_regression函数生成回归数据。下面是一个生成回归数据的示例:

from sklearn.datasets import make_regression

# 生成回归数据
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=0)

接下来,我们将数据划分为训练集和测试集。可以使用scikit-learn库中的train_test_split函数来划分数据集。下面是一个划分数据集的示例:

from sklearn.model_selection import train_test_split

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

然后,我们可以使用numpy和scikit-learn库来实现RBF神经网络。下面是一个RBF神经网络的实现:

import numpy as np
from sklearn.metrics import mean_squared_error

class RBFNet:
    def __init__(self, n_hidden, sigma=1.0):
        self.n_hidden = n_hidden
        self.sigma = sigma
        self.centers = None
        self.weights = None

    def _gaussian(self, x, center):
        return np.exp(-self.sigma * np.linalg.norm(x - center) ** 2)

    def _calculate_centers(self, X):
        self.centers = X[np.random.choice(X.shape[0], self.n_hidden, replace=False)]

    def _calculate_weights(self, X, y):
        phi = np.zeros((X.shape[0], self.n_hidden))

        for i, c in enumerate(self.centers):
            phi[:, i] = np.array([self._gaussian(x, c) for x in X])

        self.weights = np.dot(np.linalg.pinv(phi), y)

    def fit(self, X, y):
        self._calculate_centers(X)
        self._calculate_weights(X, y)

    def predict(self, X):
        y_pred = np.zeros((X.shape[0],))

        for i, x in enumerate(X):
            phi = np.array([self._gaussian(x, c) for c in self.centers])
            y_pred[i] = np.dot(phi, self.weights)

        return y_pred

在上面的代码中,我们定义了一个RBFNet类,它包含了RBF神经网络的主要方法。在初始化方法中,我们定义了RBF神经网络的参数,包括隐藏层节点数和高斯函数的标准差。在_fit()方法中,我们使用随机选择的样本作为中心,并使用最小二乘法来计算权重。在_predict()方法中,我们使用计算出的中心和权重来预测输出。

最后,我们可以使用训练集来训练RBF神经网络,并使用测试集来评估其性能。下面是一个训练和测试RBF神经网络的示例:

# 训练RBF神经网络
rbf = RBFNet(n_hidden=10, sigma=1.0)
rbf.fit(X_train, y_train)

# 预测测试集
y_pred = rbf.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("MSE:", mse)

在上面的代码中,我们使用训练集来训练RBF神经网络,并使用测试集来预测输出。最后,我们使用mean_squared_error函数来计算均方误差。