我参照《神经网络原理》的算法描述写的,不知道对不对,欢迎探讨。
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=0; j<(int)K; j++)
{
fNum = 0;
for(size_t k = 0; k<m_nInputNum; k++)
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=0; i<(int)K; i++)
{
if(vecLabel[rnd] == i)
{
for(size_t j=0; j<m_nInputNum; j++)
_center[i][j] = _center[i][j] + (_input[rnd][j]-_center[i][j])*0.1f;//学习率0.1
}
}
//step4 _center无明显变化退出
fNum = 0;
for(int i=0; i<(int)K; i++)
{
for(size_t k = 0; k<m_nInputNum; k++)
fNum += (_center[i][k]-lastCenter[i][k])*(_center[i][k]-lastCenter[i][k]);
}
if(fNum < 1e-3)
break;
}
delete[] vecLabel;
}
两者间不具有明显的关系,前者是一类需要解决的问题,即将处于不同层次或相同层次的传感器信息进行全局性或局部性的融合。(加权平均就是一种最简单的融合)。 神经网络(NN)是人工智能算法中的一种方法,其可以用于解决诸如多传感器信息融合这样的一类问题,其应用领域多种多样。
总而言之,两者间非必须的一种组合,但是两者相结合也是一种处理问题的方法。
RBF(radial basis functions)径向基网络也只是神经网络的一种类型,其是前馈型网络的一种。