python实现感知机算法

# coding=UTF-8
import numpy as np


class perceptron(object):
    """
    参数:
    --------------
    eta: float
        学习率,在 0.0 到 1.0 之间
    n_iter: int
        学习次数
    random_state: int
        控制随机状态,用于控制初始化时的随机数种子

    属性:
    ---------------
    w_: ld-array
        拟合后的权重矩阵
    errors_: list
        每轮中错误分类次数
    """
    def __init__(self, eta=0.02, n_iter=50, random_state=1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state
        self.w_ = []
        self.erors_ = []

    def fit(self, x, y):
        x = np.array(x)
        y = np.array(y)
        # 随机数生成器
        container = np.random.RandomState(self.random_state)
        # 随机初始化一个符合正态分布的权重矩阵
        self.w_ = container.normal(loc=0, scale=0.01, size=1 + x.shape[1])
        # 梯度下降更新公式:
        # w <- w + eta * (y-yi) * xi
        # b <- b + eta * (y-yi)
        for _ in range(self.n_iter):
            error = 0
            for xi, target in zip(x, y):
                # 误差值
                loss = target - self.predict(xi)
                # 更新值
                update = self.eta * loss
                self.w_[1:] += update * xi
                self.w_[0] += update
                # 达到最优解的次数
                error += int(update != 0)
            self.erors_.append(error)
        return self

    # 计算点积
    def dot(self, x):
        return np.dot(x, self.w_[1:]) + self.w_[0]

    # 对当前点进行预测
    def predict(self, x):
        return np.where(self.dot(x) >= 0, 1, -1)


if __name__ == '__main__':
    x1 = [[1, 0, 1], [0, 1, 1], [2, 0, 1], [2, 2, 1], [-1, -1, 1], [-1, 0, 1], [-2, -1, 1], [0, -2, 1]]
    x2 = [1, 1, 1, 1, -1, -1, -1, -1]
    p = perceptron()
    p.fit(x1, x2)
    print(p.w_)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

羽路星尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值