• 统计学习方法——第二章的c++实现


    1、东西搞丢了,只写一部分

    2、算法那收敛性

    证明逻辑:

    a、γ是yi*(wopt*Xi)最小值

    b、R是Xi最小值

    c、k<=(R/γ)^2

    难打公式,直接说,Wk由Wk-1迭代而来,所以事实上,只需要找到迭代第三项就可以了,迭代第三项有R有eta,Wk的迭代公式有,通过放缩,得到k,eta,R的关系。

    与此同时,得到Wk与Wopt的关系,这里,Wopt是最终结果的W,同样,将Wk拆分,与上面a配合,得到eta与R 关系,结合上面这条,得证。

    下面是C++代码

    感知机原始代码:

    #include <iostream>
    using namespace std;
    
    int main_2() {
        double x1[] = {3,4,1};
        double x2[] = {3,3,1};
        double y[] = {1,1,-1};
        double w[] = {0,0};
        double b[] = { 0 };
        int index = 0;
        double eta = 1;
        while ( index <= 2) {
            double temp = y[index] * (x1[index] * w[0] + x2[index] *w[1] + b[0]);
            if (temp <= 0) {
                w[0] = w[0] + eta * (x1[index])*y[index]; cout << w[0] << endl;
                w[1] = w[1] + eta * (x2[index])*y[index]; cout << w[1] << endl;
                b[0] += y[index]; cout << b[0] << endl;
                index = 0;//这一步很重要,实现了每当出现问题,全部重新开始
    
                
                //cout << w[0] << "   " << w[1];
                //cout << b[0];
    
            }
            else
            {
                index = index+1;
            }
            
        };
        cout << w[0]<<"   "<<w[1]<<endl;
        cout << b[0];
        system("pause");
        return 0;
    }

    感知机对偶代码:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 int main()
     5 {
     6     int x1[] = { 3,4,1 };
     7     int x2[] = { 3,3,1 };
     8     int y[] = { 1,1,-1 };
     9 
    10     int b = 0;
    11     int a[] = { 0,0,0 };
    12     int G[3][3];
    13     for (int i = 0; i < 3; i++)
    14         for (int j = 0; j < 3; j++)
    15         {
    16             G[i][j] = x1[i] * x1[j] + x2[i] * x2[j];
    17             cout << G[i][j] << "	";
    18             if (j == 2)
    19 
    20         }
    21 
    22     int index = 0;
    23     int eta = 1;
    24     while (index < 3)
    25     {
    26         int temp = 0;
    27         for (int j = 0; j < 3; j++)
    28         {
    29             temp += a[j] * y[j] * G[j][index];
    30         }
    31         int all = y[index] * (temp + b);
    32         if (all <= 0)
    33         {
    34             a[index] += eta;
    35             b +=  y[index];
    36             index = 0;
    37 
    38         }
    39         else
    40         {
    41             index++;
    42         }
    43 
    44     }
    45     cout << "a:" << a[0] << "   " << a[1] << "   " << a[2] << endl;
    46     cout << "b:" << b;
    47 
    48 
    49     int w[] = { 0,0 };
    50     for (int i = 0; i < 3; i++)
    51     {
    52         w[0] += a[i] * y[i] * x1[i];
    53         w[1] += a[i] * y[i] * x2[i];
    54     }
    55     b = 0;
    56     for (int i = 0; i < 3; i++)
    57     {
    58         b += a[i] * y[i];
    59     }
    60     cout << endl << "w:" << w[0] << "   " << w[1] << endl;
    61     cout << "b:" << b;
    62     getchar();
    63     return 0;
    64 }
  • 相关阅读:
    redis_String
    redis单线程架构
    redis数据结构与内部编码
    常用命令
    Tomcat:web服务器软件
    mysql数据库-备份与还原实操
    mysql数据库-备份方式简介与规范
    mysql数据库-日志管理
    mysql数据库-简介
    在 Kubernetes 集群在线部署 KubeSphere
  • 原文地址:https://www.cnblogs.com/baochen/p/9320541.html
Copyright © 2020-2023  润新知