感知机学习算法的原始形式及其Python实现

1 描述

(1)模型:

在这里插入图片描述
其中 w * x 表示 w 与 x 的内积,sign 为符号函数,当 w * x + b >= 0时,为 1,否则为 -1。

(2)策略:

损失函数:
在这里插入图片描述
其中 M 为误分类点的集合。

(3)算法:

在这里插入图片描述
因此将问题转化为通过调节参数 w, b使得损失函数极小化,从而使得 M 中没有误分类的点。

2 思路

(1)选取初值w,b
(2)在训练集中选取数据(x,y)
(3)如果y(w * x + b)<= 0,利用随机梯度下降算法更新w,b
         梯度可以通过对损失函数分别对w,b求偏导可得。
         w = w + lr · y · x; b = b + lr · y(lr 为学习率)
(4)转至(2)直到 M 为空

3 实现

import numpy as np
import matplotlib.pyplot as plt

# 感知机学习算法的原始形式
# 输入T={(x1, y1), (x2, y2), (x3, y3)}, y属于{1,-1};学习率为lr
# 输出w, b; 感知机模型 f(x)=sign(w*x+b) 其中w*x表示w与x的内积
# sign为符号函数,当w*x+b>=0时,为1,否则为-1
def Perceptron_orgin():
    # 训练集
    x1 = np.array([3, 3], ndmin=2).T
    x2 = np.array([4, 3], ndmin=2).T
    x3 = np.array([1, 1], ndmin=2).T
    input = [x1, x2, x3]
    targets = [1, 1, -1]

    # 初始化w,b,lr
    w = np.zeros(2).reshape(1, 2)
    b = 0
    lr = 1

    while True:
        num_errors = 0
        for i in range(3):
            # 判断是否误分类
            if targets[i] * (np.dot(w, input[i])[0][0] + b) <= 0:
                # 利用随机梯度下降算法,更新w,b
                w += lr * targets[i] * input[i].T
                b += lr * targets[i]
                # 误分类个数加1
                num_errors += 1
                
        # M中为空训练结束
        if num_errors == 0:
            print(w, b)
            break
    
    # 画出超平面(二维中即一条直线)
    x = np.random.rand(10)*5
    y = -(w[0][0] / w[0][1]) * x - b / w[0][1]
    plt.plot(x, y, 'g')
    # 画出训练集中的点
    plt.scatter(x1[0, 0], x1[1, 0], c='r')
    plt.scatter(x2[0, 0], x2[1, 0], c='r')
    plt.scatter(x3[0, 0], x3[1, 0], c='b')
    plt.show()

if __name__ == '__main__':
    Perceptron_orgin()

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