RBF神经网络算法是由三层结构组成,输入层至隐层为非线性的空间变换,一般选用径向基函数的高斯函数进行运算;从隐层至输出层为线性空间变换,即矩阵与矩阵之间的变换。
RBF神经网络进行数据运算时需要确认聚类中心点的位置及隐层至输出层的权重。通常,选用K-means聚类算法或最小正交二乘法对数据大量的进行训练得出聚类中心矩阵和权重矩阵。
一般情况下,最小正交二乘法聚类中心点的位置是给定的,因此比较适合分布相对规律的数据。而K-means聚类算法则会自主选取聚类中心,进行无监督分类学习,从而完成空间映射关系。
RBF网络特点
RBF网络能够逼近任意非线性的函数(因为使用的是一个局部的激活函数。在中心点附近有最大的反应;越接近中心点则反应最大,远离反应成指数递减;就相当于每个神经元都对应不同的感知域)。
可以处理系统内难以解析的规律性,具有很好的泛化能力,并且具有较快的学习速度。
有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。
当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢,比如BP网络。
我参照《神经网络原理》的算法描述写的,不知道对不对,欢迎探讨。void CRBFNN::KMeansCluster(size_t K)
{
if( K >m_nPatternNum)
return
int* vecLabel= new int[m_nPatternNum]
//step1 初始化 选择K个初始不同的中心点
RandomSelCenter(K)
while(true)
{
memset(vecLabel,-1,sizeof(int)*m_nPatternNum)
size_t rnd = rand()%m_nPatternNum//抽取样本 以某种概率抽取样本向量
float fMin = (float)INT_MAX
float fNum = 0
//step2 相似匹配 _input[rnd]离_center[j]最近,则标记为j
for(int j=0j<(int)Kj++)
{
fNum = 0
for(size_t k = 0k<m_nInputNumk++)
fNum += (_input[rnd][k]-_center[j][k])*(_input[rnd][k]-_center[j][k])
if(fNum <fMin)
{
fMin = fNum
vecLabel[rnd] = j
}
}
//step3 更新中心 重新计算_center
CMatrix lastCenter = _center//一个对象需要通过另外一个对象进行初始化,调用拷贝初始化
for(int i=0i<(int)Ki++)
{
if(vecLabel[rnd] == i)
{
for(size_t j=0j<m_nInputNumj++)
_center[i][j] = _center[i][j] + (_input[rnd][j]-_center[i][j])*0.1f//学习率0.1
}
}
//step4 _center无明显变化退出
fNum = 0
for(int i=0i<(int)Ki++)
{
for(size_t k = 0k<m_nInputNumk++)
fNum += (_center[i][k]-lastCenter[i][k])*(_center[i][k]-lastCenter[i][k])
}
if(fNum <1e-3)
break
}
delete[] vecLabel
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)