机器学习——感知机模型(手动代码)

news2024/12/25 23:48:33

感知机,应该是很简单的模型了

1. 建立模型

感知机的模型,是一种多元线性回归+符号函数的二分类模型。
多元线性回归函数:【Z = W T X W^{T}X WTX
符号函数:

  • y = sign(Z) = 1,当y>=0时
  • y = sign(y) = -1,当y<0时

这个符号函数,其实就是根据多元线性回归的函数值,是否大于0,来判断类别的。
在程序中,可以直接用if进行判断,即

if Z>=0: y = 1
else: y = -1
"""太简单了吧"""

2.学习模型

2.1 选择损失函数

感知机是二分类,分类有如下四种情况
当多元线性值 Z ≥ 0 时:

  • ①分类正确:当实际数据的类别 y 也是1,那么 y*Z > 0
  • ②分类错误:当实际数据的类别 y 是 -1 时,那么y*Z<0
    当多元线性值 Z < 0 时:
  • ①分类正确:当实际数据的类别 y 也是-1,那么 y*Z > 0
  • ②分类错误:当实际数据的类别y 是 1时,那么y*Z < 0

综合来看,

  • 当分类错误时,yZ都是<0的,那么我们应该让yZ尽可能变大,也就是 -y*Z 尽可能变小
  • 当分类正确时,yZ都是>0的,那么我们应该让yZ尽可能变大,也就是 -y*Z 尽可能变小

因此,-y*Z可以作为损失函数,求损失函数的极小值,就能让感知机模型尽可能最优
【但实际上,是通过点到超平面的距离来算的,点到超平面距离的公式推导】

L o s s = − y ∗ z = − y ∗ ( w x + b ) = − Y T ( X W T ) Loss = -y*z=-y*(wx+b) = -Y^T(XW^T) Loss=yz=y(wx+b)=YT(XWT)

2.2 损失函数的优化方法

2.2.3 梯度下降法

W k + 1 = W k − η ∗ d ( L o s s ) d W ) W_{k+1}=W_k - η*\frac{d(Loss)}{dW)} Wk+1=WkηdW)d(Loss)

d ( L o s s ) d W ) = Y T X \frac{d(Loss)}{dW)}= Y^TX dW)d(Loss)=YTX——————no,不是这样的!!!

感知机多少有点儿暴力破解了,它是挨个挨个去看哪个值分类错误,就立马纠正参数W,直到那个值分类正确后,继续往后找分类错误的值,继续纠正参数W…直到挨个挨个确认每个分类值都分类正确后,就完事了

所以,梯度不是全体数据计算出来的梯度,而是分类错误的那条数据的参数梯度

g r a d i e n = − y i ∗ X i gradien = - y_i*X_i gradien=yiXi
这里的 y i y_i yi是实际分类的值(-1或1), X i X_i Xi是影响该值的因素 ( x 0 , x 1 . . . x m ) (x_0,x_1...x_m) (x0,x1...xm)——相当于一条误分类的数据

因此当分类错误时(即 y i ∗ X i < 0 时), W k + 1 = W k − η ∗ g r a d i e n t y_i*X_i<0时),W_{k+1} = W_k-η*gradient yiXi<0时),Wk+1=Wkηgradient

2.3 代码实现(手动 对比 sklearn)

from sklearn import linear_model
import pandas as pd
import numpy as np
import time
# 获取所需数据:'推荐分值', '推荐类型'
datas = pd.read_excel('./datas_perception.xlsx')
important_features = ['推荐分值', '推荐类型']
datas_1 = datas[important_features]


# 明确实际类别Y为'推荐类型',X为'推荐分值'
Y_original = datas_1['推荐类型']
# Y 转为独热编码

Y = np.where(Y_original=='低推荐',1,-1)
X_original = datas_1.drop('推荐类型',axis=1)
rows,columns = X_original.shape

X_0 = np.ones((rows,1))
X = np.concatenate((X_0,X_original),axis=1)



def perception_inhand():
    W0 = np.ones(columns + 1)
    jump = 1
    a = 0.001  # 设置学习率a
    times = 10000000
    num = 0
    num_round = 1
    while jump and num_round<times:
        for i in range(rows):
            mistake = Y[i]*np.matmul(X[i,:],W0.T)
            while mistake < 0 and num<times:
                # print(f"迭代{num + 1}次,该点的分类结果值为{mistake},参数W为{W0}")
                gradient = -(Y[i]*X[i,:])
                W = W0-a*gradient
                mistake = Y[i] * np.matmul(X[i, :], W.T)
                num += 1
                # print(f"调整后为,该点的分类结果值为{mistake},调整后参数W为{W}")
                W0 = W
                if mistake >= 0:
                    break

            # print(f"第{i+1}个分类正确")
        # 检查是否全部分类正确:实际无需检查的,因为有凸函数梯度是下降的,这个有相应的证明
        jump = 0
        for i in range(rows):
            mistake = Y[i] * np.matmul(X[i, :], W0.T)
            if mistake<0:
                jump = 1
                print(f"______第{num_round}轮迭代,第{i}个值分类错误_______")
                break

        num_round += 1
    print("——————————手动:感知机分类器——————————")

    print(f"最终完全分类,模型参数W为{W}\n")



# sklearn的梯度下降分类器
def perception_sklearn():
    # 1. 建立模型:随机梯度下降分类模型
    classifier = linear_model.Perceptron()

    # 2. 学习模型
    classifier.fit(X_original,Y)
    Y_hat = classifier.predict(X_original) # 模型分类
    labels = classifier.classes_ # 获取分类标签
    w = classifier.coef_ # 获取参数 W
    b = classifier.intercept_ # 获取偏差b,或称W0
    print("——————————sklearn:感知机分类器——————————")
    print(f'模型参数W为:{w}')

    # 3. 衡量模型
    accurency = classifier.score(X_original,Y_hat)
    print(f"预测准确率:{accurency*100}%")

perception_inhand()
perception_sklearn()

在这里插入图片描述

2.4 感知机对偶形式

对偶形式,本质与之前形式是一样的。

唯一的区别在于,对偶形式在迭代时对参数的更新,是对误分类数据的迭代次数更新。

当一条数据是误分类点时,我们会逐步进行迭代更新,每次迭代更新的学习率η是固定的,而迭代更新的梯度实际也是固定的 y i ∗ x i y_i*x_i yixi,因此每次迭代的幅度Δw也是固定的。

这就会出现,有时某条误分类数据,需要多次迭代(例如n次),才能使分类变得正确。

那么,对偶形式,则是将迭代次数n也纳入了迭代范畴。——【具体不作讲解,因为实际迭代过程与之前差不多】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulhub-struts2-S2-008 远程代码执行漏洞复现

漏洞描述 影响版本: 2.1.0 - 2.3.1 漏洞原理 S2-008 涉及多个漏洞&#xff0c;Cookie 拦截器错误配置可造成 OGNL 表达式执行&#xff0c;但是由于大多 Web 容器&#xff08;如 Tomcat&#xff09;对 Cookie 名称都有字符限制&#xff0c;一些关键字符无法使用使得这个点显得…

JAVA-IO流实践操作

什么是IO流&#xff1f; I&#xff1a;Input O&#xff1a;Output 通过IO可以完成硬盘文件的读和写。 流是一连串连续动态的数据集合。可以理解为是我们在内存和硬盘之间进行文件读写的一个管道。抽象的一个概念。我们可以看成是一个管道&#xff0c;我们输入的数据要从管道…

C语言编程—强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#xff0c;如下所示&am…

PyTorch 深度学习 || 2. 全连接网络 | Ch2.2 PyTorch 全连接网络分类

PyTorch 全连接网络分类 文章目录 PyTorch 全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as plt from sklear…

从源码角度分析 MyBatis 工作原理

一、MyBatis架构 从 MyBatis 代码实现的角度来看&#xff0c;MyBatis 的主要组件有以下几个&#xff1a; SqlSession - 作为 MyBatis 工作的主要顶层 API&#xff0c;表示和数据库交互的会话&#xff0c;完成必要数据库增删改查功能。 Executor - MyBatis 执行器&#xff0c;…

前端自动化测试的核心概念及思考

本文&#xff0c;将主要结合钉钉中的业务实践和落地&#xff0c;描述笔者对前端自动化测试场景的理解。 本文将主要从“为什么前端要做自动化测试、前端自动化测试分类、业务做自动化测试要抓住的核心点、核心工具推荐“这四个部分做阐述&#xff0c;下面直接进入正文。 大钉…

【嵌入式Linux内核驱动】05_IIC子系统 | 硬件原理与常见面试问题 | 应用编程 | 内核驱动 | 总体框架

硬件原理 IIC协议 IIC 基础 IIC协议简介—学习笔记_iic标准协议_越吃越胖的黄的博客-CSDN博客 简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信协议&#xff0c;用于连接微控制器、传感器、存储器和其他外设。 I2C使用两条线&#xff08;SDA和S…

Spark 1--3章简介,架构体系, 环境搭建

今天开始了新的课程 由我们的星哥带领我们踏入Spark的神秘殿堂 01_SparkCore 1. Spark简介 1.1 什么是Spark Spark是一种快速、通用、可扩展的大数据分析引擎&#xff0c;2009年诞生于加州大学伯克利分校AMPLab&#xff0c;2010年开源&#xff0c;2013年6月成为Apache孵化…

Cisco模拟器配置OSPF

一、前言 1.1 本文为Cisco模拟器配置OSPF操作笔记 (供新手参考&#xff09; 使用Cisco模拟器&#xff0c;配置OSPF协议&#xff0c;并使各台电脑ping通&#xff0c;如下参考图&#xff01; 1.2 思科路由器设置ip设置 在将设备摆放完毕后&#xff0c;需要配置每台设备的IP&…

【科普】干货!带你从0了解移动机器人(四) ——移动机器人导航技术

移动机器人导航是指移动机器人确定自己在地图参考系中的位置后&#xff0c;自动规划出通往地图参考系中某个目标位置路径并沿着该路径到达目标位置点的能力&#xff0c;是移动机器人行动能力的关键。 基于整个智能制造的发展&#xff0c;移动机器人导航技术大致可分为以下几种&…

【MarkDown】CSDN Markdown之思维导图mindmap详解

文章目录 思维导图(Mindmap)一个思维导图的例子语法形状矩形圆角矩形圆形爆炸云朵六边形默认 图标和类图标类 不清晰的缩进Markdown字符串与库或网站资源集成 思维导图(Mindmap) Mindmap现在是一个实验性的图表类型。语法和特性可能会在未来版本中更改&#xff0c;除了图标集成…

【UE 从零开始制作坦克】9-坦克瞄准

效果 步骤 1. 将下载的图片资源导入 2. 再新建一个控件蓝图&#xff0c;命名为“WBP_Aim” 打开“WBP_Aim”&#xff0c;拖入图像控件 选择图像控件的锚点如下 偏移全部置0 图像选择刚导入的“miaozhunjing” 3. 打开骨骼“SKEL_West_Tank_M1A1Abrams” 可以看到在炮管上有一个…

房屋装修选择自装,如何寻找选购系统门窗,比价并施工(门窗阶段)

环境&#xff1a; 地点&#xff1a;杭州 装修类型&#xff1a;自装 面积&#xff1a;建面135平方 进度&#xff1a;选购安装铝合金门窗阶段 问题描述&#xff1a; 房屋装修选择自装&#xff0c;如何寻找选购系统门窗&#xff0c;比价并施工 解决方案&#xff1a; 一、了…

暑期托管班招生海报模板 一键就能完成设计

即将到来的暑期&#xff0c;许多的兴趣班也将迎来暑期招生热&#xff0c;那么兴趣班如何设计一幅招生用的招生易拉宝&#xff1f;可以一键生成内容&#xff0c;自定义填写兴趣班的报名方式&#xff0c;课程内容以及联系方式等内容的招生海报制作工具&#xff01;跟着教程一起使…

Rust之泛型、特性和生命期(三):Traits:定义共同的行为

开发环境 Windows 10Rust 1.70.0 VS Code 1.79.2 项目工程 这里继续沿用上次工程rust-demo Traits&#xff1a;定义共同的行为 Trait定义了一个特定类型所具有的功能&#xff0c;并且可以与其他类型共享。我们可以使用特质以抽象的方式来定义共享行为。我们可以使用特质的界…

低学历又如何?我这样的程序员照样可以逆袭

今天分享的这个主题&#xff0c;很可能会带来争议&#xff0c;因为目前优秀毕业生0年就可以拿到 20K 的待遇&#xff0c;这里暂且抛开硕士&#xff0c;985&#xff0c;211的 Top 前几高学校本科生。 毕竟今天的主题的初衷是地点低的程序员如何才能 2-3 年实现 20K 的目的&…

mysql根据一个表的数据更新另一个表数据的SQL写法

目录 问题描述解决办法&#xff08;推荐第三种&#xff09; 问题描述 概述&#xff1a;用一个表中的字段去更新另外一个表中的字段&#xff0c; MySQL 中有相应的 update 语句来支持&#xff0c;不过这个 update 语法有些特殊。看一个例子就明白了。 解决办法&#xff08;推…

机器学习笔记 - 基于MobileNetV2的迁移学习训练关键点检测器

一、下载数据集 StanfordExtra数据集包含12000张狗的图像以及关键点和分割图图。 GitHub - benjiebob/StanfordExtra:12k标记的野外狗实例,带有2D关键点和分割。我们的 ECCV 2020 论文发布的数据集:谁把狗排除在外?3D 动物重建,循环中期望最大化。https://github.com/benj…

驱动模块和printk函数

目录 1. 驱动模板 1.1. 在源码工程路径下创建.c文件 1.2. 编写驱动模板 1.3. 将模板放到ubuntu上 1.4. 书写Makefile 1.5. 编译和安装 2. printk 2.1. Source Insight查找命令 2.2. printk讲解 2.2.1. 分析函数 2.2.2. 编写代码 2.3. 拓展 2.3.1. 关于printk函数测…