感知机算法

news2024/11/28 9:37:22

感知机算法

二分类的情况

原理

样本集 X \pmb X X有两个类情况,感知机 Y = w X + b Y=wX+b Y=wX+b可以将样本集 X \pmb X X分为成功两类
Y = w X + b = { > 0 , x ∈ w 1 < 0 , x ∈ w 2 Y=wX+b= \begin{cases}>0 \quad,\quad x \in w_1 \\ <0 \quad,\quad x \in w_2 \end{cases} Y=wX+b={>0,xw1<0,xw2
为了简化 Y = W X + b Y=WX+b Y=WX+b的形式

可以令
X ′ = [ x 1 x 2 ⋮ x n 1 ] W = [ w 1 , w 2 , … , w n , b ] X'=\begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n\\ 1 \end{bmatrix} \\ W=\begin{bmatrix} w_1,w_2,\dots,w_n,b \end{bmatrix} X= x1x2xn1 W=[w1,w2,,wn,b]
于是存在 Y = W X Y=WX Y=WX

同时让$\forall X, X_i \in w_2; X=-X ,于是当 ,于是当 ,于是当Y=WX>0 时,分类正确,若分类错误,则 时,分类正确,若分类错误,则 时,分类正确,若分类错误,则W=W+Cx_i ,更新 ,更新 ,更新W 的值。当且仅当对样本集 的值。当且仅当对样本集 的值。当且仅当对样本集\pmb X 全部分类正确。 全部分类正确。 全部分类正确。W$更新完成。

示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import numpy as np

x1T = np.array([0, 0, 0])
x2T = np.array([1, 0, 0])
x3T = np.array([1, 0, 1])
x4T = np.array([1, 1, 0])
x5T = np.array([0, 0, 1])
x6T = np.array([0, 1, 1])
x7T = np.array([0, 1, 0])
x8T = np.array([1, 1, 1])

w1 = np.array([x1T, x2T, x3T, x4T]).T
w2 = np.array([x5T, x6T, x7T, x8T]).T

b = np.array([[1, 1, 1, 1]])

w1 = np.vstack((w1, b))
w2 = np.vstack((w2, b))
w2 = -1 * w2

c = 1
w = np.array([0, 0, 0, 0])

epoch = 1
while True:
    flag = True
    i = 1
    for x in w1.T:
        res = w @ x
        print("epoch:{},x{}:{},w:{},w@x{}:{}".format(epoch, i, x, w, i, res), end='')
        i = i + 1
        if res <= 0:
            w = w + c * x
            print(",update:w=w+cx{}:{}".format(i, w))
            flag = False
        else:
            print()

    for x in w2.T:
        res = w @ x
        print("epoch:{},x{}:{},w:{},w@x{}:{}".format(epoch, i, x, w, i, res), end='')
        i = i + 1
        if res <= 0:
            w = w + c * x
            print(",update:w=w+cx{}:{}".format(i, w))
            flag = False
        else:
            print()

    epoch = epoch + 1

    if flag:
        break

输出结果:

epoch:1,x1:[0 0 0 1],w:[0 0 0 0],w@x1:0,update:w=w+cx2:[0 0 0 1]
epoch:1,x2:[1 0 0 1],w:[0 0 0 1],w@x2:1
epoch:1,x3:[1 0 1 1],w:[0 0 0 1],w@x3:1
epoch:1,x4:[1 1 0 1],w:[0 0 0 1],w@x4:1
epoch:1,x5:[ 0  0 -1 -1],w:[0 0 0 1],w@x5:-1,update:w=w+cx6:[ 0  0 -1  0]
epoch:1,x6:[ 0 -1 -1 -1],w:[ 0  0 -1  0],w@x6:1
epoch:1,x7:[ 0 -1  0 -1],w:[ 0  0 -1  0],w@x7:0,update:w=w+cx8:[ 0 -1 -1 -1]
epoch:1,x8:[-1 -1 -1 -1],w:[ 0 -1 -1 -1],w@x8:3
epoch:2,x1:[0 0 0 1],w:[ 0 -1 -1 -1],w@x1:-1,update:w=w+cx2:[ 0 -1 -1  0]
epoch:2,x2:[1 0 0 1],w:[ 0 -1 -1  0],w@x2:0,update:w=w+cx3:[ 1 -1 -1  1]
epoch:2,x3:[1 0 1 1],w:[ 1 -1 -1  1],w@x3:1
epoch:2,x4:[1 1 0 1],w:[ 1 -1 -1  1],w@x4:1
epoch:2,x5:[ 0  0 -1 -1],w:[ 1 -1 -1  1],w@x5:0,update:w=w+cx6:[ 1 -1 -2  0]
epoch:2,x6:[ 0 -1 -1 -1],w:[ 1 -1 -2  0],w@x6:3
epoch:2,x7:[ 0 -1  0 -1],w:[ 1 -1 -2  0],w@x7:1
epoch:2,x8:[-1 -1 -1 -1],w:[ 1 -1 -2  0],w@x8:2
epoch:3,x1:[0 0 0 1],w:[ 1 -1 -2  0],w@x1:0,update:w=w+cx2:[ 1 -1 -2  1]
epoch:3,x2:[1 0 0 1],w:[ 1 -1 -2  1],w@x2:2
epoch:3,x3:[1 0 1 1],w:[ 1 -1 -2  1],w@x3:0,update:w=w+cx4:[ 2 -1 -1  2]
epoch:3,x4:[1 1 0 1],w:[ 2 -1 -1  2],w@x4:3
epoch:3,x5:[ 0  0 -1 -1],w:[ 2 -1 -1  2],w@x5:-1,update:w=w+cx6:[ 2 -1 -2  1]
epoch:3,x6:[ 0 -1 -1 -1],w:[ 2 -1 -2  1],w@x6:2
epoch:3,x7:[ 0 -1  0 -1],w:[ 2 -1 -2  1],w@x7:0,update:w=w+cx8:[ 2 -2 -2  0]
epoch:3,x8:[-1 -1 -1 -1],w:[ 2 -2 -2  0],w@x8:2
epoch:4,x1:[0 0 0 1],w:[ 2 -2 -2  0],w@x1:0,update:w=w+cx2:[ 2 -2 -2  1]
epoch:4,x2:[1 0 0 1],w:[ 2 -2 -2  1],w@x2:3
epoch:4,x3:[1 0 1 1],w:[ 2 -2 -2  1],w@x3:1
epoch:4,x4:[1 1 0 1],w:[ 2 -2 -2  1],w@x4:1
epoch:4,x5:[ 0  0 -1 -1],w:[ 2 -2 -2  1],w@x5:1
epoch:4,x6:[ 0 -1 -1 -1],w:[ 2 -2 -2  1],w@x6:3
epoch:4,x7:[ 0 -1  0 -1],w:[ 2 -2 -2  1],w@x7:1
epoch:4,x8:[-1 -1 -1 -1],w:[ 2 -2 -2  1],w@x8:1
epoch:5,x1:[0 0 0 1],w:[ 2 -2 -2  1],w@x1:1
epoch:5,x2:[1 0 0 1],w:[ 2 -2 -2  1],w@x2:3
epoch:5,x3:[1 0 1 1],w:[ 2 -2 -2  1],w@x3:1
epoch:5,x4:[1 1 0 1],w:[ 2 -2 -2  1],w@x4:1
epoch:5,x5:[ 0  0 -1 -1],w:[ 2 -2 -2  1],w@x5:1
epoch:5,x6:[ 0 -1 -1 -1],w:[ 2 -2 -2  1],w@x6:3
epoch:5,x7:[ 0 -1  0 -1],w:[ 2 -2 -2  1],w@x7:1
epoch:5,x8:[-1 -1 -1 -1],w:[ 2 -2 -2  1],w@x8:1

多分类的情况

原理

若样本集 X \pmb X X有M种分类情况,且每一种分类情况都存在一个判别函数 y = w 1 x 1 + b 1 y=w_1x_1+b_1 y=w1x1+b1,同时简化判别函数为 Y 1 = W 1 X 1 Y_1=W_1X_1 Y1=W1X1

y k = m a x ( y 1 , y 2 , … , y n ) y_k=max(y_1,y_2,\dots,y_n) yk=max(y1,y2,,yn),则可视为感知机将样本分为第k类

若原本为第 i i i类分类成第 j j j类,即 y i < y j y_i<y_j yi<yj,则更新 w w w
w i = w i + c x i w j = w j − c x i w_i=w_i+cx_i\\ w_j=w_j-cx_i wi=wi+cxiwj=wjcxi
当且仅当对样本集 X \pmb X X全部分类正确。 W W W更新完成。

示例

image-20231015182555665

import numpy as np

x1 = np.array([0, 0])
x2 = np.array([1, 1])
x3 = np.array([-1, 1])
b = np.array([[1, 1, 1]])

X = np.array([x1, x2, x3]).T
X = np.vstack((X, b)).T

W = np.zeros((3, 3))

h = X.shape[1]
c = 1

epoch = 1
while True:
    flag = True
    for i in range(h):
        for j in range(h):
            res1 = X[i] @ W[i]
            res2 = X[i] @ W[j]
            if res1 <= res2 and i != j:
                W[i] = W[i] + c * X[i]
                W[j] = W[j] - c * X[i]
                flag = False
                print("epoch={},X[{}]@W[{}]={} <= X[{}]@W[{}]={}".format(epoch, i, i, res1, i, j, res2))
                print("update W:")
                print(" W[{}]=W[{}]+c*X[{}]={}".format(i, i, i, W[i]))
                print(" W[{}]=W[{}]-c*X[{}]={}".format(j, j, i, W[j]))
            elif i != j:
                print("epoch={},X[{}]@W[{}]={} > X[{}]@W[{}]={}".format(epoch, i, i, res1, i, j, res2))
                print('W does not need to be updated!')

    epoch = epoch + 1

    if flag:
        print('-' * 10, 'W', '-' * 10)
        print(W)
        break

输出结果:

epoch=1,X[0]@W[0]=0.0 <= X[0]@W[1]=0.0
update W:
 W[0]=W[0]+c*X[0]=[0. 0. 1.]
 W[1]=W[1]-c*X[0]=[ 0.  0. -1.]
epoch=1,X[0]@W[0]=1.0 > X[0]@W[2]=0.0
W does not need to be updated!
epoch=1,X[1]@W[1]=-1.0 <= X[1]@W[0]=1.0
update W:
 W[1]=W[1]+c*X[1]=[1. 1. 0.]
 W[0]=W[0]-c*X[1]=[-1. -1.  0.]
epoch=1,X[1]@W[1]=2.0 > X[1]@W[2]=0.0
W does not need to be updated!
epoch=1,X[2]@W[2]=0.0 <= X[2]@W[0]=0.0
update W:
 W[2]=W[2]+c*X[2]=[-1.  1.  1.]
 W[0]=W[0]-c*X[2]=[ 0. -2. -1.]
epoch=1,X[2]@W[2]=3.0 > X[2]@W[1]=0.0
W does not need to be updated!
epoch=2,X[0]@W[0]=-1.0 <= X[0]@W[1]=0.0
update W:
 W[0]=W[0]+c*X[0]=[ 0. -2.  0.]
 W[1]=W[1]-c*X[0]=[ 1.  1. -1.]
epoch=2,X[0]@W[0]=0.0 <= X[0]@W[2]=1.0
update W:
 W[0]=W[0]+c*X[0]=[ 0. -2.  1.]
 W[2]=W[2]-c*X[0]=[-1.  1.  0.]
epoch=2,X[1]@W[1]=1.0 > X[1]@W[0]=-1.0
W does not need to be updated!
epoch=2,X[1]@W[1]=1.0 > X[1]@W[2]=0.0
W does not need to be updated!
epoch=2,X[2]@W[2]=2.0 > X[2]@W[0]=-1.0
W does not need to be updated!
epoch=2,X[2]@W[2]=2.0 > X[2]@W[1]=-1.0
W does not need to be updated!
epoch=3,X[0]@W[0]=1.0 > X[0]@W[1]=-1.0
W does not need to be updated!
epoch=3,X[0]@W[0]=1.0 > X[0]@W[2]=0.0
W does not need to be updated!
epoch=3,X[1]@W[1]=1.0 > X[1]@W[0]=-1.0
W does not need to be updated!
epoch=3,X[1]@W[1]=1.0 > X[1]@W[2]=0.0
W does not need to be updated!
epoch=3,X[2]@W[2]=2.0 > X[2]@W[0]=-1.0
W does not need to be updated!
epoch=3,X[2]@W[2]=2.0 > X[2]@W[1]=-1.0
W does not need to be updated!
---------- W ----------
[[ 0. -2.  1.]
 [ 1.  1. -1.]
 [-1.  1.  0.]]

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

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

相关文章

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP&#xff08;One-Time Password&#xff09;是一种用于身份验证的协议&#xff0c;它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录&#xff0c;以下是一些实现步骤&#xff1a; 1、安装Radius服务器 首先需要安装Radius服务器…

Matlab-ODE45:求解状态变量(微分方程组)

ode45函数 ode45实际上是数值分析中数值求解微分方程组的一种方法&#xff0c;4阶五级Runge-Kutta算法。 调用方法 ​ 其实这种方程的每一个状态变量都是t 的函数&#xff0c;我们可以从现代控制理论的状态空间来想。因此返回[ t , x ]&#xff0c;其中t是一个列向量&#xf…

【电源专题】CCM (ContinuousConduction Mode)和DCM(Discontinuous Conduction Mode)有什么区别?

在工作中,查看规格书的时候会看到CCM/DCM等专业词汇。那么什么是CCM?什么是DCM呢? DCM和CCM的概念 回顾文章:【电源专题】什么是开关稳压器的热回路?如何优化热回路?我们可以知道当开关管上管Q1导通Q2关断时,回路为绿色路径,电感储能同时给输出提供能量。当Q1关断Q2导…

【AI】深度学习——循环神经网络

神经元不仅接收其他神经元的信息&#xff0c;也能接收自身的信息。 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类具有短期记忆能力的神经网络&#xff0c;可以更方便地建模长时间间隔的相关性 常用的参数学习可以为BPTT。当输入序列比较…

图解 RIP

路由器能把全世界的网络连接起来&#xff0c;再根据路由表进行数据转发。路由表项可以手动配置添加&#xff0c;但是面对不计其数、而且动态变化的网络环境&#xff0c;手动添加路由表项显得不切实际&#xff0c;必须使用可以自动生成路由表项、动态感知网络变化的网络协议&…

nginx的location优先级与重定向

概念 1.location是Nginx中的块级指令(block directive),&#xff0c;location指令的功能是用来匹配不同的url请求&#xff0c;进而对请求做不同的处理和响应&#xff0c;这其中较难理解的是多个location的匹配顺序。 2.我们输入的网址叫做请求URI&#xff0c;nginx用请求URI与…

React高级特性之受控和非受控组件

一、受控组件 受控组件&#xff1a;input框自己的状态被React组件状态控制 // 类组件引入React import React from reactclass InputComponent extends React.Component{state {message: zm66666}changeHandler (e) > {this.setState({message: e.target.value})}render…

第五十八章 学习常用技能 - 查看查询缓存

文章目录 第五十八章 学习常用技能 - 查看查询缓存查看查询缓存建立索引使用调谐表工具 第五十八章 学习常用技能 - 查看查询缓存 查看查询缓存 对于 SQL&#xff08;用作嵌入式 SQL 时除外&#xff09;&#xff0c;系统会生成可重用代码来访问数据&#xff0c;并将该代码放置…

二手安捷伦E9323A射频传感器

安捷伦E9323A射频传感器 E9323A 是 Agilent 使用的 6 GHz 0.1 瓦射频传感器。电子测试设备传感器测量波形的功率&#xff0c;例如多音和调制射频 (RF) 波形。传感器使用二极管检测器收集高度精确的调制测量值。 5 MHz 视频带宽&#xff0c;非常适合 W-CDMA 和 cdma2000 应用 通…

机器视觉知识讲的深不如讲的透

我深思这个话题&#xff0c;大家来培训&#xff0c;其实培训机构也很痛苦&#xff0c;每个热掌握的参差不齐&#xff0c;你说他不会吧&#xff0c;会一点电气&#xff0c;你说他会吧&#xff0c;会一点Opencv&#xff0c;会一点visionpro,会一点Visionmaster,会一点Halcon。好像…

LangChain与大型语言模型(LLMs)应用基础教程:神奇的Agent

原文&#xff1a;LangChain与大型语言模型(LLMs)应用基础教程:神奇的Agent-CSDN博客 LangChain是大型语言模型(LLM)的应用框架,LangChain可以直接与 OpenAI 的 text-davinci-003、gpt-3.5-turbo 模型以及 Hugging Face 的各种开源语言模如 Google 的 flan-t5等模型集成。通过使…

c++11新增特性

目录 新增容器 ​编辑 新增语法 变量类型推导 auto 存储类型 分类 自动存储类型 静态存储类型 寄存器存储类型 外部链接存储类型 decltype typeid(c98) type_info { }初始化 initializer_list 介绍 使用 模拟实现 nullptr final与override 范围for 右值…

PVIT:利用位置信息增强多模态模型理解用户意图的能力

论文链接&#xff1a; https://arxiv.org/abs/2308.13437 代码链接&#xff1a; https://github.com/PVIT-official/PVIT Demo&#xff1a; https://huggingface.co/spaces/PVIT/pvit 引言 随着ChatGPT等语言大模型的走红&#xff0c;越来越多人尝试探索为语言大模型赋予视觉能…

中断机制-通过AtomicBoolean实现线程中断停止

通过AutomicBoolean package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean;/*** author zhou* version 1.0* date 2023/10/15 2:42 下午*/ public class InterruptDemo2 {static AtomicBoole…

分治算法——快排 | 归并思想

文章目录 一、快排思想1. leetcode75. 颜色分类2. leetcode912. 排序数组3. leetcode215. 数组中的第K个最大元素4. leetcode面试题17.14. 最小K个数 二、归并思想1. leetcode912. 排序数组2. leetcodeLCR 170. 交易逆序对的总数3. 计算右侧小于当前元素的个数4. 翻转对 一、快…

GBJ3510-ASEMI电源控制柜专用GBJ3510

编辑&#xff1a;ll GBJ3510-ASEMI电源控制柜专用GBJ3510 型号&#xff1a;GBJ3510 品牌&#xff1a;ASEMI 芯片个数&#xff1a;4 封装&#xff1a;GBJ-4 恢复时间&#xff1a;&#xff1e;50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;350A 正向电流&am…

iWall:支持自定义的Mac动态壁纸软件

iWall Mac是一款动态壁纸软件&#xff0c;它可以使用任何格式的漂亮视频&#xff08;无须转换&#xff09;、图片、动画、Flash、gif、swf、程序、网页、网站做为您的动态壁纸、动态桌面&#xff0c;并且可以进行交互。 这款软件功能多、使用简单、体积小巧、不占用资源、运行…

Java每日笔试题错题分析(5)

Java每日笔试题错题分析&#xff08;5&#xff09; 一、错题知识点前瞻第1题第2题第3题第4题第5题第6题第7题 二、错题展示及其解析第1题第2题第3题第4题第5题第6题第7题 一、错题知识点前瞻 第1题 数组的初始化 数组的初始化有两种&#xff0c;分为静态初始化和动态初始化 静…

ai_drive67_基于不确定性的多视图决策融合

论文链接&#xff1a;https://openreview.net/forum?idOOsR8BzCnl5 https://arxiv.org/abs/2102.02051 代码链接&#xff1a;https://github.com/hanmenghan/TMC Zongbo Han, Changqing Zhang, Huazhu Fu, Joey Tianyi Zhou, Trusted Multi-View Classification, Internatio…

动态内存管理改造简易通讯录

动态通讯录 本章内容基于上章内容实现&#xff0c;具体情况若有不清楚&#xff0c;请先查看上一篇文章。 动态通讯录实现了&#xff0c;动态开辟&#xff0c;如果存放满了&#xff0c;再开辟空间进行存储&#xff0c;相对静态更方便一些。 动态通讯录需要改造的地方 我们基于…