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

文章目录

  • 第 2章感知机
    • 2.1 感知机模型
    • 2.2 感知机学习策略
      • 2.2.1 数据集的线性可分性
      • 2.2.2 感知机学习策略
    • 2.3 感知机学习算法
      • 2.3.1 感知机学习算法的原始形式
      • 2.3.2 算法的收敛性
      • 2.3.3 感知机学习算法的对偶形式
    • 实践:二分类模型(iris数据集)
      • 数据集可视化:
      • Perceptron
      • scikit-learn实例

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

我算是有点基础的(有过深度学习和机器学的项目经验),但也是半路出家,无论是学Python还是深度学习,都是从问题出发,边查边做,没有系统的学过相关的知识,这样的好处是入门快(如果想快速入门,大家也可以试试,直接上手项目,从小项目开始),但也存在一个严重的问题就是,很多东西一知半解,容易走进死胡同出不来(感觉有点像陷入局部最优解,找不到出路),所以打算系统的学习几本口碑比较不错的书籍。
  书籍选择: 当然,机器学习相关的书籍有很多,很多英文版的神书,据说读英文版的书会更好,奈何英文不太好,比较难啃。国内也有很多书,周志华老师的“西瓜书”我也有了解过,看了前几章,个人感觉他肯能对初学者更友好一点,讲述的非常清楚,有很多描述性的内容。对比下来,更喜欢《统计学习方法》,毕竟能坚持看完才最重要。
  笔记内容: 笔记内容尽量省去了公式推导的部分,一方面latex编辑太费时间了,另一方面,我觉得公式一定要自己推到一边才有用(最好是手写)。尽量保留所有标题,但内容会有删减,通过标黑和列表的形式突出重点内容,要特意说一下,标灰的部分大家最好读一下(这部分是我觉得比较繁琐,但又不想删掉的部分)。
  代码实现: 最后是本章内容的实践,如果想要对应的.ipynb文件,可以留言

第 2章感知机

  感知机 (perceptron) 是二类分类的线性分类模型,其输入为实例的特征向量,输 出为实例的类别,取 +1 和-1 二值。

  感知机对应于输入空间(特征空间)中将实例划 分为正负两类的分离超平面,属于判别模型

  感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此:

  • 导入基于误分类的损失函数,
  • 利用梯度下降法对损失函 数进行极小化,求得感知机模型。

  感知机学习算法具有简单而易于实现的优点,分为 原始形式对偶形式。

2.1 感知机模型

  感知机是一种线性分类模型,属于判别模型。

  感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification modeD 或线性分类器 (linear classifier) ,即函数集合

f ∣ f ( x ) = ω • x + b {{f|f(x) = ω • x + b}} ff(x)=ωx+b

几何解释:线性方程

ω ⋅ x + b = 0 ω\cdot x+b=0 ωx+b=0

  对应于特征空间 R n R^n Rn 中的一个超平面 S , 其中 ω超平面的法向量b超平面的截距

  这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为 正、负两类。因此,超平面 S称为分离超平面 (separating hyperplane) ,如图 2.1 所示。

2.2 感知机学习策略

2.2.1 数据集的线性可分性

  给定一个数据集T:

T = ( x l , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) T = {(x_l ,y_1), (x_2 ,y_2) ,… , (x_n,y_n)} T=(xl,y1),(x2,y2),,(xn,yn)

  其中 , x i ∈ X = R n , y i ∈ Y = ( + 1 , − 1 ) , i = 1 , 2 , … , n x_i \in X = R^n, y_i \in Y=(+1 ,-1) , i= 1 , 2,… , n xiX=Rn,yiY=(+1,1)i=12n

  如果存在某个超乎面 S

ω ⋅ x + b = 0 ω\cdot x+b=0 ωx+b=0

  能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,则称数据集 T 为线性可分数据集( linearly separable data set ) ;否则,称数据集 T 线性不可分

2.2.2 感知机学习策略

  假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开分离超平面
在这里插入图片描述

  损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面 S 的总距离

  • 输入空间 R n R^n Rn 中任一 x o x_o xo 到超平面 S S S 的 距离:

1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ \frac{1}{||w||}|w \cdot x_0+b| ∣∣w∣∣1wx0+b

  • 对于误分类的数据 ( x i , x i ) (x_i,x_i) (xi,xi) 来说,

− y i ( ω ⋅ x i + b ) > O -y_i(ω \cdot x_i+b)>O yi(ωxi+b)>O

  • ω • x i + b > 0 ω • x_i + b > 0 ωxi+b>0 时 , y i = − 1 y_i = -1 yi=1
  • ω • x i + b < 0 ω • x_i + b < 0 ωxi+b<0 时, x i = + 1 x_i = +1 xi=+1
  • 所有误分类点超平面 S总 距离

− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x 0 + b ) -\frac{1}{||w||}\sum_{x_i\in M}y_i(w \cdot x_0+b) ∣∣w∣∣1xiMyi(wx0+b)

  感知机 s i g n ( w • x + b ) sign(w • x + b) sign(wx+b) 学习的损失函数定义为:

L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x 0 + b ) L(w,b)=-\sum_{x_i\in M}y_i(w \cdot x_0+b) L(w,b)=xiMyi(wx0+b)

  其中 M 为误分类点的集合。

  这个损失函数就是感知机学习的经验风险函数。

2.3 感知机学习算法

  感知机学习问题转化为求解损失函数式的最优化问题,最优化的方法是随 机梯度下降法。

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

求参数 w , b w, b wb , 使其为以下损失函数极小化问题的解:

m i n w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) min_{w,b}L(w,b)=-\sum_{x_i\in M}y_i(w \cdot x_i+b) minw,bL(w,b)=xiMyi(wxi+b)

  其中 M 为误分类点的集合。

求解思路:

  • 感知机学习算法是误分类驱动的,具体采用随机梯度下降法 (stochastic gradient descent)。
  • 首先,任意选取一个超平面 w 0 , b 0 w_0,b_0 w0,b0 , 然后用梯度下降法不断地极小化目标函数(损失函数)
  • 极小化过程中不是一次使M 中所有误分类点的梯度下降,而是一次随机 选取一个误分类点使其梯度下降
  • 假设误分类点集合 M 是固定的,那么损失函数 L ( w , b ) L(w,b) L(w,b)梯度由下式给出:

∇ w L ( w , b ) = − ∑ x i ∈ M y i x i \nabla_w L(w,b)=-\sum_{x_i\in M}{y_ix_i} wL(w,b)=xiMyixi

∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla _b L(w,b)=-\sum_{x_i\in M}{y_i} bL(w,b)=xiMyi

  • 随机选取一个误分类点 ( x i , y i ) (x_i,y_i) xi,yi ω , b ω, b ωb 进行更新:

w ← w + η y i x i w\leftarrow w+ηy_ix_i ww+ηyixi

b ← b + η y i b \leftarrow b+ηy_i bb+ηyi

  式中 η ( 0 < η ≤ 1 ) η(0 <η\leq1) η(0<η1) 是步长,在统计学习中又称为学习率(learning rate) 。

在这里插入图片描述

  这种学习算法直观上有如下解释:

  当一个实例点被误分类,即位于分离超平面的 错误一侧时,则调整 ω, b 的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。

2.3.2 算法的收敛性

在这里插入图片描述

  定理表明,误分类的次数 k 是有上界的,经过有限次搜索可以找到将训练数据完 全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原 始形式迭代是收敛的。

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

  对偶形式的基本想法是,将 ω ω ω b b b 表示为实例 x i x_i xi标记 y i y_i yi线性组合的形式, 通过求解其系数而求得 ω ω ω b b b

在这里插入图片描述

  对偶形式中训练实例仅以内积的形式出现。

  为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的 Gram 矩阵 (Gram matrix):
G = [ x i ⋅ x i ] N × N G=[x_i \cdot x_i]_{N \times N} G=[xixi]N×N

实践:二分类模型(iris数据集)

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
%matplotlib inline
#load data
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
df.label.value_counts()
=========================
2    50
1    50
0    50
Name: label, dtype: int64

数据集可视化:

plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

在这里插入图片描述

data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
y = np.array([1 if i == 1 else -1 for i in y])

Perceptron

# 数据线性可分,二分类数据
# 此处为一元一次线性方程
class Model:def __init__(self):self.w = np.ones(len(data[0]) - 1, dtype=np.float32)self.b = 0self.l_rate = 0.1# self.data = datadef sign(self, x, w, b):y = np.dot(x, w) + breturn y# 随机梯度下降法def fit(self, X_train, y_train):is_wrong = Falsewhile not is_wrong:wrong_count = 0for d in range(len(X_train)):X = X_train[d]y = y_train[d]if y * self.sign(X, self.w, self.b) <= 0:self.w = self.w + self.l_rate * np.dot(y, X)self.b = self.b + self.l_rate * ywrong_count += 1if wrong_count == 0:is_wrong = Truereturn 'Perceptron Model!'def score(self):pass

训练

perceptron = Model()
perceptron.fit(X, y)
===============================
'Perceptron Model!'

分类&可视化

x_points = np.linspace(4, 7, 10)
y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]
plt.plot(x_points, y_)plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

在这里插入图片描述

scikit-learn实例

import sklearn
from sklearn.linear_model import Perceptron
===============
sklearn.__version__
'0.21.2'
clf = Perceptron(fit_intercept=True, max_iter=1000, shuffle=True)
clf.fit(X, y)
=================================
Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,fit_intercept=True, max_iter=1000, n_iter_no_change=5, n_jobs=None,penalty=None, random_state=0, shuffle=True, tol=0.001,validation_fraction=0.1, verbose=0, warm_start=False)
# Weights assigned to the features.
print(clf.coef_)
===============================
[[ 23.2 -38.7]]
# 截距 Constants in decision function.
print(clf.intercept_)
================================
[-5.]

可视化

# 画布大小
plt.figure(figsize=(10,10))# 中文标题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('鸢尾花线性数据示例')plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)
plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')# 画感知机的线
x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_ponits, y_)# 其他部分
plt.legend()  # 显示图例
plt.grid(False)  # 不显示网格
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

在这里插入图片描述

注意 !

在上图中,有一个位于左下角的蓝点没有被正确分类,这是因为 SKlearn 的 Perceptron 实例中有一个tol参数。

tol 参数规定了如果本次迭代的损失和上次迭代的损失之差小于一个特定值时,停止迭代。所以我们需要设置 tol=None 使之可以继续迭代:

clf = Perceptron(fit_intercept=True, max_iter=1000,tol=None,shuffle=True)
clf.fit(X, y)# 画布大小
plt.figure(figsize=(10,10))# 中文标题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('鸢尾花线性数据示例')plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)
plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')# 画感知机的线
x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_ponits, y_)# 其他部分
plt.legend()  # 显示图例
plt.grid(False)  # 不显示网格
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

在这里插入图片描述

现在可以看到,所有的两种鸢尾花都被正确分类了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web漏洞总结大全(基础)

前言 本文章是和cike_y师傅一起写的&#xff0c;cike_y博客&#xff1a;https://blog.csdn.net/weixin_53912233?typeblog 也欢迎大家对本文章进行补充和指正&#xff0c;共同维护这个项目&#xff0c;本文的github项目地址&#xff1a; https://github.com/baimao-box/Sum…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功&#xff0c;当返回值为0时表示成功&#xff0c;否则表示失败或异常&#xff08;非0值&#xff09;。使用专门的测试工具 test 命令&#xff0c;可以对特定条件进行测试&#xff0c;并…

VI / VIM的使用

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且 还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于 x win…

【Linux】糟糕,是心动的感觉——与Linux的初次相遇

初识Linux 导言一、计算机的发展1.1 历史背景1.2 计算机的发明 二、操作系统2.1 什么是操作系统&#xff1f;2.2 操作系统的诞生2.3 操作系统的发展2.3.1 批处理系统的发展2.3.2 分时系统2.3.3 实时系统2.3.4 通用操作系统 2.4 UNIX操作系统2.4.1 UNIX的诞生2.4.2 UNIX的发展 2…

Git学习 -- 分支合并、版本修改相关

目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的…

爬虫正则+bs4+xpath+综合实战详解

Day3 - 1.数据解析概述_哔哩哔哩_bilibili 聚焦爬虫&#xff1a;爬取页面中指定的页面内容 编码流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 数据解析 -> 持久化存储 数据解析分类&#xff1a;正则、bs4、xpath(本教程的重点) 数据解析原理概述&am…

2024年 全新 HTTP 客户端 你用了?

我们平时开发项目的时候&#xff0c;经常会需要远程调用下其他服务提供的接口&#xff0c;于是我们会使用一些 HTTP 工具类比如 Hutool 提供的 HttpUtil。SpringBoot 3.0 出了一个Http Interface的新特性&#xff0c;它允许我们使用声明式服务调用的方式来调用远程接口&#xf…

重磅!Salesforce推出UE+无限版餐套,企业如何选择?

孤立的应用程序和脱节的技术堆栈是所有企业的噩梦。目前&#xff0c;市场上产品和服务种类繁多&#xff0c;无缝集成和清晰、直接的购买流程可以决定整体体验的成败。 Salesforce云以及其他应用程序在过去几年中经历了巨大增长。随着越来越多的功能被捆绑在一起&#xff0c;Un…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

Tarjan 算法(超详细!!)

推荐在 cnblogs 上阅读 Tarjan 算法 前言 说来惭愧&#xff0c;这个模板仅是绿的算法至今我才学会。 我还记得去年 CSP2023 坐大巴路上拿着书背 Tarjan 的模板。虽然那年没有考连通分量类似的题目。 现在做题遇到了 Tarjan&#xff0c;那么&#xff0c;重学&#xff0c;开…

“趣味夕阳,乐享生活”小组活动(第二节)

立冬以来&#xff0c;天气日渐寒冷&#xff0c;气温变化较大&#xff0c;各种传染病多发&#xff0c;为进一步增强老年人冬季预防传染病保健意识及科学合理健康的生活方式。近日&#xff0c;1月22日&#xff0c;南阳市人人社工灌涨站开展了“趣味夕阳&#xff0c;乐享生活”小组…

【C++ | 数据结构】从哈希的概念 到封装C++STL中的unordered系列容器

文章目录 一、unordered系列容器的底层结构 - 哈希1. 哈希概念2. 哈希冲突 二、解决哈希冲突方法一&#xff1a;合理设计哈希函数&#x1f6a9;哈希函数设计原则&#x1f6a9;常见哈希函数 方法二&#xff1a;开闭散列&#x1f6a9;闭散列线性探测法&#xff08;实现&#xff0…

gradle打包分离依赖jar

正常打包的jar是包含项目所依赖的jar包资源&#xff0c;而且大多数场景下的依赖资源是不会频繁的变更的&#xff0c;所以实际把项目自身jar和其所依赖的资源分离可以实现jar包瘦身&#xff0c;减小上传的jar包总大小&#xff0c;能实现加速部署的效果 一 原本结构 二 配置buil…

第04章_IDEA的安装与使用(下)(IDEA断点调试,IDEA常用插件)

文章目录 第04章_IDEA的安装与使用&#xff08;下&#xff09;8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键1、已知快捷键操作名&#xff0c;未知快捷键2、已知快捷键&#xff0c;不知道对应的操作名 8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么…

<网络安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团&#xff08;证券代码&#xff1a;0022…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

freeRTOS总结(八)任务相关API函数

1&#xff0c; FreeRTOS任务相关API函数介绍&#xff08;熟悉&#xff09; UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) 获取任务优先级函数 此函数用于获取指定任务的任务优先级&#xff0c;使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1 void vTask…

用于垃圾回收的运行时配置选项

反馈 本文内容 指定配置的方法垃圾回收的风格管理资源使用情况大型页面 显示另外 4 个 此页面包含有关 .NET 运行时垃圾回收器 (GC) 设置的信息。 如果你要尝试让正在运行的应用达到最佳性能&#xff0c;请考虑使用这些设置。 然而&#xff0c;在特定情况下&#xff0c;默认…

【动态规划】C++ 算法458:可怜的小猪

作者推荐 视频算法专题 涉及知识点 动态规划 数学 力扣458:可怜的小猪 有 buckets 桶液体&#xff0c;其中 正好有一桶 含有毒药&#xff0c;其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药&#xff0c;你可以喂一些猪喝&#xff0c;通过观察猪是否…

精通 Spring REST API:最佳实践

概述 随着数字时代的推进&#xff0c;基于Web的程序已经成为构建交互式应用的关键。客户端与服务器之间的沟通频繁依赖于通过 APIs 获取的网络服务。 使用开源框架Spring&#xff0c;开发者可以有效率地搭建Web服务。本篇文章旨在展示如何利用Spring来构筑一个REST风格的Web服…