深度学习之感知器的python实现,及用感知器实现鸢尾花的分类

2023-11-16

机器学习一般用来处理结构化的数据,深度学习一般用来处理非结构化的数据,例如图像、视频、文字等。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
权重更新过程: 如果真实是1,预测是0,则权重会增加,相当于为了达到阈值增加权重
如果真实是0,预测是1,则权重会降低,相当于为了达到阈值减少权重

实现步骤

  • 对权重进行初始化。(初始化为0或者很小的数值。)
  • 对训练集中每一个样本进行迭代,计算输出值y。
  • 根据输出值y与真实值,更新权重。
  • 循环步骤2。直到达到指定的次数(或者完全收敛)。

说明:
如果两个类别线性可分,则感知器一定会收敛。
如果两个类别线性不可分,则感知器一定不会收敛。

在这里插入图片描述

实现与门:

import numpy as np
# 定义数据集
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
# 定义标签(每个样本所属的分类)。
y = np.array([0, 0, 0, 1])
# 定义权重。对于单层感知器,权重通常初始化为0或者很小的数值。
# w = np.zeros(3)
w = np.random.random(3)
# 定义学习率。
eta = 0.1

for epoch in range(6):
    for x, target in zip(X, y):
        # 计算净输入 
        z = np.dot(w, x)
        # 根据净输入,计算分类值。
        y_hat = 1 if z >= 0 else 0
        # 根据预测值与真实值,进行权重调整。
        w = w + eta * (target - y_hat) * x
        # 注意数组的矢量化计算,相当于执行了以下的操作。
    #     w[0] = w[0] + eta * (y - y_hat) * x[0]
    #     w[1] = w[1] + eta * (y - y_hat) * x[1]
    #     w[2] = w[2] + eta * (y - y_hat) * x[2]
        print(target, y_hat)
        print(w)

在这里插入图片描述
线性可分,能收敛

在这里插入图片描述

在这里插入图片描述

# 使用单层感知器无法实现异或门。
# 感知器的局限:如果两个类别的样本在空间中线性不可分,则感知器永远也不会收敛。
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
y = np.array([0, 1, 1, 0])
# w = np.zeros(3)
w = np.random.random(3)
eta = 0.1

for epoch in range(70):
    for x, target in zip(X, y):
        z = np.dot(w, x)
        y_hat = 1 if z >= 0 else 0
        w = w + eta * (target - y_hat) * x
        print(target, y_hat)
        print(w)

算法的Python实现
现在,我们使用Python语言来实现感知器算法,进行鸢尾花的分类。

class Perceptron:
    """通过Python语言实现感知器类。用来进行二分类任务。"""
    
    def __init__(self, eta, epoch):
        """初始化方法。
        
        Parameter:
        -------
        eta: float
            学习率。
        epoch: int
            对训练集训练的轮数。
        """
        self.eta = eta
        self.epoch = epoch
        
    def step(self, z):
        """阶跃函数。对净输入进行转换。
        
        Parameter:
        -----
        z: 标量或数组类型
            净输入。
        
        Return:
        ------
        t: 变量或数组类型。
            分类的结果。0或者1。当z >= 0时,返回1,否则返回0。
        """
#         return 1 if z >= 0 else 0
        return np.where(z >= 0, 1, 0)
        
    def fit(self, X, y):
        """训练方法。
        
        Parameter:
        X: 类数组类型。形状为 (样本数量, 特征数量)
            提供的训练集。
        y: 类数组类型。形状为(样本数量,)
            样本对应的标签(分类)
        """
        # 对类型进行转换,不管是什么二维类型,统一转换成二维的ndarray数组类型。
        X = np.asarray(X)
        y = np.asarray(y)
        # 注意:权重的数量要比特征的数量多1。多出来的一个就是偏置。
        self.w_ = np.zeros(X.shape[1] + 1)
        # 定义损失列表。用来存放每个epoch迭代之后,分类错误的数量。
        self.loss_ = []
        # 迭代epoch指定的轮数。
        for i in range(self.epoch):
            # 用来记录单次epoch的损失值(分类错误的数量)
            loss = 0
            for x, target in zip(X, y):
                # 计算净输入
                z = np.dot(x, self.w_[1:]) + self.w_[0]
                # 根据净输入,计算分类。
                y_hat = self.step(z)
#                 if target != y_hat:
#                     loss += 1
                loss += target != y_hat
                # 调整权重
                self.w_[1:] += self.eta * (target - y_hat) * x
                # 调整偏置
                self.w_[0] += self.eta * (target - y_hat)
            # 将损失值加入到损失列表当中。 
            self.loss_.append(loss)
            
    def predict(self, X):
        """预测方法。根据提供的数据集X,返回每一个样本对应的标签(分类)。
        
        Parameter:
        -----
        X: 类数组类型。形状为 (样本数量, 特征数量)
            提供预测集。
            
        Return:
        -----
        label: 类数组类型。形状为:(样本数量,)
            预测的每一个便签分类。
        """
        X = np.asarray(X)
        # 计算净输入。(矢量化计算,没有使用循环分别对每一个样本求净输出)
        z = np.dot(X, self.w_[1:]) + self.w_[0]
        # 获取最终的分类结果。(一维数组类型。)
        result = self.step(z)
        return result


# 感知器类进行测试。
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
y = np.array([0, 0, 0, 1])
p = Perceptron(0.1, 7)
p.fit(X, y)
print(p.w_)
print(p.loss_)
# 使用感知器实现鸢尾花的分类。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd

# return_X_y设置为True,只返回Data与target。
X, y = load_iris(return_X_y=True)
# X.shape, y.shape
# np.concatenate 合并的数组,要求具有相同的维度,因此,需要将y变成
# 2维的形式。
data = pd.DataFrame(np.concatenate((X, y.reshape((-1, 1))), axis=1))
# np.sum(data.duplicated())
# display(data.shape)
data.drop_duplicates(inplace=True)
# display(data.shape)

# data[4].map({0:1, 1:-1, 2:2})
# data = data[data[4] != 2]
data[4] = data[4].map({0:10, 1:0, 2:1})
data = data[data[4] != 10]
data[4].value_counts()
# data[4].value_counts()
X, y = data.iloc[:, :4], data.iloc[:, 4]
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2, random_state=0)
# train_X.shape, test_X.shape
p = Perceptron(0.1, 20)
p.fit(train_X, train_y)
# 查看训练后的权重与损失情况。
# display(p.w_)
# display(p.loss_)
result = p.predict(test_X)
np.sum(test_y == result) / len(result)
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

plt.plot(test_y.values, "go", ms=15, label="真实值")
plt.plot(result, "rx", ms=15, label="预测值")
plt.title("感知器二分类预测")
plt.xlabel("样本序号")
plt.ylabel("样本类别")
plt.legend()
plt.show()

在这里插入图片描述

# 绘制损失曲线。(每个epoch预测样本错误的数量)
plt.plot(range(1, len(p.loss_) + 1), p.loss_, "o-")

在这里插入图片描述

split_index = test_size * len()
data[:split_index]  data[split_index:]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习之感知器的python实现,及用感知器实现鸢尾花的分类 的相关文章

  • JavaScript-1-100之间整数的和

    要求 求1 100之间整数的和 实现代码
  • 图像数据库

    ImageNet ImageNet是一个计算机视觉系统识别项目 是目前世界上图像识别最大的数据库 是美国斯坦福的计算机科学家李飞飞模拟人类的识别系统建立的 能够从图片识别物体 目前已经包含14197122张图像 是已知的最大的图像数据库 每
  • $(this).parent("tr").find("td").eq(0).text()

    this parent tr find td eq 0 text
  • 新年新气象---多数据源配置

    概述 2022年第一天 在这祝大家新年快乐 好运连连 事业爱情双丰收 本文主要是通过注解结合aop的方式实现多数据源的动态切换 一 配置文件 spring datasource type com alibaba druid pool Dru
  • 增强现实-实验一

    实验一 1 手工制作一个空间增强现实盒子 如示例所示 放置在平板或手机屏幕上 搭配应用实现立体投影效果 2 制作立体投影所需的视频 程序 unity 全息投影 伪 视频 盒子蛮好做的主要是视频 之前没接触过unity 研究了一番 首先设置四

随机推荐

  • 关于js操作cookie

    一 什么是cookie 我们在浏览器中 经常涉及到数据的交换 比如你登录邮箱 登录一个页面 我们经常会在此时设置30天内记住我 或者自动登录选项 那么它们是怎么记录信息的呢 答案就是今天的主角cookie了 Cookie是由HTTP服务器设
  • 修饰符-访问修饰符internal sealed

    摘自 internal C 参考 摘自 sealed C 参考 Internal 访问仅限于当前程序集 protected internal 访问限制到当前程序集或从包含派生的类型的类别 程序集就是代码编译后bin目录下生产的 exe或者
  • 16-DFS(深度优先搜索算法)

    DFS 深度优先算法 是常见的搜索算法 早期常用于需要搜索的地方 并且还拓展出很多其它算法 深度优先算法 DFS DFS 深度优先算法 是早期开发爬虫时常用的算法 它的搜索思路是从树根开始一直找直到找到树型数据结构的叶节点 以搜索一个节点数
  • 小程序iOS兼容问题总结

    1 IOS 上 JS 只支持 new Date YYYY MM DD 这一种格式 YYYY MM DD 等格式都不支持
  • Raft 一致性算法

    文章目录 1 CAP 定理 1 Raft 基本概念 2 Raft 算法核心 2 1 Leader 选举 2 2 日志复制 3 总结 1 CAP 定理 文章参考 lt 零声教育 gt 的C C linux服务期高级架构系统教程学习 服务器高级
  • POI框架导出EXCEL的简单列子(跨行跨列)合并单元格

    public static void main String args throws IOException try HSSFWorkbook wb new HSSFWorkbook HSSFSheet sheet wb createShe
  • 十八. Kubernetes Ingress

    目录 一 Ingress 基础解释 二 ingressController 安装 六 ingress 使用示例 pathType 详细 annotations 基于k8s注解为 nginx 添加功能示例 路径重写 Session Affin
  • (二)selenium IDE 插件下载与安装

    前面selenium已经下载安装成功 接下来尝试录制下脚本 此时有个IDE插件是必备的 1 下载Chrome插件 进入网址 https www extfans com 搜索 selenium IDE 然后下载 2 安装插件 打开Chrome
  • plsql 返回结果集的存储过程

    返回结果集的存储过程 1 创建一个包 在该包中定义了一个游标类型test corsor create or replace package testpackage as type test cursor is ref cursor end
  • Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

    在Linux系统中 SPI 的用户模式设备接口的驱动源码位于 drivers spi spidev c 在应用层生成 dev spidev 的节点 可以通过 read write 达到与硬件设备的 SPI 通信 下面介绍spidev驱动移植
  • js获取当前月、上一月和下一月

    获得当前月 function getNowMonth var date new Date var year date getFullYear var month date getMonth 1 month month gt 9 month
  • K8S 基础概念学习

    1 K8S 通过Deployment 实现滚动发布 比如左边的ReplicatSet 的 pod 中 是V1版本的镜像 Deployment通过 再启动一个 ReplicatSet 中启动 pod中 镜像就是V2 2 每个pod 中都有一个
  • 渗透测试工程师面试题大全(二)

    渗透测试工程师面试题大全 二 from backlion大佬 整理 51 sql 注入写文件都有哪些函数 1 select 一句话 into outfile 路径 2 select 一句话 into dumpfile 路径 3 select
  • 如何安装 IntelliJ IDEA 最新版本——详细教程

    IntelliJ IDEA 简称 IDEA 被业界公认为最好的 Java 集成开发工具 尤其在智能代码助手 代码自动提示 代码重构 代码版本管理 Git SVN Maven 单元测试 代码分析等方面有着亮眼的发挥 IDEA 产于捷克 开发人
  • Allure在自动化测试中的应用!

    01 Allure的简介及使用 1 应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件 生成美观易读的报告 目前支持Python Java PHP C 等语言 为dev QA 提供详尽的测试报告 测试步骤
  • 微信小程序实现视频号跳转

    三种类型 1 跳转到视频号主页 wx openChannelsUserProfile finderUserName 视频号id 2 跳转到视频号视频 wx openChannelsActivity feedId 视频id finderUse
  • 文件上传-图片webshell上传

    图片webshell制作 在服务器端的PHP代码中 对于用户上传的文件做文件类型检查 查看文件格式是否符合上传规范 可以检查文件二进制格式的前几个字节 从而判断文件类型是否正确 针对这种情况可以直接新建要给1 jpg 其中代码内容如下 GI
  • 【数据结构】 二叉树面试题讲解->壹

    文章目录 引言 相同的树 https leetcode cn problems same tree description 题目描述 示例 示例一 示例二 示例三 题目解析 代码实现 另一棵树的子树 https leetcode cn pr
  • 华为OD机试-找出重复代码-2022Q4 A卷-Py/Java/JS

    小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码中的最长公
  • 深度学习之感知器的python实现,及用感知器实现鸢尾花的分类

    机器学习一般用来处理结构化的数据 深度学习一般用来处理非结构化的数据 例如图像 视频 文字等 权重更新过程 如果真实是1 预测是0 则权重会增加 相当于为了达到阈值增加权重 如果真实是0 预测是1 则权重会降低 相当于为了达到阈值减少权重