机器学习 - 感知机



感知机是最古老和最简单的神经网络架构之一。它由弗兰克·罗森布拉特于 20 世纪 50 年代发明。感知机算法是一种线性分类器,可将输入分类为两个可能的输出类别之一。它是一种监督学习类型,通过提供标记的训练数据来训练模型。感知机算法基于阈值函数,该函数取输入的加权和并应用阈值以生成二进制输出。

感知机的架构

单层感知机由输入层、权重层和输出层组成。输入层中的每个节点都连接到权重层中的每个节点,每个连接都分配了一个权重。权重层中的每个节点计算输入的加权和,并应用阈值函数来生成输出。

感知机中的阈值函数是海维赛德阶跃函数,如果输入大于或等于零,则返回二进制值 1,否则返回 0。权重层中每个节点的输出由以下公式确定:

$$y=\left\{\begin{matrix} 1; & if\: w_{0}+w_{1}x_{1}+w_{2}x_{2}+\cdot \cdot \cdot +w_{n}x_{n}\: > = 0 \\ 0; & otherwise \\ \end{matrix}\right.$$

其中“y”是输出,x1、x2、...、xn是输入特征;w0、w1、w2、...、wn是相应的权重,>= 0 表示海维赛德阶跃函数。

感知机的训练

感知机算法的训练过程涉及迭代更新权重,直到模型收敛到一组权重,这些权重可以正确地对所有训练示例进行分类。最初,权重设置为随机值。对于每个训练示例,将预测输出与实际输出进行比较,并相应地更新权重以最小化误差。

感知机中的权重更新规则如下:

$$w_{i}=w_{i}+\alpha \times \left ( y-y' \right )\times x_{i}$$

其中Wi是第i个特征的权重,$\alpha$是学习率,y是实际输出,y′是预测输出,xi是第i个输入特征。

使用Python实现感知机

使用scikit-learn库在Python中实现了感知机算法。scikit-learn库提供了一个Perceptron类,可用于二元分类问题。

以下是在Python中使用scikit-learn实现感知机算法的示例:

示例

from sklearn.linear_model import Perceptron
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Load the iris dataset
iris = load_iris()

# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0)

# Create a Perceptron object with a learning rate of 0.1
perceptron = Perceptron(alpha=0.1)

# Train the Perceptron on the training data
perceptron.fit(X_train, y_train)

# Use the trained Perceptron to make predictions on the testing data
y_pred = perceptron.predict(X_test)

# Evaluate the accuracy of the Perceptron
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

输出

执行此代码时,将生成以下输出:

Accuracy: 0.8

训练感知机后,可将其用于对新输入数据进行预测。给定一组输入值,感知机计算输入的加权和,并将激活函数应用于该和以获得输出值。然后可以将此输出值解释为对应输入的预测。

阶跃函数在感知机训练中的作用

感知机中使用的激活函数可能会有所不同,但常见的选择是阶跃函数。如果输入为正,则阶跃函数返回 1;如果输入为负或零,则返回 0。此函数很有用,因为它提供二进制输出,可以将其解释为二元分类问题的预测。

以下是在Python中使用阶跃函数作为激活函数实现感知机的示例:

import numpy as np

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

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

   def fit(self, X, y):
      n_samples, n_features = X.shape

      # initialize weights and bias to 0
      self.weights = np.zeros(n_features)
      self.bias = 0

      # iterate over epochs and update weights and bias
      for _ in range(self.epochs):
         for i in range(n_samples):
            linear_output = np.dot(self.weights, X[i]) + self.bias
            y_pred = self.step_function(linear_output)

            # update weights and bias based on error
            update = self.learning_rate * (y[i] - y_pred)
            self.weights += update * X[i]
            self.bias += update
   
   def predict(self, X):
      linear_output = np.dot(X, self.weights) + self.bias
      y_pred = self.step_function(linear_output)
      return y_pred

在此实现中,Perceptron类采用两个参数:learning_rate和epochs。fit方法使用输入数据X和相应的目标值y训练感知机。predict方法采用输入数据数组并返回预测的输出值。

要使用此实现,我们可以创建一个Perceptron类的实例并调用fit方法来训练模型:

X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])

perceptron = Perceptron(learning_rate=0.1, epochs=10)
perceptron.fit(X, y)

训练模型后,我们可以使用predict方法对新输入数据进行预测:

test_data = np.array([[1, 1], [0, 1]])
predictions = perceptron.predict(test_data)
print(predictions)

此代码的输出为[1, 0],它们是输入数据[[1, 1], [0, 1]]的预测值。

广告