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
}
RBF网络能够逼近任意的非线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。
简单说明一下为什么RBF网络学习收敛得比较快。当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢。BP网络就是一个典型的例子。
如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络。常见的局部逼近网络有RBF网络、小脑模型(CMAC)网络、B样条网络等。
附件是RBF神经网络的C++源码。
在命令栏敲nntool,按提示 *** 作,将样本提交进去。还有比较简单的是用广义RBF网络,直接用grnn函数就能实现,基本形式是y=grnn(P,T,spread),你可以用help grnn看具体用法。GRNN的预测精度是不错的。
广义RBF网络:从输入层到隐藏层相当于是把低维空间的数据映射到高维空间,输入层细胞个数为样本的维度,所以隐藏层细胞个数一定要比输入层细胞个数多。从隐藏层到输出层是对高维空间的数据进行线性分类的过程,可以采用单层感知器常用的那些学习规则,参见神经网络基础和感知器。
注意广义RBF网络只要求隐藏层神经元个数大于输入层神经元个数,并没有要求等于输入样本个数,实际上它比样本数目要少得多。因为在标准RBF网络中,当样本数目很大时,就需要很多基函数,权值矩阵就会很大,计算复杂且容易产生病态问题。另外广RBF网与传统RBF网相比,还有以下不同:
1.径向基函数的中心不再限制在输入数据点上,而由训练算法确定。
2.各径向基函数的扩展常数不再统一,而由训练算法确定。
3.输出函数的线性变换中包含阈值参数,用于补偿基函数在样本集上的平均值与目标值之间的差别。
因此广义RBF网络的设计包括:
1.结构设计--隐藏层含有几个节点合适
2.参数设计--各基函数的数据中心及扩展常数、输出节点的权值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)