BP神经网络初始权值选择

一直以来尝试着用BP网络解决一些简单的问题的时候出现着各种各样的问题,效果很不理想:用BP网做双螺旋问题,结果正确率不到70%、但是做XOR问题却能很好地解决。和BOSS研究了半天终于明白了长期以来困扰我们的这些奇怪的事情的原因是我们没有对网络进行正确的归一化以及权值初始化

由于网络通畅使用的是sigmod函数,不管哪种形式值域都是很有限的一小段,所以要想做到很好的逼近效果就需要做归一化。也就是吧输出变换到0-1之间。而输入的每个维度通常是变换到-1到1之间。

而初始权值通常使用的是nguyen-widrow算法进行初始化。这个算法的思想比较简单,就是计算每个sigmod函数能覆盖的区间,然后加上随机化出来的。具体的可以看他们的原始的论文:《Improving the Learning Speed in 2-Layered LSTM Network by Estimating the Configuration of Hidden Units and Optimizing Weights Initialization》。在特殊情况下也有用纯粹的随机的权值啦。

以上都是针对BP网络的,至于其他的网络形式可能不太相同但是都差不多吧

克鲁斯卡尔算法求解最小生成森林

前两天ICM的时候用到了克鲁斯卡尔算法解最小生成森林,不过当年NOIP学的基本都忘光了。写的不是很精练,全当练手了,有需要的就拿去啦

#include 
#include 

#define MAX_POINTS 100
#define INF 99999999

double Map[MAX_POINTS][MAX_POINTS];
int Points[MAX_POINTS];

int main()
{
    int i,j,c=0,b,f,m1,m2;
    double bf=0,min=0;
    char buffer[100];

    FILE * fp;

    for(i=0;i=c)
        {
            i=0;
            j++;
        }
        if(j>c)
            break;

        Map[i++][j]=bf;
    }

    fclose(fp);

    for(i=0;i %d \n",m1,m2);
        Points[m2]=1;

    }

    return 0;
}