摘要:感知机是最早的神经网络模型,由罗森布拉特于1950年代提出。它通过输入特征的加权和与阈值函数实现二元分类,属于监督学习算法。感知机由输入层、权重层和输出层组成,使用阶跃函数作为激活函数。训练过程通过迭代更新权重来最小化误差,权重调整公式为wi += α(y-y')xi。Python实现可使用scikit-learn库或自定义类,后者通过阶跃函数完成逻辑运算。感知机简单有效,适合二元分类问题,为后续神经网络发展奠定了基础。
目录
[机器学习 - 感知机(Perceptron)](#机器学习 - 感知机(Perceptron))
[示例:Python 实现感知机](#示例:Python 实现感知机)
[方法一:使用 scikit-learn 库](#方法一:使用 scikit-learn 库)
机器学习 - 感知机(Perceptron)
感知机(Perceptron)是最古老、最简单的神经网络架构之一,由弗兰克・罗森布拉特(Frank Rosenblatt)于 20 世纪 50 年代发明。感知机算法是一种线性分类器,能将输入数据划分为两个可能的输出类别之一,属于监督学习的一种 ------ 通过提供带标签的训练数据来训练模型。该算法基于阈值函数工作:先计算输入特征的加权和,再对其应用阈值以生成二元输出。
感知机的架构
单层感知机由输入层、权重层和输出层组成:
- 输入层的每个节点与权重层的每个节点相连,每条连接都分配有一个权重;
- 权重层的每个节点先计算输入特征的加权和,再通过阈值函数生成输出。
感知机中使用的阈值函数是赫维赛德阶跃函数(Heaviside step function):当输入大于或等于 0 时返回二元值 1,否则返回 0。权重层每个节点的输出由以下公式确定:若其他情况其中:

- y 为输出结果;
- x1,x2,...,xn 为输入特征;
- w0,w1,w2,...,wn 为对应的权重;
- ≥0 表示赫维赛德阶跃函数的判断条件。
感知机的训练
感知机算法的训练过程是迭代更新权重的过程,直到模型收敛到一组能正确分类所有训练样本的权重。具体步骤如下:
- 初始化权重:将所有权重设为随机值;
- 误差计算与权重更新:对每个训练样本,将预测输出与实际输出进行对比,根据误差调整权重以最小化偏差。
感知机的权重更新规则如下:
其中:
- wi 为第i个特征的权重;
- α 为学习率(learning rate);
- y 为实际输出;
- y′ 为预测输出;
- xi 为第i个输入特征。
示例:Python 实现感知机
感知机可通过 scikit-learn 库快速实现,该库提供了专门用于二元分类问题的 Perceptron 类。以下是具体实现示例:
方法一:使用 scikit-learn 库
python
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
# 加载鸢尾花数据集
iris = load_iris()
# 划分训练集和测试集(测试集占比30%)
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0)
# 创建感知机对象,设置学习率为0.1
perceptron = Perceptron(alpha=0.1)
# 在训练集上训练感知机
perceptron.fit(X_train, y_train)
# 使用训练好的感知机对测试集进行预测
y_pred = perceptron.predict(X_test)
# 评估感知机的准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率(Accuracy):", accuracy)
输出结果
plaintext
准确率(Accuracy): 0.8
说明
训练完成后,感知机可用于新输入数据的预测:给定一组输入值,感知机先计算输入特征的加权和,再对该和应用激活函数得到输出值,该输出值即为对应输入的分类预测结果。
方法二:自定义感知机类(基于阶跃函数)
以下是手动实现感知机的示例,使用阶跃函数作为激活函数:
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 # 权重(初始化为None)
self.bias = None # 偏置(初始化为None)
# 阶跃函数:激活函数
def step_function(self, x):
return np.where(x >= 0, 1, 0) # x≥0返回1,否则返回0
# 训练方法:输入特征X,目标标签y
def fit(self, X, y):
n_samples, n_features = X.shape # 获取样本数量和特征数量
# 初始化权重为0,偏置为0
self.weights = np.zeros(n_features)
self.bias = 0
# 迭代训练(按轮次更新权重和偏置)
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 = self.learning_rate * (y[i] - y_pred)
self.weights += update * X[i]
self.bias += update
# 预测方法:输入特征X,返回预测结果
def predict(self, X):
linear_output = np.dot(X, self.weights) + self.bias
y_pred = self.step_function(linear_output)
return y_pred
# 测试自定义感知机
if __name__ == "__main__":
# 输入数据(二元特征)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
# 目标标签(对应逻辑与运算)
y = np.array([0, 0, 0, 1])
# 创建感知机实例(学习率0.1,训练轮次10)
perceptron = Perceptron(learning_rate=0.1, epochs=10)
# 训练模型
perceptron.fit(X, y)
# 测试数据
test_data = np.array([[1, 1], [0, 1]])
# 预测
predictions = perceptron.predict(test_data)
print("预测结果:", predictions)
输出结果
plaintext
预测结果: [1 0]
说明
该自定义感知机实现了逻辑与运算的分类:输入 [1,1] 预测为 1,输入 [0,1] 预测为 0,符合预期结果。
阶跃函数在感知机训练中的作用
感知机中使用的激活函数可灵活选择,但阶跃函数是最常用的一种:它在输入为正时返回 1,输入为负或 0 时返回 0。该函数的核心优势是能提供二元输出,完美适配二元分类问题的预测需求 ------ 输出结果可直接解释为两个类别之一(如 "是 / 否""正 / 负")。