目录
简介:
径向基网络函数最初,在1951年,Krige创新性地将矿藏的沉积视作一个各向同性且稳定的随机函数的实现,进而开发出了Kriging方法,这一方法后来在矿藏分析中得到了广泛应用。随后,在1985年,Michael J. D. Powell提出了径向基函数(Radial Basis Function, 简称RBF)用于多变量插值,这标志着RBF在数据处理领域的新突破。紧接着,1988年,Broomhead和Lowe将径向基函数应用于神经网络设计,从而催生了径向基函数(RBF)神经网络。这种神经网络结构独特,其特点在于仅包含一层隐藏层,且隐藏层的神经元激活函数正是径向基函数。而输出层则是对这些隐藏层神经元输出的线性组合,进一步增强了其处理复杂数据的能力。
1 重要组成部分:
1.1 径向基函数:
某种沿径向对称的标量函数,通常定义为样本到数据中心之间径向距离(通常是欧氏距离)的单调函数(由于距离是径向同性的)。
其中c为样本的中心点,||·||是欧几里得范数。
常用得径向基函数——高斯函数。
不同=1,2,3,4绘制得高斯函数图像
1.2 RBF神经网络结构:
用RBF作为隐层神经元的“基”构成隐含层空间,将输入向量直接映射到隐含层空间,将低维模式输入数据变换到高维空间内,使得在低维空间线性不可分问题在高维空间内线性可分。
1.2.1 RBF构架:
RBF神经网路结构图
1.2.2 输入层:
输入节点个数等于输入向量 的维数 , 输入层仅仅起到传输信号作用,输入层和隐含层之间可以看做连接权值为的连接。
1.2.3 隐含层:
由“基”构成隐藏层空间,将输入矢量直接(不通过权连接)映射到隐空间。设隐层节点个数为 ,若基函数选择高斯函数,则第个隐层节点的隐层输出为。
——第 个径向基函数的中心,与 具有相同维度。
——第 个隐层神经元的径向基函数宽度。
1.2.4 输出层:
隐层节点输出的线性加权和。 从隐层到输出层之间的有权重,连接第 个隐层节点和 第 个输出层节点的权重为 ,则第 j 个输出节点的输出为 。
2 工作流程图:
聚类中心求取:详见Kmeans 不调用包python代码-CSDN博客
标准差的求取:
3 径向基代码展示:
import numpy as np
import pandas as pd
import math
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = "SimHei"#汉字乱码的解决方法
class RBFNetwork:
def __init__(self, num_rbf_neurons, num_output_neurons, sigma=1.0):
self.num_rbf_neurons = num_rbf_neurons#径向基中心数量
self.num_output_neurons = num_output_neurons#输出神经元的数量
self.sigma = sigma#高斯函数的标准差参数
self.centers = None#聚类中心
self.weights = None#输出权重
def errors(self,y,y_predict):
y=np.array(y)
y_predict=np.array(y_predict)
return 1/2*math.sqrt(sum((y-y_predict)**2))
def fit(self, X, y):
kmeans = KMeans(n_clusters=self.num_rbf_neurons)
kmeans.fit(X)#找到一组适当的中心点
self.centers = kmeans.cluster_centers_#用kmeans找中心点位
#计算标准差
distances = cdist(X, self.centers)#计算所有点到中心点的距离!!!这里面对于只有一行的数据如[1,2,3]得改写成[[1,2,3]]
self.sigma =np.std(distances, axis=0)#计算了所有聚类中心的距离标准差的平均值
#计算中间层的值
rbf_activations = np.exp(-cdist(X, self.centers) ** 2 / (2 * self.sigma ** 2))
# 加上b偏置项,hstack两个矩阵相加
rbf_activations = np.hstack([rbf_activations, np.ones((X.shape[0], 1))])
# 权重的确定(最小二乘法)
self.weights = np.linalg.lstsq(rbf_activations, y, rcond=None)[0]#GW=D--W=G'D
def predict(self, X):
rbf_activations = np.exp(-cdist(X, self.centers) ** 2 / (2 * self.sigma ** 2))
rbf_activations = np.hstack([rbf_activations, np.ones((X.shape[0], 1))])
return np.dot(rbf_activations, self.weights)
#程序运行
shuju2 = pd.read_excel(r'C://Users//86182//Desktop//iris.xlsx', sheet_name='Sheet1')
X= np.array(shuju2)[:, 0:4]
# min_max_scaler = preprocessing.MinMaxScaler()
# x = min_max_scaler.fit_transform(x)
y=np.array(shuju2)[:,4]
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2,random_state=10)
# 创建并训练 RBF 网络
rbf_net = RBFNetwork(num_rbf_neurons=10, num_output_neurons=1)
rbf_net.fit(X_train, y_train)
y_predict=np.round(rbf_net.predict(X_test))
print(y_predict)
print(y_test)
print("本次预测的误差值为{}".format(rbf_net.errors(y_predict,y_test)))
#print(rbf_net.predict(np.array([[1,2,3,4]])))#注意这里如果只预测一个样本记得将他变成二维数组如[[1,2]]不能为[1,2]
#预测并绘制结果
t=[i for i in range(len(y_test))]
plt.plot(t, y_test, label='Actual')
plt.plot(t, y_predict, label='Predicted')
plt.xlabel("第几个样本")
plt.ylabel("标签值")
plt.title("预测和真实标签情况对比")
plt.legend()
plt.show()
4 RBF代码相关知识点
4.1 cdist(计算数组之间的距离)
from scipy.spatial.distance import cdist
a = np.array([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1],[1, 0, 0],[1, 0, 1],[1, 1, 0],
[1, 1, 1]])
b = np.array([[ 0.1, 0.2, 0.4]])
cdist(a, b, 'cityblock')
#输出:array([[ 0.7], [ 0.9], [ 1.3], [ 1.5], [ 1.5], [ 1.7], [ 2.1], [ 2.3]])
4.2 np.std(标准差计算)
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(np.std(a)) # 计算全局标准差 1.118033988749895
print(np.std(a, axis=0)) # axis=0计算每一列的标准差 [1. 1.]
print(np.std(a, axis=1)) # 计算每一行的标准差 [0.5 0.5]
4.3 np.mean(平均值计算)
a=[[1,2,3],[2,3,4],[3,2,1]]
print(np.mean(a))#2.3333.
4.4 np.hstack(将数组在y轴上堆叠即增加列数)
mport numpy as np
a=np.array([[1,2,3],[2,3,4],[3,4,5]])
c=np.array([[1],[2],[3]])
d=np.hstack((a,c))
print(d) #array([[1 2 3 1],[2 3 4 2], [3 4 5 3]]
4.5 np.vstack(将数组在x轴上堆叠即增加行数)
a=np.array([[1,2,3],[2,3,4],[3,4,5]])
c=np.array([[1,2,3]])
d=np.vstack((a,c))
print(d)
#array([[1 2 3],[2 3 4],[3 4 5], [1 2 3]])