机器学习西瓜书笔记(十三) 第十三章半监督学习+代码

news2024/10/2 13:44:49

第十三章

  • 13 半监督学习
    • 13.1 未标记样本
      • 13.3.1 小结
    • 13.2 生成式方法
      • 13.2.1 小结
    • 13.3 半监督SVM
      • 13.3.1 小结
    • 13.4 图半监督学习
      • 13.4.1 小结
    • 13.5 基于分歧的方法
      • 13.5.1 小结
    • 13.6 半监督聚类
      • 13.6.1 小结
    • 13.7 代码:手写数据集上的标签传播-性能展示
    • 章末小结

13 半监督学习

13.1 未标记样本

在这里插入图片描述

13.3.1 小结

未标记样本在机器学习中指的是缺乏标签信息的数据,尽管它们不如标记样本直接有助于模型训练,但它们在数量上往往更为丰富,包含了关于数据分布的重要信息。为了利用这些未标记样本,研究者们开发了多种方法,包括主动学习、半监督学习、直推学习、生成式方法、半监督支持向量机、基于分歧的方法以及半监督聚类等。这些方法通过不同的策略来挖掘未标记数据的潜力,如主动学习通过选择性地获取样本标签来优化模型,半监督学习则直接结合少量标记样本和大量未标记样本进行训练,而基于分歧的方法则利用多个学习器之间的差异来提升性能。通过这些技术,我们能够在有限的标记数据条件下训练出性能更强的模型。

13.2 生成式方法

在这里插入图片描述

13.2.1 小结

生成式方法是一种半监督学习方法,它基于一个核心假设:所有数据(无论标记与否)都是由同一个潜在模型生成的。这意味着模型可以通过学习有标记数据来推测出未标记数据的标签。生成式方法通常先对联合概率分布P(x, c)进行建模,然后使用这个模型来推断条件概率P(c | x)。这些方法依赖于对潜在数据分布的准确假设,因此需要有较强的领域知识来确保假设的分布与真实分布相吻合。如果假设不准确,使用未标记样本可能会降低学习器的泛化性能。

在实践中,生成式方法可以通过极大似然估计和EM算法等技术来实现。例如,如果假设数据由高斯混合模型生成,那么可以通过EM算法来估计模型参数,包括未标记数据的标签。这种方法在参数迭代更新收敛后,可以计算出待预测样本属于每个类簇的后验概率,并选择概率最大的类簇作为预测结果 。

然而,生成式方法的性能很大程度上取决于潜在模型选择的准确性。如果选择的模型不能很好地反映数据的真实分布,那么包含未标记样本的学习过程可能会受到负面影响。因此,这类方法在实际应用中需要谨慎选择模型,并可能需要大量的领域知识来指导这一过程。

13.3 半监督SVM

在这里插入图片描述

13.3.1 小结

半监督支持向量机(S3VM)是一种在支持向量机基础上发展起来的算法,它结合了少量的标记样本和大量的未标记样本来提升分类性能。S3VM的目标是在数据的低密度区域寻找决策边界,以此同时优化有标签和未标记样本的分类效果。相比于传统的SVM,S3VM能够更有效地利用未标记数据来提高模型的泛化能力,尤其适用于标记数据稀缺的场景。尽管这种方法可能会增加过拟合的风险,但适当的参数调整可以确保模型具有良好的预测性能。S3VM及其变体在自然语言处理、计算机视觉和生物信息学等多个领域都有广泛的应用。

13.4 图半监督学习

在这里插入图片描述

13.4.1 小结

图半监督学习是一种利用数据点间关系构建图结构,并通过标签传播来预测未标记样本标签的机器学习方法。在这种框架下,每个数据点成为图中的一个节点,节点间的边反映了数据点间的相似性。该方法能够有效地利用少量标记样本的信息来指导大量未标记样本的学习过程,从而提高学习性能,特别适用于标记数据稀缺的实际应用场景,如社交网络分析和生物信息学。通过图结构,算法能够捕捉数据的内在结构,实现更准确的标签预测,并提升模型的泛化能力。

13.5 基于分歧的方法

与生成式方法、半监督SVM、图半监督学习等基于单学习器利用未标记数据不同,基于分歧的方法使用多学习器,而学习器之间的"分歧"对未标记数据的利用至关重要。

"协同训练"是此类方法的重要代表,它最初是针对"多视图"数据设计的,因此也被看作"多视图学习"的代表。在介绍协同训练之前,先看看什么是多视图数据。

在不少现实应用中,一个数据对象往往同时拥有多个"属性集",每个属性集就构成了一个"视图"。例如对一部电影来说,它拥有多个属性集:图像画面信息所对应的属性集、声音信息所对应的属性集、字幕信息所对应的属性集、甚至网上的宣传讨论所对应的属性集等。每个属性集都可看作一个视图。为简化讨论,暂且仅考虑图像画面属性集所构成的视图和声音属性集所构成的视图。于是,一个电影片段可表示为样本 ( < x 1 , x 2 > , y ) (<x^1,x^2>,y) (<x1,x2>,y),其中 x i x^i xi是样本在视图i中的示例,即基于该视图属性描述而得的属性向量,不妨假定 x 1 x^1 x1为图像视图中的属性向量, x 2 x^2 x2为声音视图中的属性向量;y是标记,假定是电影的类型例如"动作片"、"爱情片"等。 ( < x 1 , x 2 > , y ) (<x^1,x^2>,y) (<x1,x2>,y)这样的数据就是多视图数据。

假设不同视图具有"相容性",即其所包含的关于输出空间y的信息是一致的:令 y 1 y^1 y1表示从图像画面信息判别的标记空间, y 2 y^2 y2表示从声音信息判别的标记空间,则有 y = y 1 = y 2 y=y^1=y^2 y=y1=y2,例如两者都是{爱情片,动作片},而不能是 y 1 y^1 y1={爱情片,动作片},而$y^2={文艺片,惊悚片}。在此假设下,显式地考虑多视图有很多好处。仍以电影为例,某个片段上有两人对视,仅凭图像画面信息难以分辨其类型。但此时若从声音信息听到"我爱你",则可判断出该片段很可能属于"爱情片";另一方面,若仅凭图像画面信息认为"可能是动作片",仅凭声音信息也认为"可能是动作片",则当两者一起考虑时就有很大的把握判别为"动作片"。显然,在"相容性"基础上,不同视图信息的"互补性"会给学习器的构建带来很多便利。

协同训练正是很好地利用了多视图的"相容互补性"。假设数据拥有两个充分且条件独立视图,"充分"是指每个视图都包含足以产生最优学习器的信息,"条件独立"则是指在给定类别标记条件下两个视图独立。在此情形下,可用一个简单的办法来利用未标记数据:首先在每个视图上基于有标记样本分别训练出一个分类器,然后让每个分类器分别去挑选自己"最有把握的"未标记样本赋予伪标记,并将伪标记样本提供给另一个分类器作为新增的有标记样本用于训练更新……这个"互相学习、共同进步"的过程不断迭代进行,直到两个分类器都不再发生变化,或达到预先设定的迭代轮数为止。算法描述如图所示。若在每轮学习中都考察分类器在所有未标记样本上的分类置信度,会有很大的计算开销,因此在算法中使用了未标记样本缓冲池。分类置信度的估计则因基学习算法而异例如若使用朴素贝叶斯分类器,则可将后验概率转化为分类置信度;若使用支持向量机,则可将间隔大小转化为分类置信度。
在这里插入图片描述

协同训练过程虽简单,但令人惊讶的是,理论证明显示出,若两个视图充分且条件独立,则可利用未标记样本通过协同训练将弱分类器的泛化性能提升到任意高。不过,视图的条件独立性在现实任务中通常很难满足,因此性能提升幅度不会那么大,但研究表明,即便在更弱的条件下,协同训练仍可有效地提升弱分类器的性能。协同训练算法本身是为多视图数据而设计的,但此后出现了一些能在单视图数据上使用的变体算法,它们或是使用不同的学习算法,或使用不同的数据采样,甚至使用不同的参数设置来产生不同的学习器,也能有效地利用未标记数据来提升性能。后续理论研究发现,此类算法事实上无需数据拥有多视图仅需弱学习器之间具有显著的分歧(或差异),即可通过相互提供伪标记样本的方式来提升泛化性能;不同视图、不同算法、不同数据采样、不同参数设置等,都仅是产生差异的渠道面非必备条件。

基于分歧的方法只需采用合适的基学习器,就能较少受到模型假设、损失函数非凸性和数据规模问题的影响,学习方法简单有效、理论基础相对坚实、适用范围较为广泛。为了使用此类方法,而能生成具有显著分歧、性能尚可的多个学习器,但当有标记样本很少,尤其是数据不具有多视图时,要做到这一点并不容易,需有巧妙的设计。

13.5.1 小结

基于分歧的方法是半监督学习中的一种重要技术,它通过构建多个分类器(或称为学习器)并利用它们之间的分歧来利用未标记数据。这种方法的核心思想是,不同分类器对未标记样本的预测结果如果有较大分歧,那么这些样本很可能是进行进一步学习的关键。例如,在协同训练(Co-training)中,两个分类器各自在不同的视图上进行训练,并且相互利用对方的预测结果来提升自身的学习性能。此外,三体训练(Tri-training)是另一种基于分歧的方法,它使用三个分类器来处理单视图数据,通过“少数服从多数”的原则来决定如何利用未标记样本。这些方法在有标记样本较少时特别有用,因为它们能够有效地利用大量未标记的数据来提升模型的泛化能力。

13.6 半监督聚类

在这里插入图片描述

13.6.1 小结

半监督聚类是一种机器学习方法,通过结合少量的标记数据和大量的未标记数据来提升聚类任务的性能。它利用已知的标记信息,如类别标签或成对约束,来引导和优化聚类过程,从而使得聚类结果更加精确。这种方法在处理标记数据不足的实际问题时特别有用,已经广泛应用于生物信息学、图像处理、文本挖掘等多个领域。常见的半监督聚类算法包括基于约束的方法、基于距离的方法、基于图的方法和基于模型的方法等,它们通过不同的技术手段整合监督信息,以提高聚类的准确性和效率。随着研究的不断深入,半监督聚类算法在理论和实践上都在持续进步,展现出在大数据时代处理复杂聚类任务的重要价值。

13.7 代码:手写数据集上的标签传播-性能展示

本示例通过训练标签扩展模型来用很少的标签集对手写数字进行分类,展示了半监督学习的能力。

手写数字数据集共有1797个点。 该模型将使用所有点进行训练,但仅会标记30个点。 以混淆矩阵和一系列关于每个类的度量的形式的结果将是非常好的。

最后,将显示前10个最不确定的预测。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from sklearn import datasets
from sklearn.semi_supervised import LabelSpreading
from sklearn.metrics import confusion_matrix, classification_report

digits = datasets.load_digits()
rng = np.random.RandomState(2)
indices = np.arange(len(digits.data))
rng.shuffle(indices)

X = digits.data[indices[:340]]
y = digits.target[indices[:340]]
images = digits.images[indices[:340]]

n_total_samples = len(y)
n_labeled_points = 40

indices = np.arange(n_total_samples)

unlabeled_set = indices[n_labeled_points:]

#############################################################################
每一轮都打乱顺序
y_train = np.copy(y)
y_train[unlabeled_set] = -1

#############################################################################
通过LabelSpreading进行学习
lp_model = LabelSpreading(gamma=.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_set]
true_labels = y[unlabeled_set]

cm = confusion_matrix(true_labels, predicted_labels, labels=lp_model.classes_)

print("Label Spreading model: %d labeled & %d unlabeled points (%d total)" %
      (n_labeled_points, n_total_samples - n_labeled_points, n_total_samples))

print(classification_report(true_labels, predicted_labels))

print("Confusion matrix")
print(cm)

#############################################################################
计算每个转换分布的不确定性值
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)

#############################################################################
选择十大最不确定的标签
uncertainty_index = np.argsort(pred_entropies)[-10:]

#############################################################################
绘图
f = plt.figure(figsize=(7, 5))
for index, image_index in enumerate(uncertainty_index):
    image = images[image_index]

    sub = f.add_subplot(2, 5, index + 1)
    sub.imshow(image, cmap=plt.cm.gray_r)
    plt.xticks([])
    plt.yticks([])
    sub.set_title('predict: %i\ntrue: %i' % (
        lp_model.transduction_[image_index], y[image_index]))

f.suptitle('Learning with small amount of labeled data')

在这里插入图片描述

在这里插入图片描述

章末小结

这段文本提供了半监督学习领域的一个全面概述,包括未标记样本的重要性、生成式方法、半监督支持向量机(S3VM)、图半监督学习、基于分歧的方法以及半监督聚类等不同的半监督学习方法。此外,还提供了一个使用标签传播算法对手写数字数据集进行分类的Python代码示例。

  1. 未标记样本:介绍了未标记样本在机器学习中的作用和利用方法,如主动学习、半监督学习等。

  2. 生成式方法:讨论了基于数据由同一潜在模型生成的假设,通过极大似然估计和EM算法等技术实现。

  3. 半监督SVM:介绍了S3VM如何结合少量标记样本和大量未标记样本来提升分类性能。

  4. 图半监督学习:利用数据点间关系构建图结构,并通过标签传播来预测未标记样本标签。

  5. 基于分歧的方法:使用多个学习器之间的分歧来利用未标记数据,如协同训练和三体训练。

  6. 半监督聚类:通过结合少量的标记数据和大量的未标记数据来提升聚类任务的性能。

  7. 代码示例:提供了一个使用标签传播算法对手写数字数据集进行分类的Python代码示例,展示了半监督学习的能力。

代码解析:

  • 数据集:使用sklearn.datasets.load_digits()加载手写数字数据集。
  • 数据预处理:随机打乱数据顺序,将部分数据标记为未标记(-1)。
  • 模型训练:使用LabelSpreading模型进行训练。
  • 性能评估:通过混淆矩阵和分类报告评估模型性能。
  • 不确定性计算:计算每个样本的预测不确定性。
  • 结果展示:展示预测不确定性最高的前10个样本。

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

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

相关文章

netty之NettyServer群发消息

前言 在微信或者QQ的聊天中我们经常会用到一些群聊&#xff0c;把你的信息发送给所有用户。那么为了实现群发消息&#xff0c;在netty中我们可以使用ChannelGroup方式进行群发消息。如果为了扩展验证比如你实际聊天有不同的群&#xff0c;那么可以定义ConcurrentHashMap结构来存…

程计软考题2-编译、解释程序翻译阶段

(一) 编译器和解释器的工作阶段 1.编译和解释与源程序的区别 分析&#xff1a;编译和解释是语言处理的两种基本方式。 编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段&#xff0c;以及符号表管理和出错处理模块。 解释过程在词法、语…

Nuxt.js 应用中的 app:rendered 钩子详解

title: Nuxt.js 应用中的 app:rendered 钩子详解 date: 2024/10/2 updated: 2024/10/2 author: cmdragon excerpt: 摘要:本文详细介绍了 Nuxt.js 应用程序中的 app:rendered 钩子,包括其定义、调用时机、上下文信息以及通过实际案例展示如何记录性能和发送日志到服务器。 …

基于大数据的大屏高速公路收费系统的开发设计与实现SpringBoot+vue

目录 1. 需求分析 2. 技术选型 3. 系统架构设计 4. 开发实现 5. 代码示例和效果演示 6. 持续优化 由于我国高速公路的建设和发展与国外先进国家有很大差距。在高速公路建成后&#xff0c;收费系统往往选用国外的成熟产品。虽然这些产品在功能上基本满足了高速公路收费的要…

如何用JavaScript编写一个简单的计数器

在网页开发中&#xff0c;计数器是一种常见的功能&#xff0c;它可以帮助我们记录点击次数、显示时间等。下面我将介绍如何在HTML页面中使用JavaScript实现一个基本的计数器。如图&#xff1a; 1、 创建HTML结构 首先&#xff0c;我们需要创建一个基础的HTML结构来容纳我们的计…

影视cms泛目录用什么程序?苹果cms二次开发泛目录插件

影视CMS泛目录一般使用的程序有很多种&#xff0c;&#xff08;maccmscn&#xff09;以下是其中几种常见的程序&#xff1a; WordPress&#xff1a;WordPress是一个非常流行的开源内容管理系统&#xff0c;可以通过安装一些插件来实现影视CMS泛目录功能。其中&#xff0c;一款常…

matlab初学习记录

文章目录 内置函数与变量matlab 编辑器数组等间距向量数组函数数组索引提取多个元素 对向量执行数组计算查看文档 画图添加注释 实践导入数据关系运算符分支恒星运动 matlab 学习看入门之旅 先计算等号右边再计算等号左边。 工作区记录等号右边的变量。 ; 表示的是抑制输出。…

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…

编码能力提升计划 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一题)。 在小王刷题计划中,小王…

CSS样式基础样式选择器

目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例&#xff1a;使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例&#xff1a;使用类选择器为div添加背景色 1.代码 2.效果 3)id…

如何使用ssm实现影院管理系统的设计与实现

TOC ssm751影院管理系统的设计与实现jsp 研究背景与现状 时代的进步使人们的生活实现了部分自动化&#xff0c;由最初的全手动办公已转向手动自动相结合的方式。比如各种办公系统、智能电子电器的出现&#xff0c;都为人们生活的享受提供帮助。采用新型的自动化方式可以减少…

多处理器的概念与对比

SISD, SIMD, MISD, 和 MIMD 代表了并行计算的四种基本架构&#xff0c;它们描述了处理器如何处理指令和数据。 理解这些架构的关键在于区分指令流&#xff08;Instruction Stream&#xff09;和数据流&#xff08;Data Stream&#xff09;是单一的还是多重的。 1. SISD (Singl…

怎样过好国庆节

今天是2024年10月1号&#xff0c;国庆节&#xff0c;七天小长假&#xff0c;估计每个人都有自己的小计划。有想出去浪的&#xff0c;有想闭关修炼的&#xff0c;有想约会恋爱的&#xff0c;也有想回家看父母的&#xff0c;只要有事干&#xff0c;有想法&#xff0c;有行动&…

【JavaEE】——多线程常用类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;Callable和FutureTask类 1&#xff1a;对比Runnable 2&#xff1a…

多模态大模型 Qwen2-VL 下载、推理、微调实战案例来了

文章目录 技术交流Qwen2-VL 有什么新功能&#xff1f;模型结构模型效果模型下载模型推理模型微调 最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c…

c#增删改查 (数据操作的基础)

//数据操作无非4种 //增删改查 是数据操作的基础 int[] ints { 110, 120, 119 }; //1. 查 在这里就是获取数组中的数据 int num ints[1]; //将数组中的某个元素取出来 Console.WriteLine(num); //2. 改 将数据从…

【C++并发入门】opencv摄像头帧率计算和多线程相机读取(下):完整代码实现

前言 高帧率摄像头往往应用在很多opencv项目中&#xff0c;今天就来通过简单计算摄像头帧率&#xff0c;抛出一个单线程读取摄像头会遇到的问题&#xff0c;同时提出一种解决方案&#xff0c;使用多线程对摄像头进行读取。上一期&#xff1a;【C并发入门】摄像头帧率计算和多线…

Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页

注意&#xff01;&#xff01;&#xff01;博主只在测试环境试了一下&#xff0c;没有发到生产环境跑。因为代码还没写完客户说不用弄了( •̩̩̩̩&#xff3f;•̩̩̩̩ ) 也好&#xff0c;少个功能少点BUG 使用from size的时候发现存在max_result_window10000的限制&…

认知杂谈67《耐心!征服世界的秘籍》

内容摘要&#xff1a; 人生需家人朋友支持&#xff0c;自信源于解决问题的实力。别怕挫折&#xff0c;努力向前&#xff0c;反思自我。人生如游戏&#xff0c;靠自己打拼。学习要提升沟通、逻辑思维和时间管理等技能&#xff0c;读经典书籍&#xff0c;在平台学编程等&#xff…

ThreadLocal内存泄漏分析

一、ThreadLocal内存泄漏分析 1.1 ThreadLocal实现原理 1.1.1、set(T value)方法 查看ThreadLocal源码的 set(T value)方法&#xff0c;可以发现数据是存在了ThreadLocalMap的静态内部类Entry里面 其中key为使用弱引用的ThreadLocal实例&#xff0c;value为set传入的值。核…