当前位置: 首页 > news >正文

机器学习 - 感知机(Perceptron)

摘要:感知机是最早的神经网络模型,由罗森布拉特于1950年代提出。它通过输入特征的加权和与阈值函数实现二元分类,属于监督学习算法。感知机由输入层、权重层和输出层组成,使用阶跃函数作为激活函数。训练过程通过迭代更新权重来最小化误差,权重调整公式为wi += α(y-y')xi。Python实现可使用scikit-learn库或自定义类,后者通过阶跃函数完成逻辑运算。感知机简单有效,适合二元分类问题,为后续神经网络发展奠定了基础。

目录

机器学习 - 感知机(Perceptron)

感知机的架构

感知机的训练

示例:Python 实现感知机

方法一:使用 scikit-learn 库

输出结果

说明

方法二:自定义感知机类(基于阶跃函数)

输出结果

说明

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


机器学习 - 感知机(Perceptron)

感知机(Perceptron)是最古老、最简单的神经网络架构之一,由弗兰克・罗森布拉特(Frank Rosenblatt)于 20 世纪 50 年代发明。感知机算法是一种线性分类器,能将输入数据划分为两个可能的输出类别之一,属于监督学习的一种 —— 通过提供带标签的训练数据来训练模型。该算法基于阈值函数工作:先计算输入特征的加权和,再对其应用阈值以生成二元输出。

感知机的架构

单层感知机由输入层、权重层和输出层组成:

  • 输入层的每个节点与权重层的每个节点相连,每条连接都分配有一个权重;
  • 权重层的每个节点先计算输入特征的加权和,再通过阈值函数生成输出。

感知机中使用的阈值函数是赫维赛德阶跃函数(Heaviside step function):当输入大于或等于 0 时返回二元值 1,否则返回 0。权重层每个节点的输出由以下公式确定:若其他情况其中:

  • y 为输出结果;
  • x1​,x2​,...,xn​ 为输入特征;
  • w0​,w1​,w2​,...,wn​ 为对应的权重;
  • ≥0 表示赫维赛德阶跃函数的判断条件。

感知机的训练

感知机算法的训练过程是迭代更新权重的过程,直到模型收敛到一组能正确分类所有训练样本的权重。具体步骤如下:

  1. 初始化权重:将所有权重设为随机值;
  2. 误差计算与权重更新:对每个训练样本,将预测输出与实际输出进行对比,根据误差调整权重以最小化偏差。

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

其中:

  • wi​ 为第i个特征的权重;
  • α 为学习率(learning rate);
  • y 为实际输出;
  • y′ 为预测输出;
  • xi​ 为第i个输入特征。

示例:Python 实现感知机

感知机可通过 scikit-learn 库快速实现,该库提供了专门用于二元分类问题的Perceptron类。以下是具体实现示例:

方法一:使用 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 # 加载鸢尾花数据集 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
说明

训练完成后,感知机可用于新输入数据的预测:给定一组输入值,感知机先计算输入特征的加权和,再对该和应用激活函数得到输出值,该输出值即为对应输入的分类预测结果。

方法二:自定义感知机类(基于阶跃函数)

以下是手动实现感知机的示例,使用阶跃函数作为激活函数:

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。该函数的核心优势是能提供二元输出,完美适配二元分类问题的预测需求 —— 输出结果可直接解释为两个类别之一(如 “是 / 否”“正 / 负”)。

http://www.jsqmd.com/news/343146/

相关文章:

  • 面试官:“聊聊你最复杂的项目?” 别傻傻报流水账,用这套“3D解构法”降维打击
  • wpf之行为
  • Docker安装部署OpenClaw
  • 大数据毕设项目:基于Python+Echart的学生心理健康数据可视化系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【无线充电车辆路线和速度预测】使用随机搜索优化方法同时具有路由和速度分配的模型研究附Matlab代码
  • 2026年休闲食品品牌推荐榜单:基于健康指标的选购指南 - Top品牌推荐
  • MAF快速入门(14)快速集成A2A Agent
  • 腾讯二面:1亿玩家实时排名,我答“Redis分桶”被挂!面试官:钻石局5000万人,你那个桶早炸了!
  • 【无线传感器网络】LEACH和LEACH-C协议研究附Matlab代码
  • 基于PageIndex的文档问答
  • P1941 [NOIP 2014 提高组] 飞扬的小鸟
  • Git与GitHub:深度解析与实用指南
  • TCP三次握手和四次断开 - 指南
  • 大数据计算机毕设之基于Python+Echart的学生心理健康数据可视化系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • OpenClaw/Memu/Nanobot
  • 【报告】东鹏饮料印尼落子:2亿美元携手华商巨头,共筑出海桥头堡
  • 在Docker中运行OpenClaw
  • GJ504b 的 React 进阶之路:Day 4
  • 【无线传感器网络】多级动态优化智能LEACH与成本效益深度信念网络附Matlab代码
  • 任何东西都可以转成 Base64!?
  • spring6-注解式开发
  • CodeChef - TREEQUER
  • AI应用开发从入门到精通:打破“调接口”误区,收藏这一篇就够了!
  • 【无人机协同路径规划】基于六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划研究(可以自定义无人机数量及起始点)附Matlab代码
  • 大模型Agent应用开发教程(非常详细),手把手教你从零构建智能体!
  • 从 synchronized 到 ConcurrentHashMap:一个小小的并发控制策略升级优化,证明我还是初级程序员
  • Claude Code生成UI的3个技巧
  • 【无人水面艇】USV路径跟踪LOS控制算法仿真附Matlab代码
  • Java面试早就不问八股文了!都是面试场景题,没做过根本回答不上来!
  • SQL性能优化秘籍:速度与简洁兼得