从零开始在Python中实现感知器

嗨,开发者们,

感知器是机器学习中最简单和最基本的概念之一。它是一种二元线性分类器,是神经网络的基础。在这篇文章中,我将逐步讲解如何从零开始在Python中理解和实现感知器。

让我们开始吧!


什么是感知器?

感知器是一种用于二元分类器的监督学习基本算法。给定输入特征,感知器学习权重,以帮助根据简单的阈值函数分离类别。以下是其简单工作原理:

  1. 输入:特征向量(例如,[x1, x2])。
  2. 权重:每个输入特征都有一个权重,模型根据其性能调整这些权重。
  3. 激活函数:计算输入特征的加权和,并应用阈值来决定结果属于哪个类别。

在数学上,它看起来像这样:

f(x) = w1*x1 + w2*x2 + … + wn*xn + b

其中:

  • f(x)是输出,
  • w表示权重,
  • x表示输入特征,
  • b是偏置项。

如果 f(x) 大于或等于一个阈值,则输出为类别 1;否则,输出为类别 0。


第一步:导入库

我们这里只使用 NumPy 进行矩阵运算,以保持轻量级。

import numpy as np

第二步:定义感知器类

我们将把感知器构建为一个类,以保持一切有序。该类将包括用于训练和预测的方法。

class Perceptron:
    def __init__(self, learning_rate=0.01, epochs=1000):
        self.learning_rate = learning_rate
        self.epochs = epochs
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        # 样本数量和特征数量
        n_samples, n_features = X.shape
        # 初始化权重和偏置
        self.weights = np.zeros(n_features)
        self.bias = 0
        # 训练
        for _ in range(self.epochs):
            for idx, x_i in enumerate(X):
                # 计算线性输出
                linear_output = np.dot(x_i, self.weights) + self.bias
                # 应用阶跃函数
                y_predicted = self._step_function(linear_output)
                # 如果发生误分类,则更新权重和偏置
                if y[idx] != y_predicted:
                    update = self.learning_rate * (y[idx] - 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._step_function(linear_output)
        return y_predicted

def _step_function(self, x):
        return np.where(x >= 0, 1, 0)

在上面的代码中:

    • fit:该方法通过调整权重和偏差来训练模型,每当模型错误分类一个点时就进行调整。
    • predict:该方法对新数据进行预测计算。
    • _step_function:该函数应用阈值来确定输出类别。

第3步:准备一个简单的数据集

我们将使用一个小数据集,以便于可视化输出。以下是一个简单的与门数据集:

# 与门数据集
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])  # 与门的标签

第4步:训练和测试感知器

现在,让我们训练感知器并测试其预测结果。

# 初始化感知器
p = Perceptron(learning_rate=0.1, epochs=10)
# 训练模型
p.fit(X, y)
# 测试模型
print("预测结果:", p.predict(X))
与门的预期输出:

预测结果: [0 0 0 1]


感知器学习过程的解释

  1. 初始化权重和偏置:在开始时,权重被设置为零,这使得模型能够从头开始学习。
  2. 计算线性输出:对于每个数据点,感知器计算输入的加权和加上偏置。
  3. 激活(阶跃函数):如果线性输出大于或等于零,则分配类1;否则,分配类0。
  4. 更新规则:如果预测不正确,模型会调整权重和偏置,以减少误差的方向。更新规则如下:权重 += 学习率 * (真实值 – 预测值) * 输入

这使得感知器仅对错误分类的点进行更新,逐渐将模型推向正确的决策边界。


可视化决策边界

在训练后可视化决策边界。这在处理更复杂的数据集时尤其有帮助。在上面,我们使用了简单的与门。


扩展到多层感知器(MLPs)

虽然感知器仅限于线性可分问题,但它是更复杂的神经网络(如多层感知器(MLPs))的基础。在MLPs中,我们添加隐藏层和激活函数(如ReLU或Sigmoid)来解决非线性问题。


总结

感知器是一个简单但基础的机器学习算法。通过理解它的工作原理并从零实现,我们可以深入了解机器学习和神经网络的基础。感知器的美在于其简单性,使其成为任何对人工智能感兴趣的人的完美起点。

更多