统计学习方法——第2章 感知机

感知机思维导图如下:

感知机学习算法的对偶形式的实现:

import numpy as np

# 采用感知机学习算法的对偶形式实现
class PerceptronDual:

    def __init__(self):     #初始化函数,初始化w,b
        self.weights = None
        self.bias = None

    def sign(self, x):      # sign function 判断正负的函数
        return 1 if x >= 0 else -1

    def train(self, data_set, labels):       #训练函数,求w和b
        lr = 1
        n = np.array(data_set).shape[0]      #n means rows行数,即有几个数据
        
        #print("n=",n)
        #print(data_set)
        
        data_set = np.mat(data_set)          #mat函数将数组转换为矩阵,

        #print("data_set=",data_set)
        alpha = np.zeros(n)               #alpha means the total iteration of wrong point   构造[0,0,0]
        
        #print("alpha=",alpha)
        
        bias = 0
        i = 0
        #print(data_set[1])
        #print(data_set[1].T)
        
        while i < n:
            #in this step, we elide gram matrix
            #T函数是将矩阵进行转置
            if (labels[i] * self.sign(sum(alpha * labels * data_set * data_set[i].T)+bias) == -1):
                alpha[i] = alpha[i] + lr    #更新a
                bias = bias + lr * labels[i]  #更新b
                i = 0
            else:
                i += 1

        self.weights = sum(alpha * labels * data_set)
        #print(self.weights)
        self.bias = bias
        #print(self.bias)

    def predict(self, data):    # 判断W*x+b的正负
        data = np.array([data])
        if (self.weights is not None and self.bias is not None):
            return self.sign((self.weights * data.T) + self.bias)
        else:
            return 0

if __name__ == '__main__':

    data_set = [[3, 3],
                [4, 3],
                [1, 1]]
    labels = [1, 1, -1]
    perceptron = PerceptronDual()
    perceptron.train(data_set, labels)
    print("w=",perceptron.weights)
    print("b=",perceptron.bias)
    result = perceptron.predict([3, 3])
    print("判断结果:",result)

算法运行结果:

w= [[1. 1.]]
b= -3
判断结果: 1

 

 

本人水平有限,本博客只是个人学习的记录。其中,不免有许多不足和错误遗漏之处。希望读者在阅读学习的过程中有任何疑问或者希望本人改善的地方,请留言告知。谢谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值