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

news2024/12/25 23:23:36

前言:

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

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

 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 StandardScaler

x = 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 StandardScaler

x = 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 plt

X, 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.coloradmin.cn/o/1615060.html

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

相关文章

第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天 一、PHP留言板前后端功能实现 开发环境: DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 二、数据库创建&架…

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案: 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池,就不得不说 ThreadPoolExecutor,它是 Java 并发包 java.util.concurrent 中的一个类,提供一个高效、稳定、灵活的线程池实现,用于实现多线程并发执行任务,提高应用程序的执行效率。 在《任…

JVM与GC原理

JVM运行流程 Java 虚拟机(Java Virtual Machine,JVM)是 Java 平台的核心组件之一,它是一个在实际硬件和操作系统上模拟运行 Java 字节码的虚拟计算机 Java 程序被执行的顺序通常包括以下几个步骤: 编辑(E…

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动,不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1:加入Discord 访问Midj…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐(AI写歌)的时候,你是不是有这样的困惑: &…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目,它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上,只要有浏览器和网络连接,就可以访问和使用 Visual Studio Code&…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果,再通过grafana采集influxdb数据库数据,完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版: &#xff0…

AI预测体彩排列3第2套算法实战化测试第1弹2024年4月22日第1次测试

从今天开始,开始新一轮的测试,本轮测试,以6码为基础,同步测试杀号情况,争取杀至4-5码。经过计算,假如5码命中,即每期125注,投入250元,十期共计2500元,则命中率…

06 JavaScript学习:语句

JavaScript 语句是用来执行特定任务或操作的一组指令。它可以包括变量声明、条件语句、循环语句、函数调用等。JavaScript 语句以分号结尾,每个语句都会被解释器执行。 分号 ; 在JavaScript中,分号(;)用于表示语句的结束。尽管在…

一款pdf工具

下载链接:点击跳转; 它是一个installer,下好它之后,把网断掉,然后双击它,他会默认安装在C盘,安装时,浏览器可能会有一个弹窗,直接关掉并进入任务管理器杀掉所有smallerp…

漫谈HAMR硬盘的可靠性-1

随着云计算、AI应用、大数据分析等领域对存储需求的持续增长,HAMR技术正逐步引领HDD行业进入新的发展阶段。目前,业内已经有了基于HAMR技术的大容量硬盘,并计划在未来几年内进一步提高至40TB甚至更高容量。 希捷在之前财报中透露,…

C语言结构体,枚举,联合

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 第八章 详解数据在内存中的存储 第九章 C语言指针进阶 文章目录 1. 结构体 1.1 声明结构…

xhEditor实现WORD粘贴图片自动上传

1.下载示例: 从官网下载 http://www.ncmem.com/webapp/wordpaster/versions.aspx 从gitee中下载 https://gitee.com/xproer/wordpaster-php-xheditor1x 2.将插件目录复制到项目中 3.引入插件文件 定义插件图标 初始化插件,在工具栏中添加插件按钮 效果…

面向对象目录总结

【零】思维导图 【一】初识面向对象 Python 初识面向对象-CSDN博客 【二】面向对象-封装 Python 面向对象之封装和装饰器property_面向对象python封装property-CSDN博客 【三】面向对象-继承 Python 面向对象之继承和组合_面向对象 组合 继承-CSDN博客 【四】面向对象-多…

YOLOv9改进策略 | Conv篇 | 利用 Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)

一、本文介绍 本文给大家带来的改进机制是Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)在小波变换中,Haar小波作为一种基本的小波函数,用于将图像数据分解为多个层次的近似和细节信息,这是一种多分…

6.搭建Eureka

eureka-server自己也是一个微服务&#xff0c;所以eureka-server在启动的时候也会将自己注册到eureka上。eureka集群的时候&#xff0c;会将多个eureka相互注册&#xff0c;这个时候&#xff0c;defaultZone的值会有多个&#xff0c;用逗号隔开。 <?xml version"1.0&…

Mac读写U盘软件哪个好用 Mac读写U盘很慢怎么解决 macbookpro读取u盘

在使用Mac电脑时&#xff0c;读写U盘是一个常见的需求&#xff0c;特别是当U盘格式为NTFS时。选择适合的软件来实现这一操作至关重要。下面我们来看Mac读写U盘软件哪个好用&#xff0c;Mac读写U盘很慢怎么解决的相关内容。 一、Mac读写U盘软件哪个好用 在Mac上选择一款适合的…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…