感知器算法python实现

import numpy as np
import math
import random


class Perceptron:

    def __init__(self, data, train_ratio=0.9):
        self.W = None
        self.b = None
        self.data = data
        self.train_X = None
        self.train_Y = None
        self.validation_X = None
        self.validation_Y = None
        self.derivative_list = []
        self.train_ratio = train_ratio
        self.TrainValidationSplit()

    # 感知器训练函数
    def fit(self,epochs=100):
        num_samples, num_features = self.train_X.shape
        self.W = np.zeros(num_features)
        self.b = 0
        W_ = np.hstack((self.W, self.b))

        for _ in range(epochs):
            for i, x_i in enumerate(self.train_X):
                X_ = np.dot(self.train_Y[i], np.hstack((x_i, 1)))
                condition = np.dot(W_, X_)+self.b
                # print(i,':',condition)
                if condition<=0:
                    W_=W_+X_
                else:
                    pass
        
        self.W=W_[:-1]
        self.b=W_[-1]

        print('W:', self.W)
        print('b:', self.b)
        print('accuracy:    ', self.Accuracy())

    # 训练集&测试机划分
    def TrainValidationSplit(self):
        # 生成随机数列表
        row, col = self.data.shape
        numbers = list(range(row))
        # 根据比例确定每组的大小
        train_size = int(row*self.train_ratio)
        # 随机从数字列表中抽取数字来构建两组
        train_list = random.sample(numbers, train_size)
        validation_list = [num for num in numbers if num not in train_list]
        train_set = np.array([]).reshape(0, col)
        validation_set = np.array([]).reshape(0, col)
        # 划分训练集与数据集
        for i in train_list:
            train_set = np.vstack((train_set, self.data[i]))
        for i in validation_list:
            validation_set = np.vstack((validation_set, self.data[i]))
        # 截取训练集&验证集的X和Y
        self.train_X = train_set[:, 0:-1]
        self.train_Y = train_set[:, -1]
        self.validation_X = validation_set[:, 0:-1]
        self.validation_Y = validation_set[:, -1]

    # 预测函数
    def Predict(self, X):
        linear_output = np.dot(X, self.W) - self.b
        return np.sign(linear_output)

    # 准确率计算函数
    def Accuracy(self):
        sum = self.validation_X.shape[0]
        cnt = 0
        for i in range(sum):
            if self.Predict(self.validation_X[i]) == np.sign(self.validation_Y[i]):
                cnt += 1
        return cnt/sum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感知器算法是一种二分类的线性分类算法,它的基本思想是通过对输入特征进行加权求和,然后通过一个阈值函数将结果映射到一个二元输出。它在机器学习领域有着重要的地位,是神经网络的基础模型之一。 下面是一个简单的感知器算法Python实现: ``` import numpy as np class Perceptron: def __init__(self, learning_rate=0.1, n_iterations=100): self.learning_rate = learning_rate self.n_iterations = n_iterations def fit(self, X, y): n_samples, n_features = X.shape self.weights = np.zeros(n_features) self.bias = 0 # 训练感知器 for _ in range(self.n_iterations): for i in range(n_samples): # 计算输出 linear_output = np.dot(X[i], self.weights) + self.bias y_predicted = self.activation(linear_output) # 更新权重和偏差 update = self.learning_rate * (y[i] - y_predicted) self.weights += update * X[i] self.bias += update def predict(self, X): # 预测输出 linear_output = np.dot(X, self.weights) + self.bias y_predicted = self.activation(linear_output) return y_predicted def activation(self, x): # 阶跃函数 return np.where(x >= 0, 1, 0) ``` 这里我们使用了NumPy库来进行向量化计算,提高了效率。在训练感知器时,我们使用了随机梯度下降算法来更新权重和偏差。在预测时,我们使用了阶跃函数作为激活函数。使用该类的示例如下: ``` X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([0, 0, 0, 1]) model = Perceptron() model.fit(X, y) print(model.predict(X)) ``` 输出结果为:[0 0 0 1],说明感知器算法能够正确地进行二分类任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值