《统计学习方法》——感知机实现(C语言)

最近在学习C语言和《统计学习方法》
希望能够结合起来加深学习效果,所以根据书中算法和实例编写了一些程序。

一、基础形式的感知机模型实现

#include
#include
#include
int main()
{
    int x1[]={
    3,4,1};
    int x2[]={
    3,3,1};
    int y[]={
    1,1,-1};
    int w[]={
    0,0};
    int b=0;
    int index=0;
    int n=1;
    while(index<3)
    {
        int temp=y[index]*(x1[index]*w[0]+x2[index]*w[1]+b);
        if(temp<=0)
        {
            w[0]+=n*y[index]*x1[index];
            w[1]+=n*y[index]*x2[index];
            b+=n*y[index];
            index=0;
        }
        else{
            index++;
        }
    }
    printf("result:\n");
    printf("w:[%d  %d]\n",w[0],w[1]);
    printf("b:%d\n",b);

    return 0;
}

二、对偶形式下的感知机分类实现

#include
#include
#include
int main()
{
    int x1[]={
    3,4,1};
    int x2[]={
    3,3,1};
    int y[]={
    1,1,-1};

    int b=0,a[]={
    0,0,0},G[3][3];
    //count Gram-matrix
    printf("Gram-matrix: ");
    for(int i=0;i<3;i++)
       for(int j=0;j<3;j++)
        {
        G[i][j]=x1[i]*x1[j]+x2[i]*x2[j];
        printf("G[%d][%d]: %d",i,j,G[i][j]);
        if(j==2)
        break;
         }
       printf("begin to compute a, b: \n");
       int index=0;
       int n=1;
       while(index<3)
       {
        int temp=0;
        for(int j=0;j<3;j++)
        {
           temp+=a[j]*y[j]*G[j][index];
        }
        int all=y[index]*(temp+b);
        if(all<=0)
        {
            a[index]+=n;
            b+=n*y[index];
            index=0;
        }
        else
        {
            index++;
        }

       }
       //count w,b
    int w[]={
    0,0};
    for(int i=0;i<3;i++)
    {
        w[0]+=a[i]*y[i]*x1[i];
        w[1]+=a[i]*y[i]*x2[i];
    }
    b=0;
    for(int i=0;i<3;i++)
    {
        b+=a[i]*y[i];
    }
    printf("w:[%d  %d]\n",w[0],w[1]);
    printf("b:%d\n",b);
    return 0;
}

此文属于小白帖,接下来希望能够将程序改进为可以自由输入数据,以及实现图形化,更直观的看到分类结果。
路过的大佬有时间的话还请给些指点、意见,共同进步,感谢感谢!

你可能感兴趣的:(C语言学习,感知机,机器学习,C语言)