用Python实现感知机学习算法及其对偶算法实验报告

news2024/12/24 3:23:57

实验目的

1.理解感知机学习算法的基本思想:感知机是一种简单的线性分类模型,其基本思想是通过不断调整权重,使得分类超平面能够将不同类别的样本正确分开。
2.掌握感知机学习算法的实现方法:感知机学习算法基于随机梯度下降法,通过迭代更新权重,使得误分类点逐渐减少,最终达到收敛。
3.掌握感知机对偶算法的实现方法:感知机对偶算法通过引入拉格朗日乘子,将原始算法转化为对偶问题,从而避免了对每个样本都进行权重更新的过程,提高了算法的效率。
4.理解感知机算法的优缺点:感知机算法具有简单、易于理解、易于实现的优点,但也存在着收敛速度慢、对于线性不可分问题无法处理等缺点。
通过本实验,可以加深对感知机学习算法及其对偶算法的理解,为进一步学习和应用机器学习算法打下基础。

设备与环境

Jupyter notebook
python=3.9

三、实验原理

感知机算法的原理基于线性分类模型和随机梯度下降法,通过不断调整权重,使得分类超平面能够将不同类别的样本正确分开。感知机对偶算法通过引入拉格朗日乘子,将原始算法转化为对偶问题,从而避免了对每个样本都进行权重更新的过程,提高了算法的效率。
感知机学习算法的原始形式

感知机学习算法的对偶形式

实验内容

感知机算法的实现:编写Python代码实现感知机学习算法。感知机是一种二分类的线性分类器,其主要目标是找到一个超平面来将两类样本分开。算法的核心是通过迭代调整权重和偏置,使得误分类点逐渐减少直到收敛。
对偶算法的实现:编写Python代码实现感知机对偶算法。对偶算法是感知机的一种改进版本,它通过引入拉格朗日乘子来求解权重和偏置,避免了每次迭代都需要更新所有样本权重的问题。

实验结果分析

根据书上例子求解迭代过程表可以发现数据一模一样,说明该感知机学习算法没问题,其迭代过程是可靠的
在这里插入图片描述
同理我们得到感知机对偶学习算法也是没有问题的
在这里插入图片描述

代码

感知机学习算法Python代码

import numpy as np
class PerceptionMethod(object):  # 定义感知机学习类
    def __init__(self, X, Y, eta):  # 类中参数是 X,Y(X,Y)均为numpy数组,eta,eta是学习率
        if X.shape[0] != Y.shape[0]:  # 要求X,Y中的数目一样,即一个x对应一个y,否则返回错误
            raise ValueError('Error,X and Y must be same when axis=0 ')
        else:  # 在类中储存参数
            self.X = X
            self.Y = Y
            self.eta = eta

    def ini_Per(self):  # 感知机的原始形式
        weight = np.zeros(self.X.shape[1])  # 初始化weight,b
        b = 0
        number = 0  # 记录训练次数
        mistake = True  # mistake是变量用来说明分类是否有错误
        while mistake is True:  # 当有错时
            mistake = False  # 开始下一轮纠错前需要将mistake变为true,一来判断这一轮是否有错误
            for index in range(self.X.shape[0]):  # 循环开始
                if self.Y[index] * (weight @ self.X[index] + b) <= 0:  # 错误判断条件
                    weight += self.eta * self.Y[index] * self.X[index]  # 进行更新weight,b
                    b += self.eta * self.Y[index]
                    number += 1
                    print(weight, b)
                    mistake = True  # 此轮检查出错误,表明mistake为true,进行下列一轮
                    break  # 找出第一个错误后跳出循环
        return weight, b  # 返回值
X = np.array([[3, 3], [4, 3], [1, 1]])
Y = np.array([1, 1, -1])
PER = PerceptionMethod(X, Y, 1)  #实例化了一个PerceptionMethod类的对象PER,并将X、Y和学习率(这里设为1)作为参数传递给该对象
print(PER.ini_Per())
X = np.array([[4,2], [3,4], [0, 1]])
Y = np.array([1, 1, -1])
PER = PerceptionMethod(X, Y, 1)
print(PER.ini_Per())

感知机对偶学习算法Python代码:

import numpy as np
class PerceptionMethod(obcject):  # 定义感知机学习类
    def __init__(self, X, Y, eta):  # 类中参数是 X,Y(X,Y)均为numpy数组,eta,eta是学习率
        if X.shape[0] != Y.shape[0]:  # 要求X,Y中的数目一样,即一个x对应一个y,否则返回错误
            raise ValueError('Error,X and Y must be same when axis=0 ')
        else:  # 在类中储存参数
            self.X = X
            self.Y = Y
            self.eta = eta
    def dual_Per(self): #感知机的对偶形式
        Gram = np.dot(self.X, self.X.T) #定义Gram矩阵
        alpha = np.zeros(self.X.shape[0]) #初始化alpha,b
        b = 0
        mistake = True # mistake是变量用来说明分类是否有错误
        while mistake is True: #当有错时
            mistake = False #开始下一轮纠错前需要将mistake变为true,一来判断这一轮是否有错误
            for index in range(self.X.shape[0]): #循环开始
                if self.Y[index] * (alpha * self.Y @ Gram[index] + b) <= 0: #错误判断条件
                    alpha[index] += self.eta 进行更新alpha,b
                    b += self.eta * self.Y[index]
                    print(alpha, b)
                    mistake = True #此轮检查出错误,表明mistake为true,进行下列一轮
                    break  #找出第一个错误后跳出循环
        weight = self.Y * alpha @ self.X #计算得到权重向量weight
        return weight, b # 返回权重向量和偏置项
X = np.array([[3, 3], [4, 3], [1, 1]])
Y = np.array([1, 1, -1])
PER = PerceptionMethod(X, Y, 1)
print(PER.dual_Per())
X = np.array([[4,2], [3,4], [0, 1]])
Y = np.array([1, 1, -1])
PER = PerceptionMethod(X, Y, 1)
print(PER.dual_Per())

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

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

相关文章

【斗罗二】霍雨浩迷惑审查,戴华斌故意挑衅,惨败者屈服下跪

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;自《绝世唐门》宣布问世以来&#xff0c;其在国漫圈引发的关注和热议便如火如荼。作为《斗罗大陆》的续作&#xff0c;这部作品无疑继承了前作的荣光&#xff0c;甚至被无数粉丝期待着能再创辉煌。在各大社交媒体和国漫论…

前端移动web高级详细解析二

移动 Web 第二天 01-空间转换 空间转换简介 空间&#xff1a;是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间&#xff0c;Z 轴位置与视线方向相同。 空间转换也叫 3D转换 属性&#xff1a;transform 平移 transform: translate3d(x, y, z); transform…

搞定蓝牙——第五篇(SMP)

搞定蓝牙——第五篇&#xff08;SMP&#xff09; 原理Security Manager(简称SM&#xff0c;不要想歪)秘钥配对秘钥生成特定秘钥分发原理总结 原理 Security Manager(简称SM&#xff0c;不要想歪) 按照前面的试验&#xff0c;两个设备可以通过ble通讯了&#xff0c;但是&#…

(a /b)*c的值

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

ETL工具Kettle

1 Kettle的基本概念 一个数据抽取过程&#xff0c;主要包括创建一个作业&#xff08;Job&#xff09;&#xff0c;每个作业由一个或多个作业项&#xff08;Job Entry&#xff09;和连接作业项的作业跳&#xff08;Job Hop&#xff09;组成。每个作业项可以是一个转换&#xff…

Cookie技术

Cookie中文名称为小型文本文件&#xff0c;指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据。 Cookie是由服务器端生成&#xff0c;发送给User-Agent&#xff08;—般是浏览器&#xff09;&#xff0c;浏览器会将Cookie的key/value保存到某个目录下的文…

wiresharak捕获DNS

DNS解析&#xff1a; 过滤项输入dns&#xff1a; dns查询报文 应答报文&#xff1a; 事务id相同&#xff0c;flag里 QR字段1&#xff0c;表示响应&#xff0c;answers rrs变成了2. 并且响应报文多了Answers 再具体一点&#xff0c;得到解析出的ip地址&#xff08;最底下的add…

【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令

目录 一&#xff0c;安装Linux的centos7版本 具体安装步骤&#xff1a; 二&#xff0c;Linux常见的命令&#xff1a; 三、安装客户端工具 1、介绍 2、安装MobaXterm 3、换源 四、拍照功能 一&#xff0c;安装Linux的centos7版本 介绍&#xff1a; 具体安装步骤&#…

PTA L1-8 静静的推荐

PTA L1-8 静静的推荐 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 天梯赛结束后&#xff0c;某企业的人力资源部希望组委会能推荐一批优秀的学生&#xff0c;这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的&#xff1a; 只考虑得分不低于 175 …

软考系列(系统架构师)- 2012年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格对比、架构风格选取、架构设计过程&#xff09; 【问题1】&#xff08;12分&#xff09; 请用200字以内的文字解释什么是软件架构风格&#xff0c;并从集成开发环境与用户的交互方式、集成开发环境的扩展性、集成开发环境的数据管理三个方…

Anaconda下载和安装

1.概述 1&#xff09;包含conda&#xff1a;conda是一个环境管理器&#xff0c;其功能依靠conda包来实现&#xff0c;该环境管理器与pip类似。 2&#xff09;安装大量工具包&#xff1a;Anaconda会自动安装一个基本的python&#xff0c;该python的版本Anaconda的版本有关。该…

进程(详解)

进程 进程PCB进程的定义进程的组成进程模式进程的状态进程的运行进程的创建进程的结束孤儿进程僵尸进程僵尸进程的危害 进程的创建pidforkwait案例 进程 PCB 从操作系统理解进程概念-------先描述&#xff0c;后组织 为了使参与并发执行的程序能独立的运行&#xff0c;必须为之…

经常遇到的问题

一个前端经常会遇到的问题 例如&#xff0c;我想要在一个项目里&#xff0c;监听所有的fetch请求&#xff0c;应该怎么办&#xff1f;又或者说&#xff0c;我想用别人封装好的方法&#xff0c;但是在它之前&#xff0c;需要经过一层处理、判断&#xff0c;然后再看情况是否调用…

如何隐藏woocommerce 后台header,woocommerce-layout__header

如何隐藏woocommerce 后台header&#xff0c;woocommerce-layout__header WooCommerce |Products Store Activity| Inbox| Orders| Stock| Reviews| Notices| breadcrumbs 在 functions.php 里添加如下代码即可&#xff1a; // Disable WooCommerce Header in WordPress Admi…

开启CETOS 裸奔了一年的服务器开启firewall防火墙

记录一下关于firewall&#xff0c;博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙&#xff0c;iptables和firewall均是关闭状态&#xff0c;通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…

kubeadmin部署k8s1.27.4

kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…

软考系列(系统架构师)- 2013年系统架构师软考案例分析考点

试题一 软件架构&#xff08;根据描述填表、ESB 定义和功能&#xff09; 【问题1】&#xff08;10分&#xff09; 服务建模是对Ramp Coordination信息系统进行集成的首要工作&#xff0c;公司的架构师首先对Ramp Coordination信息系统进行服务建模&#xff0c;识别出系统中的两…

lesson2(补充)关于>>运算符和<<运算符重载

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; cout和cin我们在使用时需要包含iostream头文件&#xff0c;我们可以知道的是cout是写在ostream类里的&#xff0c;cin是写在istream类里的&#xff0c;他们都是定义出的对象&#xff0c;而<< 和 >…

猴子吃桃问题--C语言

问题描述&#xff1a; 猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。第2天早 上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天 早上想再吃时&#xff0c;就只剩一…

【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS 续

续【AD9361 数字接口CMOS &LVDS&SPI】B 并行数据之CMOS 数据总线空闲和周转周期 &#xff08;CMOS&#xff09; P0_D[11&#xff1a;0]和P1_D[11&#xff1a;0]总线信号通常由BBP或AD9361有源驱动。在任何空闲期间&#xff0c;两个组件都会忽略数据总线值。但是&…