python⾃带rbf函数吗_径向基函数(RBF)神经⽹络
RBF⽹络能够逼近任意的⾮线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能⼒,并有很快的学习收敛速度,已成功应⽤于⾮线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。
简单说明⼀下为什么RBF⽹络学习收敛得⽐较快。当⽹络的⼀个或多个可调参数(权值或阈值)对任何⼀个输出都有影响时,这样的⽹络称为全局逼近⽹络。由于对于每次输⼊,⽹络上的每⼀个权值都要调整,从⽽导致全局逼近⽹络的学习速度很慢。BP⽹络就是⼀个典型的例⼦。
如果对于输⼊空间的某个局部区域只有少数⼏个连接权值影响输出,则该⽹络称为局部逼近⽹络。常见的局部逼近⽹络有RBF⽹络、⼩脑模型(CMAC)⽹络、B样条⽹络等。
径向基函数解决插值问题
完全内插法要求插值函数经过每个样本点,即
。样本点总共有P个。
RBF的⽅法是要选择P个基函数,每个基函数对应⼀个训练数据,各基函数形式为
,由于距离是径向同性的,因此称为径向基函数。||X-Xp||表⽰差向量的模,或者叫2范数。
基于为径向基函数的插值函数为:
输⼊X是个m维的向量,样本容量为P,P>m。可以看到输⼊数据点Xp是径向基函数φp的中⼼。
隐藏层的作⽤是把向量从低维m映射到⾼维P,低维线性不可分的情况到⾼维就线性可分了。
将插值条件代⼊:
写成向量的形式为
,显然Φ是个规模这P对称矩阵,且与X的维度⽆关,当Φ可逆时,有
对于⼀⼤类函数,当输⼊的X各不相同时,Φ就是可逆的。下⾯的⼏个函数就属于这“⼀⼤类”函数:
1)Gauss(⾼斯)函数
2)Reflected Sigmoidal(反常S型)函数
3)Inverse multiquadrics(拟多⼆次)函数
σ称为径向基函数的扩展常数,它反应了函数图像的宽度,σ越⼩,宽度越窄,函数越具有选择性。
完全内插存在⼀些问题:
1)插值曲⾯必须经过所有样本点,当样本中包含噪声时,神经⽹络将拟合出⼀个错误的曲⾯,从⽽使泛化能⼒下降。
由于输⼊样本中包含噪声,所以我们可以设计隐藏层⼤⼩为K,K
2)基函数个数等于训练样本数⽬,当训练样本数远远⼤于物理过程中固有的⾃由度时,问题就称为超定的,插值矩阵求逆时可能导致不稳定。
拟合函数F的重建问题满⾜以下3个条件时,称问题为适定的:
解的存在性
解的唯⼀性
解的连续性
不适定问题⼤量存在,为解决这个问题,就引⼊了正则化理论。
正则化理论
正则化的基本思想是通过加⼊⼀个含有解的先验知识的约束来控制映射函数的光滑性,这样相似的输⼊就对应着相似的输出。
寻逼近函数F(x)通过最⼩化下⾯的⽬标函数来实现:
加式的第⼀项好理解,这是均⽅误差,寻最优的逼近函数,⾃然要使均⽅误差最⼩。第⼆项是⽤来控制逼近函数光滑程度的,称为正则化项,λ是正则化参数,D是⼀个线性微分算⼦,代表了对F(x)的先验知识。曲率过⼤(光滑度过低)的F(x)通常具有较⼤的||DF||值,因此将受到较⼤的惩罚。
直接给出(1)式的解:
权向量
********************************(2)
G(X,Xp)称为Green函数,G称为Green矩阵。Green函数与算⼦D的形式有关,当D具有旋转不变性和平移不变性时,
。这类Green函数的⼀个重要例⼦是多元Gauss函数:
正则化RBF⽹络
输⼊样本有P个时,隐藏层神经元数⽬为P,且第p个神经元采⽤的变换函数为G(X,Xp),它们相同的扩展常数σ。输出层神经元直接把净输⼊作为输出。输⼊层到隐藏层的权值全设为1,隐藏层到输出层的权值是需要训练得到的:逐⼀输⼊所有的样本,计算隐藏层上所有的Green 函数,根据(2)式计算权值。
⼴义RBF⽹络
Cover定理指出:将复杂的模式分类问题⾮线性地映射到⾼维空间将⽐投影到低维空间更可能线性可分。
⼴义RBF⽹络:从输⼊层到隐藏层相当于是把低维空间的数据映射到⾼维空间,输⼊层细胞个数为样本的维度,所以隐藏层细胞个数⼀定要⽐输⼊层细胞个数多。从隐藏层到输出层是对⾼维空间的数据进⾏线性分类的过程,可以采⽤单层感知器常⽤的那些学习规则,参见神经⽹络基础和感知器。
注意⼴义RBF⽹络只要求隐藏层神经元个数⼤于输⼊层神经元个数,并没有要求等于输⼊样本个数,实际上它⽐样本数⽬要少得多。因为在标准RBF⽹络中,当样本数⽬很⼤时,就需要很多基函数,权值矩阵就会很⼤,计算复杂且容易产⽣病态问题。另外⼴RBF⽹与传统RBF⽹相⽐,还有以下不同:
径向基函数的中⼼不再限制在输⼊数据点上,⽽由训练算法确定。
各径向基函数的扩展常数不再统⼀,⽽由训练算法确定。
输出函数的线性变换中包含阈值参数,⽤于补偿基函数在样本集上的平均值与⽬标值之间的差别。
因此⼴义RBF⽹络的设计包括:
结构设计--隐藏层含有⼏个节点合适
参数设计--各基函数的数据中⼼及扩展常数、输出节点的权值。
下⾯给出计算数据中⼼的两种⽅法:
数据中⼼从样本中选取。样本密集的地⽅多采集⼀些。各基函数采⽤统⼀的偏扩展常数:
dmax是所选数据中⼼之间的最⼤距离,M是数据中⼼的个数。扩展常数这么计算是为了避免径向基函
数太尖或太平。
⾃组织选择法,⽐如对样本进⾏聚类、梯度训练法、资源分配⽹络等。各聚类中⼼确定以后,根据各中⼼之间的距离确定对应径向基函数的扩展常数。
λ是重叠系数。
接下来求权值W时就不能再⽤
了,因为对于⼴义RBF⽹络,其⾏数⼤于列数,此时可以求Φ伪逆。
数据中⼼的监督学习算法
最⼀般的情况,RBF函数中⼼、扩展常数、输出权值都应该采⽤监督学习算法进⾏训练,经历⼀个误差修正学习的过程,与BP⽹络的学习原理⼀样。同样采⽤梯度下降法,定义⽬标函数为
ei为输⼊第i个样本时的误差信号。
上式的输出函数中忽略了阈值。
为使⽬标函数最⼩化,各参数的修正量应与其负梯度成正⽐,即
具体计算式为
上述⽬标函数是所有训练样本引起的误差总和,导出的参数修正公式是⼀种批处理式调整,即所有样本输⼊⼀轮后调整⼀次。⽬标函数也可以为瞬时值形式,即当前输⼊引起的误差
此时参数的修正值为:
下⾯我们就分别⽤本⽂最后提到的聚类的⽅法和数据中⼼的监督学习⽅法做⼀道练习题。
考虑Hermit多项式的逼近问题
训练样本这样产⽣:样本数P=100,xi且服从[-4,4]上的均匀分布,样本输出为F(xi)+ei,ei为添加的噪声,服从均值为0,标准差为0.1的正态分布。
(1)⽤聚类⽅法求数据中⼼和扩展常数,输出权值和阈值⽤伪逆法求解。隐藏节点数M=10,隐藏节点重叠系数λ=1,初始聚类中⼼取前10个训练样本。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"matrix.h"
using namespace std;
const int P=100; //输⼊样本的数量
vector X(P);//输⼊样本
Matrix Y(P,1);//输⼊样本对应的期望输出
const int M=10; //隐藏层节点数⽬
vector center(M); //M个Green函数的数据中⼼
vector delta(M); //M个Green函数的扩展常数
Matrix Green(P,M); //Green矩阵
Matrix Weight(M,1); //权值矩阵
/*Hermit多项式函数*/
inline double Hermit(double x){
return 1.1*(1-x+2*x*x)*exp(-1*x*x/2);
}
/*产⽣指定区间上均匀分布的随机数*/
inline double uniform(double floor,double ceil){
return floor+1.0*rand()/RAND_MAX*(ceil-floor);
}
/*产⽣区间[floor,ceil]上服从正态分布N[mu,sigma]的随机数*/
inline double RandomNorm(double mu,double sigma,double floor,double ceil){ double x,prob,y;
do{
x=uniform(floor,ceil);
prob=1/sqrt(2*M_PI*sigma)*exp(-1*(x-mu)*(x-mu)/(2*sigma*sigma));
y=1.0*rand()/RAND_MAX;
}while(y>prob);
return x;
}
/*产⽣输⼊样本*/
void generateSample(){
for(int i=0;i
double in=uniform(-4,4);
X[i]=in;
Y.put(i,0,Hermit(in)+RandomNorm(0,0.1,-0.3,0.3));
}
}
/*寻样本离哪个中⼼最近*/hermit
int nearest(const vector& center,double sample){
int rect=-1;
double dist=numeric_limits::max();
for(int i=0;i
if(fabs(sample-center[i])
dist=fabs(sample-center[i]);
rect=i;
}
}
return rect;
}
/*计算簇的质⼼*/
double calCenter(const vector &g){
int len=g.size();
double sum=0.0;
for(int i=0;i
sum+=g[i];
return sum/len;
}
/*KMeans聚类法产⽣数据中⼼*/
void KMeans(){
assert(P%M==0);
vector > group(M); //记录各个聚类中包含哪些样本
double gap=0.001; //聚类中⼼的改变量⼩于为个值时,迭代终⽌for(int i=0;i
center[i]=X[10*i+3]; //输⼊是均匀分布的,所以我们均匀地选取}
while(1){
for(int i=0;i
group[i].clear(); //先清空聚类信息
for(int i=0;i
int c=nearest(center,X[i]);
group[c].push_back(X[i]);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。