您的位置:首页 > 其它

MachineLearning---PNN

2015-06-30 09:34 302 查看


MachineLearning---PNN


引言

这篇将介绍machine learning中另一个较为经典的一个算法。之前介绍的几个算法(Backpropagation、LMS……)这些算法有一个明显的特点就是,它们都需要先训练算法,都会通过训练数据集调整算法的内部参数。

这次介绍的算法就摆脱了这种过程。


一、PNN算法基本介绍


1.算法思想

PNN(ProbabilisticNeural Networks)是一种较为出色的分类算法。

算法利用已分类的数据集,对未分类数据进行计算,得到“激活值”(Activation),在找出利用Winner Take All的原则,找到分类。

对于如何计算激活值下面会进行详细介绍。


2.激活值计算公式

隐藏层节点激活值,这里的隐藏层也便是样本集合(已分类的数据集)。



上诉中

是隐藏层第i个节点的激活值, 

便是已分类的数据集,F表示带分类的数据。

输出端节点的激活值。



其中

便是第j个分类的输出端激活值;N表示样本数据(已分类)的数量;

便是上面计算的隐藏层节点的激活值;

是光滑参数。


3.算法流程

对于这个算法的流程也是比较好理解:

1.遍历类别;

2.遍历类别中的样本数据;

3.利用公式(1)对隐藏层节点激活值进行计算

4.利用公式(2)对当前分类,计算其激活值;

5.对所有类别激活值,进行比较,找出最大的,并返回类别序号。


二、算法实现

在这里提供这个算法的实现代码:

[cpp] view
plaincopyprint?

int pnn_classify()  

{  

    double output[CLASSNUM];  

    for(int c = 0 ; c< CLASSNUM ; ++c)  

    {  

        output[c]= 0.0;  

        for(int e = 0 ; e< EXAMPLENUM ; ++e)  

        {  

            double h = 0.0;  

            for(int d = 0 ; d< DIMENSIONALITY ; ++d)  

            {  

                h+= example[d] * dataset[c].example[e].f[d];  

            }  

            output[c]= exp((h-1.0)/pow(sigma,2));  

        }  

        output[c]= output[c] / (double)EXAMPLENUM;  

    }  

    //winner take all  

    double maxActivation = 0.0;  

    int iCMax = 0;  

    for (int c = 0 ; c< CLASSNUM ; ++c)  

    {  

        if(maxActivation < output[c])  

        {  

            iCMax= c;  

            maxActivation= output[c];  

        }  

    }  

    return iCMax;  

}  

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: