径向基网络函数(最小二乘法)python实现)

目录

简介:

1 重要组成部分:

1.1 径向基函数:

1.2 RBF神经网络结构:

1.2.1 RBF构架:

1.2.2 输入层:

1.2.3 隐含层:

1.2.4 输出层:

2 工作流程图:

3 径向基代码展示:

4 RBF代码相关知识点

4.1 cdist(计算数组之间的距离)

4.2 np.std(标准差计算)

4.3 np.mean(平均值计算)

4.4 np.hstack(将数组在y轴上堆叠即增加列数)

4.5 np.vstack(将数组在x轴上堆叠即增加行数)


简介:

       径向基网络函数最初,在1951年,Krige创新性地将矿藏的沉积视作一个各向同性且稳定的随机函数的实现,进而开发出了Kriging方法,这一方法后来在矿藏分析中得到了广泛应用。随后,在1985年,Michael J. D. Powell提出了径向基函数(Radial Basis Function, 简称RBF)用于多变量插值,这标志着RBF在数据处理领域的新突破。紧接着,1988年,Broomhead和Lowe将径向基函数应用于神经网络设计,从而催生了径向基函数(RBF)神经网络。这种神经网络结构独特,其特点在于仅包含一层隐藏层,且隐藏层的神经元激活函数正是径向基函数。而输出层则是对这些隐藏层神经元输出的线性组合,进一步增强了其处理复杂数据的能力。

1 重要组成部分:

1.1 径向基函数:

       某种沿径向对称的标量函数,通常定义为样本到数据中心之间径向距离(通常是欧氏距离)的单调函数(由于距离是径向同性的)。

\phi (x,c)=\phi (\left | \left | x-c\right | \right |)

        其中c为样本的中心点,||·||是欧几里得范数。

        常用得径向基函数——高斯函数。

\phi (r)=e^{-\frac{r^{2}}{\sigma _{2}}}

不同\sigma ^{2}=1,2,3,4绘制得高斯函数图像

1.2 RBF神经网络结构:

       用RBF作为隐层神经元的“基”构成隐含层空间,将输入向量直接映射到隐含层空间,将低维模式输入数据变换到高维空间内,使得在低维空间线性不可分问题在高维空间内线性可分。

1.2.1 RBF构架:

RBF神经网路结构图

1.2.2 输入层:

       输入节点个数等于输入向量 X_{i} 的维数 n, 输入层仅仅起到传输信号作用,输入层和隐含层之间可以看做连接权值为1的连接。

1.2.3 隐含层:

       由“基”构成隐藏层空间,将输入矢量直接(不通过权连接)映射到隐空间。设隐层节点个数为 h,若基函数选择高斯函数,则第j个隐层节点的隐层输出为。

\phi (X_{i})=e^{-\frac{||X_{i}-C_{j}||^{2}}{2\sigma _{j}^{2}}}

C_{j}——第 j个径向基函数的中心,与 X_{j} 具有相同维度。

\sigma _{j}——第 j个隐层神经元的径向基函数宽度。

1.2.4 输出层:

       隐层节点输出的线性加权和。 从隐层到输出层之间的有权重,连接第 i个隐层节点和 第 j个输出层节点的权重为 W_{ij},则第 j 个输出节点的输出为 Y_{j}

y_{j}=\sum_{i=1}^{p}W_{ij}e^{-\frac{||X_{i}-C_{j}||^{2}}{2\sigma _{j}^{2}}}

2 工作流程图:

        聚类中心求取:详见Kmeans 不调用包python代码-CSDN博客

        标准差的求取:

\sigma _{i}=\frac{d_{max}}{\sqrt{2k}}

        k —— 隐层节点(中心)个数;
        d_{max}  —— 所选取中心点之间的最大距离。
        权值的求解(最小二乘法):
   GW=D 
W=G'D
        W是对应的权重,G隐藏层输出,D输出层输出。

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]])

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的精确径向函数(Exact Radial Basis Function)通常用于回归或分类问题中的特征映射。这种函数可以通过以下公式来表示: ϕ(x) = exp(-γ||x - c||^2) 其中,x是输入向量,c是中心向量,||x - c||是x和c之间的欧几里得距离,γ是一个参数,通常称为带宽参数,它控制了函数的形状。带宽参数越小,则函数的形状越陡峭,越大则函数的形状越平缓。 在使用精确径向函数时,我们需要选择一组中心向量c和带宽参数γ。通常情况下,中心向量c是通过数据集中的聚类算法来获取的,而带宽参数γ则需要通过交叉验证来确定。交叉验证的过程可以使用Python中的交叉验证函数来实现,例如sklearn.model_selection中的GridSearchCV和RandomizedSearchCV函数等。 下面是一个使用精确径向函数实现回归任务的Python代码示例: ```python import numpy as np from sklearn.metrics.pairwise import euclidean_distances class ExactRBF: def __init__(self, gamma=1.0): self.gamma = gamma def fit(self, X, y): self.X = X self.y = y self.centers = self.get_centers(X) self.phi = self.get_phi(X, self.centers) self.w = np.linalg.pinv(self.phi) @ y def predict(self, X): phi = self.get_phi(X, self.centers) return phi @ self.w def get_centers(self, X): dist = euclidean_distances(X) return X[np.argsort(np.max(dist, axis=1))[-1::-len(X)//10]] def get_phi(self, X, centers): dist = euclidean_distances(X, centers) return np.exp(-self.gamma * dist ** 2) ``` 在这个代码中,我们首先定义了一个ExactRBF类,它包含了fit和predict两个方法。fit方法用于训练模型,接受输入数据X和输出数据y,然后通过get_centers和get_phi方法来获取中心向量和特征映射矩阵,最后使用最小二乘法来计算权重向量w。predict方法用于预测新的输入数据X的输出值。 在get_centers方法中,我们使用欧几里得距离来计算样本之间的距离,然后选择样本距离最远的10%作为中心向量。 在get_phi方法中,我们同样使用欧几里得距离来计算每个样本与中心向量之间的距离,然后使用精确径向函数来计算特征映射矩阵。 下面是一个使用精确径向函数实现分类任务的Python代码示例: ```python import numpy as np from sklearn.metrics.pairwise import euclidean_distances class ExactRBF: def __init__(self, gamma=1.0): self.gamma = gamma def fit(self, X, y): self.X = X self.y = y self.centers = self.get_centers(X) self.phi = self.get_phi(X, self.centers) self.w = np.linalg.pinv(self.phi) @ y def predict(self, X): phi = self.get_phi(X, self.centers) y_pred = np.sign(phi @ self.w) y_pred[y_pred == 0] = 1 return y_pred def get_centers(self, X): dist = euclidean_distances(X) return X[np.argsort(np.max(dist, axis=1))[-1::-len(X)//10]] def get_phi(self, X, centers): dist = euclidean_distances(X, centers) return np.exp(-self.gamma * dist ** 2) ``` 在这个代码中,我们同样定义了一个ExactRBF类,但是在predict方法中使用了np.sign函数来将预测输出值转换为{-1, 1}的类别标签。 总的来说,使用精确径向函数可以有效地解决回归和分类问题,并且可以通过交叉验证来确定带宽参数γ的最优值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值