利用径向基函数网络逼近以下函数 f=20+x1*x1-10*cos(2*π*x1)-10*cos(2*π*x2)请给出解决上述问题的python代码
时间: 2024-05-15 21:10:11 浏览: 14
使用径向基函数网络(RBF)可以逼近非线性函数。以下是使用Python实现的代码:
```
import numpy as np
from scipy.optimize import minimize
def rbf(x, c, s):
return np.exp(-1 / (2 * s**2) * np.linalg.norm(x-c)**2)
def fit_rbf_network(X, Y, K):
# 随机选择K个中心点
centers = X[np.random.choice(np.arange(len(X)), K)]
# 计算每个样本点与中心点之间的距离
D = np.array([np.linalg.norm(X - c, axis=1) for c in centers])
# 计算每个样本点对应的径向基函数矩阵
Phi = np.exp(-D ** 2)
# 使用最小二乘法拟合权重参数
w = np.linalg.solve(Phi.T.dot(Phi), Phi.T.dot(Y))
return centers, w
def predict_rbf_network(X, centers, w, s):
# 计算每个样本点与中心点之间的距离
D = np.array([np.linalg.norm(X - c, axis=1) for c in centers])
# 计算每个样本点对应的径向基函数矩阵
Phi = np.exp(-D ** 2)
# 使用拟合得到的权重参数进行预测
Y = Phi.dot(w)
return Y
# 训练数据
X_train = np.random.rand(1000, 2) * 10 - 5
Y_train = 20 + X_train[:, 0]**2 - 10 * np.cos(2 * np.pi * X_train[:, 0]) - 10 * np.cos(2 * np.pi * X_train[:, 1])
# 使用径向基函数网络进行拟合
K = 100 # 中心点个数
s = 1.0 # 高斯函数宽度
centers, w = fit_rbf_network(X_train, Y_train, K)
# 测试数据
X_test = np.random.rand(1000, 2) * 10 - 5
Y_test = 20 + X_test[:, 0]**2 - 10 * np.cos(2 * np.pi * X_test[:, 0]) - 10 * np.cos(2 * np.pi * X_test[:, 1])
# 计算测试集上的均方误差(MSE)
Y_pred = predict_rbf_network(X_test, centers, w, s)
MSE = ((Y_pred - Y_test) ** 2).mean()
print("MSE:", MSE)
```
注意,在这个例子中,我们使用随机选择K个中心点的方法进行训练,因此每次运行代码得到的结果可能会有所不同。同时,需要注意高斯函数的宽度s的取值也会影响模型的拟合效果。