径向基(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函数来计算均方误差。