机器学习(三)之监督学习2

前言:

本专栏一直在更新机器学习的内容,欢迎点赞收藏哦!

笔者水平有限,文中掺杂着自己的理解和感悟,如果有错误之处还请指出,可以在评论区一起探讨!

 1.支持向量机(Support Vector Machines,简称SVM)

1.1 前言

概念:

支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机

引入:

上一篇讲KRR时,我们也提到了一点SVM。在这一节中我们详细的说明一下这种方法。

优势:

  1. 对高维空间有效
  2. 当维度比样本数量大时还有效
  3. 使用训练集的子集,空间内存使用较少
  4. 具有通用性,可以指定不同的核函数

缺点:

  1. 如果维度比样本数量大很多时,注意避免过拟合。可以选择合适的核函数和正则化项(惩罚项)
  2. 不直接提供概率估计

1.2 分类

主要是三种分类算法:SVC(C-Support Vector Classification),NuSVC(Nu-Support Vector Classification)和LinearSVC(Linear Support Vector Classification)。我们就简单的来看一下,区别和使用方法。

区别:

SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同。

 • NuSVC中的nu参数(训练误差部分的上限和⽀持向量部分的下限,取值在(0,1)之间,默认是0.5)和SVC中的C参数(c越等于0,惩罚越大,准确率高,但容易过拟合);

 • LinearSVC是实现线性核函数的支持向量分类,没有kernel参数。

SVC代码:

import numpy as np
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScalerx = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
clf = make_pipeline(StandardScaler(), SVC(gamma='auto'))
clf.fit(x, y)
x_test = np.array([[-0.8, -1]])y_test = clf.predict(x_test)
x_line = np.linspace(-2, 2, 100)# 绘制训练集数据点
plt.scatter(x[:, 0], x[:, 1], c=y, cmap=plt.cm.Paired, label='Training Points')# 绘制决策边界
x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))  # 生成了一个二维的网格点坐标矩阵
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])  # 预测坐标范围内每个点的类别
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)  # cmap=plt.cm.Paired 指定了等高线的颜色映射# 绘制测试点
plt.scatter(x_test[:, 0], x_test[:, 1], c='red', marker='x', label='Test Point')plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Classification')
plt.legend()
plt.show()

 NuSVC代码:

import numpy as np
from sklearn.svm import SVC,NuSVC
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScalerx = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
clf = make_pipeline(StandardScaler(), NuSVC())
clf.fit(x, y)
x_test = np.array([[-0.8, -1]])y_test = clf.predict(x_test)
x_line = np.linspace(-2, 2, 100)# 绘制训练集数据点
plt.scatter(x[:, 0], x[:, 1], c=y, cmap=plt.cm.Paired, label='Training Points')# 绘制决策边界
x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))  # 生成了一个二维的网格点坐标矩阵
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])  # 预测坐标范围内每个点的类别
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)  # cmap=plt.cm.Paired 指定了等高线的颜色映射# 绘制测试点
plt.scatter(x_test[:, 0], x_test[:, 1], c='red', marker='x', label='Test Point')plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('NuSVC Classification')
plt.legend()
plt.show()

 LinearSVC代码:

import numpy as np
from sklearn.svm import LinearSVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification
import matplotlib.pyplot as pltX, y = make_classification(n_features=4, random_state=0)  #随机生成样本
clf = make_pipeline(StandardScaler(),LinearSVC(dual="auto", random_state=0, tol=1e-5))clf.fit(X,y)
coef=clf.named_steps['linearsvc'].coef_
intercept=clf.named_steps['linearsvc'].intercept_
x_test=np.array([[0,0,0,0]])
y_test=clf.predict(x_test)
from sklearn.decomposition import PCA# 将数据投影到二维平面
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# 训练 LinearSVC
clf.fit(X_pca, y)
# 投影测试点到二维空间
x_test_pca = pca.transform(x_test)# 绘制样本点
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap=plt.cm.Paired)# 绘制决策边界# 绘制测试点
plt.scatter(x_test_pca[:, 0], x_test_pca[:, 1], c='red', marker='x', label='Test Point')
# 获取系数和截距
coef = clf.named_steps['linearsvc'].coef_
intercept = clf.named_steps['linearsvc'].intercept_# 绘制样本点
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap=plt.cm.Paired)# 绘制决策边界
x_min, x_max = X_pca[:, 0].min() - 1, X_pca[:, 0].max() + 1
y_min, y_max = X_pca[:, 1].min() - 1, X_pca[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Linear SVM Decision Boundary (PCA)')
plt.show()

 这一部分不好画在二维图片上,我们使用了PCA降维技术,降维到平面上再显现在二维平面上的。相当于降维之后又训练了一遍,才能画出来的。

总结:

  • 数据线性可分,或者需要一个训练速度更快的模型,那么可以选择LinearSVC
  • 处理非线性问题,可以尝试使用SVC,并尝试不同的核函数
  • 想要一个介于SVC和LinearSVC之间的模型,你可以尝试使用NuSVC

1.3 回归

分为:SVR,NuSVR,LinearSVR。

方法和上面差不多,我们就不多讲了。

1.4 复杂度

之间

1.5 使用提示

  1. 避免数据拷贝:SVCSVRNuSVCNuSVR如果不按照特定方法输入,数据就会被拷贝一份。LinearSVCLogisticRegression任何numpy数组输入都会被拷贝。如果是大规模线性分类器且不想拷贝数据,可以使用SGDC.
  2. 核缓存大小:对SVCSVRNuSVCNuSVR,核缓存的大小对较大问题求解的运行时间有非常强的影响,如果你有足够内存,建议将cache_size设置为一个高于默认值200(MB)的值,比如500(MB)或1000(MB)。
  3. 设置C:默认情况下C设为1,这是一个合理的选择。如果样本中有许多噪音观察点,则应该减小这个值。这意味着对估计结果进行更严格的正则化。
  4. SVM算法会受数据取值范围的影响,所以强烈建议在使用之前对数据进行缩放

 1.6 核方法

 2.随机梯度下降算法(Stochastic Gradient Descent)

2.1 前言

优点:

  • 高效
  • 易于实现

缺点:

  • 需要调参
  • 对特征缩放非常敏感

警告:

在拟合数据之前一定要打乱训练数据(shuffle=True)并进行标准化(make_pipeline(StandardScaler(), SGDClassifier())) 

梯度下降和随机梯度下降的区别:

梯度下降(Gradient Descent):

  • 在梯度下降中,每次迭代都使用全部训练数据来计算损失函数的梯度,并更新模型参数。
  • 因为每次迭代都需要对整个数据集进行操作,所以在大数据集上训练时,梯度下降的计算开销会很大。
  • 梯度下降通常用于批量学习(Batch Learning)的情况下,其中数据集可以完全载入内存。

 随机梯度下降(Stochastic Gradient Descent,SGD):

  • 在随机梯度下降中,每次迭代只使用一个样本(或一小批样本)来计算损失函数的梯度,并更新模型参数。
  • 因为每次迭代只需要处理一个样本(或一小批样本),所以SGD的计算开销较小,特别适合于大数据集和在线学习(Online Learning)的场景。
  • 由于每次迭代只使用部分样本计算梯度,SGD的更新过程可能会更加不稳定,但同时也可能更快地找到局部最优解。

 小批量梯度下降(Mini-batch Gradient Descent):

  • 除了梯度下降和随机梯度下降外,还存在一种折中的方法,即小批量梯度下降。在每次迭代中,它使用一个小批量的样本来计算梯度。
  • 小批量梯度下降结合了梯度下降和SGD的优点,既可以利用并行计算加速训练,又不会因为单一样本的噪声导致更新过于不稳定

 总结:

GD和SGD主要区别为训练过程中使用的样本数量不同,GD需要大开销,SGD不稳定。

2.2 原理:

主要是通过计算样本的损失函数,迭代更新模型参数。让这个\theta不断变换(如下图公式),直到达到最大迭代次数或者损失函数收敛到某个值以内。

 误差函数有很多种可以按需挑选。

 2.3 复杂度

 2.4 使用提示

  1. 对数据进行缩放:将输入向量X上的每个特征缩放为[0,1]或[-1,+1],或将其标准化为均值为0和方差为1
  2. 找到合理的\alpha学习率
  3. SGD在观察了大约10^6个训练样本后收敛
  4. 如果将SGD应用于PCA提取的特征,通常明智的做法是将特征值通过某个常数c缩放,使训练数据的L2范数平均值等于1。
  5. 当特征很多或 eta0 很大时, ASGD(平均随机梯度下降) 效果更好。

先写这么多监督算法,后面再慢慢补充,可能还会补充朴素贝叶斯和决策树、特征选择。

大家可以先点赞关注,以后慢慢看哦!

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

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

相关文章

iTwin Capture Modeler-23中文版下载地址及安装教程

文章目录 一、iTwin Capture Modeler23中文版安装教程二、iTwin Capture Modeler23中文版下载地址一、iTwin Capture Modeler23中文版安装教程 1. 解压安装包。订阅专栏(可获取专栏内所有文章阅读权限与软件安装包)后,从文末获取安装包解压,如下所示: 2. 右击安装包,选择以…

【Web】HNCTF 2022 题解(全)

目录 Week1 Interesting_include 2048 easy_html What is Web Interesting_http easy_upload Week2 ez_SSTI easy_include ez_ssrf Canyource easy_unser easy_sql ohmywordpress Week3 ssssti Fun_php ez_phar QAQ_1inclu4e logjjjjlogjjjj …

图像哈希:Global+Local

文章信息 作者:梁小平,唐振军期刊:ACM Trans. Multimedia Comput. Commun. Appl(三区)题目:Robust Hashing via Global and Local Invariant Features for Image Copy Detection 目的、实验步骤及结论 目…

内网隧道技术总结

隧道技术解决的是网络通信问题,因为在内网环境下,我们不同的内网主机管理员会进行不同的网络配置,我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程,是可以是我们已经取得了一定的权限,在这…

NLP任务全览:涵盖各类NLP自然语言处理任务及其面临的挑战

自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域。NLP将非结构化文本数据转换为有意义的见解,促进人与机器之间的无缝通信,使计算机能够理解、解释和生成人类语言。人类等主要…

(四)openlayers加入矢量图层.json文件

openlayers加入矢量图层.json文件 (1)接上一章节,添加矢量图层.json文件。首先下载.json矢量图层文件。链接:JSON矢量图层文件 (2)导入相关的依赖,提前把你下载好的矢量文件放入assets文件夹下…

巧用波卡生态优势,Mythical Games 引领 Web3 游戏新航向

Polkadot 对创新、安全和治理的承诺为 Mythical Games 提供了极大的发展价值。这个链上生态不仅将支持 Mythical Games 成长发展,还将帮助其他 Mythos 合作伙伴来壮大建设项目。 —— Mythical Games 创始人兼首席执行官 John Linden 近期 Web3 游戏行业又有新动向&…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间,全部删掉了,今天看到 microk8s 更新了 1.30 版本,果断更新,结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到,所有的业…

JS -关于对象相关介绍

在JS中,除去基本的数据类型,还有包含对象这种复合数据类型,他可以储存多个键值对,并且每个键都是唯一的,并且在对象中可以包含各种数据类型的值,包括其他对象,数组,函数等。对象是Ja…

LeetCode in Python 72. Edit Distance (编辑距离)

编辑距离的基本思想很直观,即不断比较两个单词每个位置的元素,若相同则比较下一个,若不同则需要考虑从插入、删除、替换三种方法中选择一个最优的策略。涉及最优策略笔者最先想到的即是动态规划的思想,将两个单词的位置对应放在矩…

Vue2 移动端(H5)项目封装弹窗组件

前言 因vant-ui的dialog组件没有自定义footer插槽 效果 参数配置 1、代码示例&#xff1a; <t-dialog :visible.sync"show" :title"title" submit"submit"></t-dialog>2、配置参数&#xff08;t-dialog Attributes&#xff09; 参…

IS62C256AL-45TLI功能参数介绍及如何优化性能

IS62C256AL-45TLI功能和参数介绍及如何优化性能-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 访问时刻:45 ns 接口类型:Parallel 电源电压-最大:5.5 V 电源电压-最小:4.5 V 电源电流—最大值:25 mA 最小…

JumpServer搭建堡垒机实战

文章目录 第一步、下载安装第二步、访问异常处理【1】docker方式拉取失败 JumpServer是运维人员可连接内部服务器上进行操作&#xff0c;支持Linux等操作系统的管理工具。 第一步、下载安装 curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/…

OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 需求说明 一般用到FFT&#xff0c;就涉及到复数的计算&#xff0c;为了便于调用&#xff0c;我自行封装了一个简单的复数矩阵点乘…

如何用网页绘制一个黑莓9900的键盘效果图

如何用网页绘制一个黑莓9900的键盘效果图 入了几个黑莓蓝牙键盘&#xff0c;出于喜好&#xff0c;想做一个跟实体键盘一模一样的网页界面。 最终的实现效果是这样的&#xff1a; 在线查看&#xff1a;http://kylebing.cn/tools/bb-keyboard 点击上面四个按键显示不同模型界面…

Linux 网络操作命令Telnet

Telnet 尽管 Telnet 已经逐渐被更安全的 SSH 协议所取代&#xff0c;但在某些特定场景下&#xff0c;如对旧系统的维护或教育目的&#xff0c;Telnet 仍然有其使用价值。本文将介绍如何在 Linux 系统中安装 Telnet 客户端&#xff0c;以及如何使用它进行远程登录。 用户使用 t…

Activiti——将绘制的流程图存入act数据库并进行流程推进与状态流转

文章目录 前言流程图入库操作 RepositoryService项目结构数据库连接配置文件入库Java测试代码zip 方式进行流程的批量部署 流程启动 RuntimeService待处理任务查看 TaskService流程状态的扭转查询流程定义信息 RepositoryService查询正在执行的流程实例 RuntimeService已部署流…

Springboot+Vue项目-基于Java+MySQL的在线文档管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

实测14us,Linux-RT实时性能及开发案例分享—基于全志T507-H国产平台

本文带来的是基于全志T507-H&#xff08;硬件平台&#xff1a;创龙科技TLT507-EVM评估板&#xff09;&#xff0c;Linux-RT内核的硬件GPIO输入和输出实时性测试及应用开发案例的分享。本次演示的开发环境如下&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Window…

在 Linux 上通过 udev 规则绑定 ttyUSB 设备的相对地址

文章目录 问题描述解决方案1. 分辨当前 USB 设备的绝对地址2. 使用绝对地址查看设备属性3. 使用 udev 规则绑定设备到相对地址3.1. 区分多个不同型号 USB 设备3.2. 区分多个相同型号 USB 设备 问题描述 Linux 系统开机时会随机为连接的 USB 设备随机分配 /dev/ttyUSB* 这样的绝…