统计学习方法(2)——感知机原始形式、对偶形式及Python实现

从理论到代码:手把手复现李航《统计学习方法》第2版经典算法(附习题思路) 本文详细解析了如何从理论到代码实现李航《统计学习方法》第2版中的经典算法,包括感知机、支持向量机(SVM)、EM算法和条件随机场(CRF)。通过Python代码示例和习题思路,帮助读者深入理解统计学习核心算法,并掌握其工程化实现技巧,适合机器学习开发者和研究者参考实践。 阅读详情

感知机作为一种最简单的线性二分类模型,可以在输入空间(特征空间)将实例划分为正负两类。本文主要介绍感知机两种形式对应的学习算法及Python实现。


 感知机学习算法的原始形式

对于输入空间,感知机通过以下函数将其映射至{+1,-1}的输出空间

f(x)=sign(w⋅x+b)
(1)
对于所有的错分类点 i∈M ,都有 −yi(w⋅xi+b)>0 ,因此我们可以定义如下的损失函数作为优化准则:
L(w,b)=−∑xi∈Myi(w⋅xi+b)
(2)
通过求解损失函数(2)的梯度(3),
∇wL(w,b)=−∑xi∈Myixi∇bL(w,b)=−∑xi∈Myi
(3)
我们很容易就可以得到感知机学习算法的原始形式.
w←w+ηyixib←b+ηyi
(4)
整个算法流程如下:

  1. 选取初值w0,b0
  2. 在训练集中任意选取点(xi,yi)
  3. 如果 −yi(w⋅xi+b)>0 则按照(4)式更新w,b
  4. 重复2直到没有被误分的点

以上即为感知机算法的原始形式,理解起来比较简单,也较容易实现。下面给出其的Python实现

from __future__ import division
import random
import numpy as np
import matplotlib.pyplot as plt  


def sign(v):
    if v>=0:
        return 1
    else:
        return -1

def train(train_num,train_datas,lr):
    w=[0,0]
    b=0
    for i in range(train_num):
        x=random.choice(train_datas)
        x1,x2,y=x
        if(y*sign((w[0]*x1+w[1]*x2+b))<=0):
            w[0]+=lr*y*x1
            w[1]+=lr*y*x2
            b+=lr*y
    return w,b
def plot_points(train_datas,w,b):
    plt.figure()
    x1 = np.linspace(0, 8, 100)  
    x2 = (-b-w[0]*x1)/w[1]
    plt.plot(x1, x2, color='r', label='y1 data')
    datas_len=len(train_datas)
    for i in range(datas_len):
        if(train_datas[i][-1]==1):
            plt.scatter(train_datas[i][0],train_datas[i][1],s=50)  
        else:
            plt.scatter(train_datas[i][0],train_datas[i][1],marker='x',s=50)  
    plt.show()


if __name__=='__main__':
    train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]]  # 正样本
    train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]  # 负样本
    train_datas = train_data1 + train_data2  # 样本集
    w,b=train(train_num=50,train_datas=train_datas,lr=0.01)
    plot_points(train_datas,w,b)

原始形式

可以看出正负样本被红线分到了两个区域。

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

相比于原始形式,其对偶形式在理解上没有前者那么直观,网上关于其实现代码的例子也比较少。
在《统计学习方法》一书中,关于对偶形式有如下的描述:

对偶形式的基本想法是,将w和b表示为实例 xi 和标记 yi 的线性组合的形式,通过求解其系数而求得w和b.

假设w0=0,b=0,那么从(4)式可以看出,当所有的点均不发生误判时,最后的w,b一定有如下的形式:

w=∑i=1Nniηyixi=∑i=1Nαiyixib=∑i=1Nniηyi=∑i=1Nαiyi

(5)
其中 αi=niη 中 ni 代表对第i个样本的学习次数,感知机对偶形式的完整形式即为(6)式:
f(x)=sign(∑j=1Nαjyjxj⋅x+b)
(6)

  1. 初始化 α=0 , b=0 .
  2. 任意选取(xi,yi)
  3. 如果 yi(∑j=1Nαjyjxj⋅xi+b)≤0 ,即发生误判,则对 αi,b 进行更新:
    αi←αi+ηbi←bi+ηyi
  4. 重复2直到所有点都被正确分类

简而言之,感知机的对偶形式就是把对 w,b 的学习变成了对 α,b 的学习,原始形式中, w 在每一轮迭代错分时都需要更新,而采用对偶形式时,对于某一点(xi,yi)发生错分时,我们只需要更新其对应的αi即可,最后按照(5)式即可一次计算出 w .
同时我们上述步骤3中的yi(∑j=1Nαjyjxj⋅xi+b)≤0可以看出, xj⋅xi 仅以内积的形式出现,因此我们可以是先计算出x的gram矩阵存储起来,这样正式训练时只需要查表就可以得到 xj⋅xi 的值,这样做可以方便程序的优化,提高运算的速度。
原始形式和对偶形式对参数b的处理是相同的。
以下是感知机对偶形式的Python实现

from __future__ import division
import random
import numpy as np
import matplotlib.pyplot as plt  


def sign(v):
    if v>=0:
        return 1
    else:
        return -1

def train(train_num,train_datas,lr):
    w=0.0
    b=0
    datas_len = len(train_datas)
    alpha = [0 for i in range(datas_len)]
    train_array = np.array(train_datas)
    gram = np.matmul(train_array[:,0:-1] , train_array[:,0:-1].T)
    for idx in range(train_num):
        tmp=0
        i = random.randint(0,datas_len-1)
        yi=train_array[i,-1]
        for j in range(datas_len):
            tmp+=alpha[j]*train_array[j,-1]*gram[i,j]
        tmp+=b
        if(yi*tmp<=0):
            alpha[i]=alpha[i]+lr
            b=b+lr*yi
    for i in range(datas_len):
        w+=alpha[i]*train_array[i,0:-1]*train_array[i,-1]
    return w,b,alpha,gram

def plot_points(train_datas,w,b):
    plt.figure()
    x1 = np.linspace(0, 8, 100)
    x2 = (-b-w[0]*x1)/(w[1]+1e-10)
    plt.plot(x1, x2, color='r', label='y1 data')
    datas_len=len(train_datas)
    for i in range(datas_len):
        if(train_datas[i][-1]==1):
            plt.scatter(train_datas[i][0],train_datas[i][1],s=50)  
        else:
            plt.scatter(train_datas[i][0],train_datas[i][1],marker='x',s=50)  
    plt.show()

if __name__=='__main__':
    train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]]  # 正样本
    train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]  # 负样本
    train_datas = train_data1 + train_data2  # 样本集
    w,b,alpha,gram=train(train_num=500,train_datas=train_datas,lr=0.01)
    plot_points(train_datas,w,b)

对偶形式

感知机学习算法原理公式实例及python代码 本文感知机(perceptron)主要讲解原理、相关的公式、算法并通过举例计算来理解感知机算法的过程,最后附上相关的python代码。若想要详细的了解感知机公式的每一步推导过程及证明,本文不适合您。 感知机原理公式实例及Python代码 感知机是二类分类的线性分类模型,其中输入为实例的特征向量,输出为它的类别,可以取-1和+1两种。当然,输出也可以取其他的两种值,例如a和b,对和错,这里的-1和+1只是一个标签而已。 感知机对应于特征空间(可以是二维,... 阅读详情

相关推荐

感知机算法原始形式与对偶形式的python实现

如上图所示,在[2,10]x[2,10]的矩形区域内随机生成50个点作为正样本,在[-6,0]x[-2,2]的矩形区域内随机生成50个点作为负样本。要求: 1.把生成的点画在图上; 解: 虚线表示初始化时的分类面。 2.分别用李航《统计学习方法》课本中的算法2.1和算法2.2求解...

许希律的博客 1082

机器学习:感知机+代码实现(原始+对偶形式)

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出 为实例的类别,取+1和–1二值。感知机对应于输入空间(特征空间)中将实例划分为正 负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化, 求得感知机模型。感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的输入实例进行分类。感知机1957年由 Rosenblatt提出,是

lingxw的博客 1919

统计学习方法-感知机-原始形式与对偶形式-python代码实现

感知机 取书本上的正例点(3,3),(4,3),负例点(1,1) 以下是感知机的python代码实现: 原始形式代码: import numpy as np import matplotlib.pyplot as plt data = np.array([[3, 3, 1], [4, 3, 1], [1, 1, -1]]) X = data[:, :2] y = data[:, -1] c...

地瓜的博客 542

感知机对偶形式python实现

纯实现

drdtddtrdr的博客 600

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

weixin_42046845的博客 1484

李航《统计学习方法》第2版 第2章课后习题答案

习题2.1 题目:Minsky与Papert指出:感知机因为是线性模型,所以不能表示复杂的函数,如异或(XOR),验证感知机为什么不能表示异或。 习题2.2 题目:模仿例题2.1,构建从训练数据集求解感知机模型的例子。 解:这里用python代码分别实现一下感知机学习算法的原始形式与对偶形式 原始形式: """ 感知机(原始形式):实现书本P40页 例题2.1 """ import numpy as np import matplotlib.pyplot as plt class MyPerceptr

weixin_43646592的博客 6541

Perceptron 感知机算法 (对偶形式) Python numpy 实现

import numpy as np # 感知机对偶形式 class Perceptron: E: float # 学习率 A: np.array([]) # alpha, A = n * E W: np.array([]) # weight, W = sum(Ai* yi * xi) B: float # b = sum(Ai * yi) Gram: np.array([]) # Gram 矩阵为 [xi · xj] n*n # 初始化

负负得正的博客 1273

华为HCIP大数据备考实战:从题库精析到834分通关策略

本文详细介绍了华为HCIP大数据认证考试的备考策略,包括题库精析、重点章节突破和考场实战经验。作者以834分的高分通过考试,分享了官方教材的三遍阅读法、自建题库技巧以及各章节核心知识点,帮助考生高效备考并顺利通关。

weixin_29169899的博客 149

李航统计学习方法----感知机章节学习笔记以及python代码

感知机算法的原理以及实现

詹sir的博客 1218

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 267

一文说清Arduino如何实现舵机平滑转动(机器人场景)

深入讲解如何利用arduino控制舵机转动,实现机器人场景中的平稳运动。通过代码优化与脉冲宽度调节,让舵机动作更精准流畅,适用于各类自动化项目。

weixin_35706255的博客 898

感知机原始形式、对偶形式

感知机的原始形式对于输入样本特征数据,感知机通过以下函数将其映射至{+1,-1}的输出空间 f(x)=sign(w⋅x+b)f(x)=sign(w⋅x+b)(1) 对于所有的错分类点i∈Mi∈M,都有−yi(w⋅xi+b)&gt;0−yi(w⋅xi+b)&gt;0,因此我们可以定义如下的损失函数作为优化准则: L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w,b)=−∑xi∈Myi(w⋅xi+...

zc20161202005的博客 1334

K-近邻算法: k-nearest neighbor classification (kNN) 详细介绍

@创建于:2020.04.09 @修改于:2020.04.09,2024.06.22 文章目录1、kNN介绍2、k近邻法的三要素详解2.1 距离度量2.2 k值的选择2.3 分类决策规则3、k近邻法的实现:kd树4、Python实现过程5、优缺点6、常见问题 1、kNN介绍 kNN是一个基本而简单的分类算法,作为监督学习,那么KNN模型需要的是有标签的训练数据,对于新样本的类别由与新样本距离最近的k个训练样本点按照分类...

chenhepg的博客 9万+

感知机+Python3的实现(原始形式与对偶形式)

1. 什么是感知机? ​ 感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误差的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。感知机学习算法具有简答而易于实现的优点,分为原始形式和对偶形式,下文会一一给出。感知机预测是通过对训练数据的学习对新输入的实例进行分类。 定义1.1(

justorderman的博客 1174

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

《统计学习方法》—— 感知机原始形式、感知机对偶形式的python3代码实现(三)

前言 在前两篇博客里面,我们分别介绍了感知机的原始形式和感知机的对偶形式。在这篇博客里面,我们将用python3对上述两种感知机算法进行实现。 8. 感知机原始形式 现将算法复述如下: 输入:数据集 T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\}T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)};学习步长 η\etaη 输出:www 和 bbb;感知机模型 f(x)=sign(

qq_30841655的博客 596

TC3XX - MCAL知识点(三十九):AURIX™ TC3xx 的EDSADC实现旋变解码功能(应用笔记记录)

本文总结了英飞凌应用笔记中关于EDSADC旋变解码系统的关键内容。系统通过调幅解调获取电机位置和速度信号,支持内外载波生成方案,其中内部载波方案更常用(需2个DSADC通道)。重点介绍了滤波器链配置建议(避免FIR1)、系统条件要求(如偶数积分周期)以及群延迟计算方法。特别分析了SDCAP功能对硬件延迟的补偿机制,指出温度等因素可能导致外部电路延迟变化,需通过计数器测量并通过软件调整积分器起始点来消除角度误差。文中还提供了不同硬件延迟情况下的信号处理示例。

梦想技术家 457

感知机的对偶形式

李航的统计学习方法上写的不是很详细,这个博客写的还可以。 图片来源 自己尝试把感知机对偶形式的代码写了一下,假设学习率为1,我这个菜鸡,代码能力是真的差,明年就要实习了,得硬着头皮写了: # -*- coding:utf-8 -*- import numpy as np # 感知机对偶形式学习算法demo data = np.array([[3, 3, 1], [4, 3, 1], ...

熊伟 788

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

统计学习笔记-导论 感知机算法原始、对偶形式 原理、python实现

1.过拟合产生的原因以及造成的影响 统计学习有3个要素,模型、策略以及算法。给定一组数据集,需要通过模型对数据的分布进行拟合。先把原始的数据集划分为训练集、验证集和测试集,训练集用来对模型的参数进行更新,测试集用来衡量训练好的模型的性能。如果模型在训练集上的准确率很高、在测试集上的准确率很低,那么说明发生了过拟合,即模型对训练集拟合的过好了。造成的影响就是模型的泛化能力低,模型对于训练集以外的数据很难拟合。就相当于为了准备考试,使劲刷题,题库里(训练集)的题目都做对了,但是真正考试的时候(测试集)却得分很低

keep用心的博客 784

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【用python实现《统计学习方法》】之感知机(perceptron)

声明:首先非常感谢李航博士和这篇博文的博主。本文的理论部分主要参考李航博士的《统计学习方法》,而代码实现部分则是在上述的博文基础上完成,并新增了对偶形式的感知机的python实现。感知机(perceptron)是机器学习中最简单的算法之一,容易理解和实现。笔者将使用python实现感知机的算法(重复造轮子),包括感知机的原始形式和对偶形式。model感知机的定义:strategy感知机学习的经验风险

撸猫大学渣的博客 4383

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

统计学习笔记2:感知机学习算法的对偶形式及其python代码实现

李航老师《统计学习方法》学习笔记2:感知机学习方法的对偶形式及python代码实现

m0_50947149的博客 577

《统计学习方法》—— 感知机对偶算法、推导以及python3代码实现(二)

前言 在前一篇博客 《统计学习方法》—— 感知机原理、推导以及python3代码实现(一) 里面,我们介绍了感知机原始形式以及具体推导。在这篇博客里面,我们将继续介绍感知机对偶形式以及python3代码实现。 6. 感知机对偶形式 感知机算法原始形式: 输入:数据集 T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\}T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)},其中,xi∈R

qq_30841655的博客 1033

《统计学习方法》感知机算法的手工搭建 感知机 原始形式 对偶形式

!感知机的理论,应用,博客,书籍多的是。看机器学习算法的时候总是觉得感知机简单,大致粗过一遍就了事。对,我是来交后悔费的!哈。 !感知机是支持向量机和神经网络的基础。嗯~~, !前提知识,如果童靴对python中的 reduce(),map(),copy()不是特别了解的话,建议大家先去看一下这些知识。因为下面的感知机算法会用到。 !感知机学习算法是误分类驱动,二分类的线性分类的判别...

weixin_43080758的博客 270

基于感知机Perceptron的鸢尾花分类实践

文章目录1. 感知机简介2. 编写感知机实践2.1 数据处理2.2 编写感知机类2.3 多参数组合运行3. sklearn 感知机实践 本文将使用感知机模型,对鸢尾花进行分类,并调整参数,对比分类效率。 1. 感知机简介 感知机(perceptron)是二类分类的线性分类模型 输入:实例的特征向量 输出:实例的类别,取 +1 和 -1 二值 感知机对应于输入空间(特征空间)中将实例划分为正负两类...

Michael是个半路程序员 1万+
上一篇: 统计学习方法(1)——正则化、误差上界的证明等
下一篇: 统计学习方法(3)——KNN,KD树及其Python实现
ginger188
博客等级 码龄12年 31粉丝 14原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值