统计学习方法 第二章 感知机

原理不多描述,直接上代码

原始形式

import numpy as np

def perceptron(x_arr,y_arr,eta = 1):
    data_mat = np.mat(x_arr)
    label_mat = np.mat(y_arr).T
    m,n = np.shape(data_mat)
    w = np.zeros((n,1))
    b = 0
    wrong_flag = True
    while wrong_flag:
        count = 0
        for i in range(m):
            cal = np.sum(label_mat[i] * (w.T * data_mat[i].T + b))
            if cal <= 0:
                w = w + eta * (label_mat[i] * data_mat[i]).T
                b = b + eta * label_mat[i]
                count += 1
        if count == 0:
            wrong_flag = False
                
    return w,b

用书上的实例点测试(3,3),(4,3),(1,1),对应的y值为1,1,-1,结果得到w = [1,1].T,b = -3

关于对偶形式,我的理解就是把w用原始点通过线性组合表示出来。
对偶形式:

import numpy as np

def perceptron_dual(x_arr,y_arr,eta = 1):
    data_mat = np.mat(x_arr)
    label_mat = np.mat(y_arr).T
    m,n = np.shape(data_mat)
    #Gram矩阵
    gram = data_mat * data_mat.T
    alpha = np.zeros((m,1))
    b = 0
    wrong_flag = True
    while wrong_flag:  
        count = 0
        for i in range(m):
            cal = np.sum(label_mat[i] * (np.multiply(alpha,label_mat).T * gram[i].T + b))          
            if cal <= 0:
                alpha[i] = alpha[i] + eta
                b = b + eta * label_mat[i]
                count += 1
        if count == 0:
            wrong_flag = False
    
    return alpha,b

同样用上面的实例点进行测试,可以得到alpha = [2,0,5].T,b = -3

你可能感兴趣的:(统计学习方法,机器学习)