センサ学習アルゴリズムpythonコード実装

17934 ワード

センシングマシンは、線形分割可能なモデルを使用して、正のインスタンス点と負のインスタンス点を1つの平面の両側に分割します.感知機学習アルゴリズムには2つの実現形態があり、1つは原始形式であり、1つは対偶形式感知機学習アルゴリズムが勾配降下アルゴリズムによって最適化され、ここで勾配降下はランダム勾配降下法を選択する.
1.元の形式
アルゴリズム実装手順:
  • 初期値w,b w,b w,b
  • を選択する
  • トレーニングセットでデータx i,y i x^i,y^i xi,yi
  • を選択
  • y∗(w x+b)<=0 y*(wx+b)<=0 y∗(wx+b)<=0ならw,b w,b,w=w+を更新するη y i x i w = w+\eta y^ix^i w=w+ηyixi b = b + η y i b = b+\eta y^i b=b+ηyi
  • は(2)に移動し、訓練セットに誤分類点
  • がないまで
    ここではコードを簡潔にするために,b bをw 0 w^0 w 0として処理し,X X X Xの各行に1を追加した.コードは次のとおりです.
    #!/usr/bin/env python
    
    
    
    import numpy as np;
    
    #          
    def perceptron(X,y,w,alpha):
        (m,n) = X.shape;
        while(1):
            num = 0;
            for i in range(0,m):
                x = X[i].reshape((1,n));
                if(x.dot(w)*y[i]<=0):
                    grad(w,x,y[i],alpha);
                    print('i='+(i+1).__str__());
                else: num+=1;
            if(num==m): break;
    #      ,    w
    def grad(w,x,y,alpha):
        w+=alpha*x.T*y;
    if __name__=='__main__':
        X = np.array([[3,3],[4,3],[1,1]]);
        (m, n) = X.shape;
        X = np.c_[np.ones((m, 1)), X];
        y = np.array([[1],[1],[-1]]);
        w = np.zeros((n+1,1));
        alpha = 1;
        perceptron(X,y,w,alpha);
    

    ランダム降下勾配アルゴリズムでは、データセットをランダムにソートする必要があります.
    そうついけいしき
    対偶形式は実は元の形式のw w wとb bの簡略化形式w=Σi=1 Nである.α i y i x i w =\sum_{i=1}^{N}\alpha_iy_ix_i w=i=1∑N​αi​yi​xi​ b = ∑ α y i b =\sum\alpha y_i b=∑αyi​ a l p h a = n i η alpha=n_i\eta alpha=ni​η x i x^i xiのiは第数組のデータを表し、n i n_i niはx i x_を表すixi訂正回数、初期化はすべて0です.G r a m = [ x i ∗ x j ] N ∗ N Gram = [x_i*x_j]_{N*N}Gram=[xi∗xj]N∗Nが予め求めたGram行列は,実はX∗X T X*X^T X∗XTである.
    アルゴリズム実装手順:
  • α = 0\alpha=0 α=0 , b = 0 b=0 b=0
  • トレーニングセットでデータx i,y i x^i,y^i xi,yi
  • を選択
  • y i(Σj=1 Nα j y j x j ∗ x i + b ) < = 0 y^i(\sum_{j=1}^{N}\alpha_jy_jx_j*x_i+b)<=0 yi(∑j=1N​αj​yj​xj​∗xi​+b)<=0 α = α + η\alpha=\alpha+\eta α=α+η b = b + η y i b = b+\eta y^i b=b+ηyi
  • は(2)に移動し、訓練セットが誤って点コードを分類して実現しないまで、元の形式のようなテクニックを使用しない.コードは次のとおりです:
  • #!/usr/bin/env python
    
    
    import numpy as np;
    
    def antperceptron(X,y,alpha,b,learn):
        m = X.shape[0];
        Gram = X.dot(X.T);
        #print(Gram);
    
        while(1):
            num=0;
            for i in range(0,m):
                x = Gram[:,i].reshape(m,1);
                sum_x = (alpha*y*x).sum()+b;
                #print(sum_x);
                if(y[i]*sum_x<=0):
                    [alpha[i],b]=grad(alpha[i],y[i],b,learn);
                    print('i='+(i+1).__str__());
                else: num+=1;
            if(num==m): break;
    
    def grad(alpha_x,y,b,learn):
        alpha_x = alpha_x +learn;
        b = b+learn*y;
        return [alpha_x,b];
    
    if __name__=='__main__':
        X = np.array([[3,3],[4,3],[1,1]]);
        y = np.array([[1],[1],[-1]]);
        alpha = np.zeros((X.shape[0],1));
        b = 0; learn = 1;
        antperceptron(X,y,alpha,b,learn);
    
    

    参考資料:李航----統計学習方法