机器学习经典算法:感知机PLA

机器学习常见模型(面试必备)

第一篇:感知机模型



一、感知机概述

1.1 感知机必备知识

  • 针对:二分类问题
  • 实质:分离超平面,是一个判别模型
  • 策略:基于误分类的损失函数
  • 方法:利用梯度下降对损失函数进行极小化
  • 特点:简单易实现
  • 分类:原始形式,对偶形式

1.2 原始感知机

  • 输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1, y_1), (x_2, y_2), ... , (x_N, y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 X i ∈ R n X_i\in R^n XiRn y i ∈ y = { − 1 , + 1 } y_i \in y=\{-1, +1\} yiy={1,+1} i = 1 , 2 , . . . , N i=1, 2, ... , N i=1,2,...,N,学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta \leq 1) η(0<η1)

  • 输出: w w w b b b;模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w \cdot x+b) f(x)=sign(wx+b)
       1、选取初始值 w 0 w_0 w0 b 0 b_0 b0
       2、在训练集中选取数据 ( x i , y i ) (x_i, y_i) (xi,yi)
       3、如果 y i ( w ⋅ x + b ) ≤ 0 y_i(w \cdot x+b) \leq 0 yi(wx+b)0,则 w = w + η y i x i w=w+\eta y_i x_i w=w+ηyixi;$b=b+\eta y_i $;
       4、转至 2 ,直到训练集中没有误分类点。

1.3 对偶感知机

  • 假设样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 在整个更新过程中被误分类 n i n_i ni 次,那么权重更新公式更改为: w = ∑ i = 1 N n i η y i x i w=\sum\limits_{i = 1 }^N n_i \eta y_i x_i w=i=1Nniηyixi b = ∑ i = 1 N n i η y i b=\sum\limits_{i = 1 }^N n_i \eta y_i b=i=1Nniηyi。那么模型函数为: f ( x ) = s i g n ( ∑ i = 1 N n i η y i x i ⋅ x + ∑ i = 1 N n i η y i ) f(x)=sign(\sum\limits_{i = 1 }^N n_i \eta y_i x_i \cdot x+ \sum\limits_{i = 1 }^N n_i \eta y_i ) f(x)=sign(i=1Nniηyixix+i=1Nniηyi)

  • 按照新的权重更新方式,直到训练集中没有误分类点。

二、Python编程实现感知机

  • 准备数据集
  • 模型训练
  • 效果测试
  • 可视化展示
import numpy as np
import random
import matplotlib.pyplot as plt

# sign function
def sign(v):
    if v > 0:
        return 1
    else:
        return -1

# train function to get weight and bias
def training():
    train_data1 = [[1, 3, 1], [2, 5, 1], [3, 8, 1], [2, 6, 1]]  # positive sample
    train_data2 = [[3, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]  # negative sample
    train_data = train_data1 + train_data2;

    weight = [0, 0]
    bias = 0
    learning_rate = 0.1

    train_num = int(input("train num:"))

    for i in range(train_num):
        train = random.choice(train_data)
        x1, x2, y = train;
        y_predict = sign(weight[0] * x1 + weight[1] * x2 + bias)
        print("train data:x:(%d, %d) y:%d ==>y_predict:%d" % (x1, x2, y, y_predict))
        if y * y_predict <= 0:
            weight[0] = weight[0] + learning_rate * y * x1
            weight[1] = weight[1] + learning_rate * y * x2
            bias = bias + learning_rate * y
            print("update weight and bias:")
            print(weight[0], weight[1], bias)
    print("stop training :")
    print(weight[0], weight[1], bias)

    # plot the train data and the hyper curve
    plt.plot(np.array(train_data1)[:, 0], np.array(train_data1)[:, 1], 'ro')
    plt.plot(np.array(train_data2)[:, 0], np.array(train_data2)[:, 1], 'bo')
    x_1 = []
    x_2 = []
    for i in range(-10, 10):
        x_1.append(i)
        x_2.append((-weight[0] * i - bias) / weight[1])
    plt.plot(x_1, x_2)
    plt.show()

    return weight, bias


# test function to predict
def test():
    weight, bias = training()
    while True:
        test_data = []
        data = input("enter q to quit,enter test data (x1, x2):")
        if data == 'q':
            break
        test_data += [int(n) for n in data.split(',')]
        predict = sign(weight[0] * test_data[0] + weight[1] * test_data[1] + bias)
        print("predict==>%d" % predict)
        
if __name__ == "__main__":
    test()

三、参考资料

案例参考

总结

   感知机算法到这里就结束了,望大家多多指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想拯救世界_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值