感知机(代码实现)

方法一:损失函数L(ω,b)=−sum(yi * (ω * xi + b))

import numpy as np


def perceptron(xi, yi):
    res, leaning_rate, b, w = [], 0.1, 0, np.array([0.5, 0.5])  # res:存储算得的预测值 b:偏置项  w:x的权重
    # np.sign(np.dot(w, xi) + b)  # 激活函数,输出结果为{-1, +1}, -1为假, +1为真
    for i in range(len(yi)):
        if yi[i] * (np.dot(w, xi[i]) + b) <= 0:
            w += leaning_rate * yi[i] * xi[i]  # 对w进行更新
            b += leaning_rate * yi[i]          # 对b进行更新
    for j in range(len(xi)):
        y = np.sign(np.dot(w, xi[j]) + b)
        res.append(y)
    print(f"梯度下降后的权重:{w}, 梯度下降后的偏置项:{b}, 梯度下降后的输出值:{res}")


def AND():  # and运算
    x = np.array([[-1, -1], [-1, 1], [1, -1], [1, 1]])  # -1为假  1为真
    y = np.array([-1, -1, -1, 1])
    return [x, y]


perceptron(AND()[0], AND()[1])

运行结果:
梯度下降后的权重:[0.5 0.5], 梯度下降后的偏置项:-0.2, 梯度下降后的输出值:[-1.0, -1.0, -1.0, 1.0]

方法二:损失函数L(ω,b)=−0.5 * sum((ω * xi + b - yi)**2)

# 方法二
import numpy as np


def perceptron(xi, yi):
    count, res, leaning_rate, b, w = 0, [], 0.0000001, 0, np.array([0.5, 0.5])  # b:偏置项  w:x的权重
    # np.sign(np.dot(w, xi) + b)  # 激活函数,输出结果为{-1, +1}, -1为假, +1为真
    for i in range(len(yi)):
        while count < 1000000:
            J = (1 / 2) * (np.dot(w, xi[i]) + b - yi[i]) ** 2
            w += leaning_rate * (np.dot(w, xi[i]) + b - yi[i]) * xi[i]
            b += leaning_rate * (np.dot(w, xi[i]) + b - yi[i])
            if (J - (1 / 2) * (np.dot(w, xi[i]) + b - yi[i]) ** 2).all() == 0 and \
                    ((np.dot(w, xi[i]) + b - yi[i]) * xi[i]).all() == 0 \
                    and (np.dot(w, xi[i]) + b - yi[i]).all() == 0 and np.sign(np.dot(w, xi[i]) + b) * yi[i] == 1:
                break
            count += 1
    for j in range(len(xi)):
        y = np.sign(np.dot(w, xi[j]) + b)
        res.append(y)
    print(f"梯度下降后的权重:{w}, 梯度下降后的偏置项:{b}, 梯度下降后的输出值:{res}")


def AND():  # and运算
    x = np.array([[-1, -1], [-1, 1], [1, -1], [1, 1]])  # -1为假  1为真
    y = np.array([-1, -1, -1, 1])
    return [x, y]


perceptron(AND()[0], AND()[1])

运行结果:
梯度下降后的权重w:[0.38338042, 0.61661958]
梯度下降后的偏置项b:0.11661960682579162
梯度下降后的输出值:[-1.0, 1.0, -1.0, 1.0]----结果依旧存在误差

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值