半监督学习

article/2025/3/15 21:09:09

1. 介绍

1.1 什么是半监督学习

  所给的数据有的是有标签的,而有的是没有标签的。常见的两种半监督的学习方式是直推学习(Transductive learning)和归纳学习(Inductive learning)。
  直推学习(Transductive learning):没有标记的数据是测试数据,这个时候可以用test的数据进行训练。这里需要注意,这里只是用了test数据中的feature而没有用label,所以并不是一种欺骗的方法。
  归纳学习(Inductive learning):没有标签的数据不是测试集。
  在实际中,是使用直推学习还是归纳学习主要取决于你在训练自己的模型时,你的测试数据是否已经给出了。如果已经给出了,那么是可以使用的。

1.2 为什么使用半监督学习

  (1) 实际中缺乏的不是数据,而是带标签的数据。给收集的数据进行标记是昂贵的。
  (2) 在我们的一生中都在进行半监督学习。

1.3 为半监督学习是有帮助的

  虽然没有标签的数据并不会提供标签,但是它提供了关于数据分布的一种信息。即没有标签的数据的分布会给我们提供一些信息,但是所给出的信息通常实在一些假定的条件下实现的。也就是说假设决定了半监督学习是否可以使用!

1.4 本文的主要内容

  本文的主要内容是四个部分:生成模型中的半监督学习、低密度分离假设、平滑性假设、更好的表示。本文将介绍前三节内容,最后一部分内容将在之后的博客中介绍。

2. 生成模型中的半监督学习(Semi-supervised Learning for Generative Model)

  在监督学习中,生成模型的数据有 C1 C 1 C2 C 2 两类数据组成,我们统计数据的先验概率 P(C1) P ( C 1 ) P(x|C1) P ( x | C 1 ) 。假设每一类的数据都是服从高斯分布的话,我们可以通过分布得到参数均值 μ1,μ2 μ 1 , μ 2 和方差 Σ Σ

利用得到参数可以知道 P(C1)P(x|C1)μ1,μ2Σ P ( C 1 ) , P ( x | C 1 ) , μ 1 , μ 2 , Σ ,并利用这些参数计算某一个例子的类别

  在非监督学习中,如下图所示,在已知类别的数据周围还有很多类别未知的数据,如图中绿色的数据。

这个时候如果仍在使用之前的数据分布明显是不合理的们需要重新估计数据分布的参数,这个时候可能分布式一个类似于圆形的形状。这里就需要用为标签数据来帮助估计新的” P(C1)P(x|C1)μ1,μ2Σ P ( C 1 ) , P ( x | C 1 ) , μ 1 , μ 2 , Σ ”。具体可以采用如下的EM算法进行估计

首先对参数进行初始化,之后利用参数计算无标签数据的后验概率;然后利用得到的后验概率更新模型参数,再返回step1,循环执行直至模型收敛。这个算法最终会达到收敛,但是初始化对于结果的影响也很大。

3. 低密度分离(Low-density Separation)

  低密度分离假设就是假设数据非黑即白,在两个类别的数据之间存在着较为明显的鸿沟,即在两个类别之间的边界处数据的密度很低(即数据量很好)。

3.1 自训练(Self-training)

  自训练的方法十分直觉,它首先根据有标签的数据训练出一个模型,将没有标签的数据作为测试数据输进去,得到没有标签的数据的一个为标签,之后将一部分的带有伪标签的数据转移到有标签的数据中,在进行训练,循环往复。其中选取哪一部分的伪标签数据转移至有标签数据需要自己定义,甚至可以自己提供一个权重。具体的过程如下图所示

  在这里还有两个问题需要注意,首先自训练的方法是否可以用到回归问题中?答案是否定的。因为即使加入新的数据对于模型也没有什么改进。

  之前讲的生成模型与后来讲的自训练模型之间是很相似的,区别在于生成模型采用的是软标签,而自训练采用的是硬标签,那么问题来了,自训练模型是都可以使用软标签呢?答案是否定的,如下图所示

因为不对标签进行改变的话,将这些放入带标签的数据中对于数据的输出一点改进都没有,输出的还是原来的数据。

3.2 基于熵的正则化

  这种方法是自训练的进阶版,因为之前如果直接根据用有标签数据训练出来的模型直接对无标签数据进行分类会有一些武断,这里采用一种更严密的方法。

因为在低密度假设中认为这个世界是非黑即白的,所以无标签数据的概率分布应该是区别度很大的,这里使用熵来表示。将其加入损失函数中个可以看到,这个实际上可以认为是一项正则化项,所以也叫基于熵的正则化。训练的话,因为两个部分都是可微分的,所以直接使用梯度下降就可以进行训练。

4. 平滑性假设

  白话性假设:如果输入 x x 是相似的,那么它们的标签值 y^ 同样应该是相似的。但是这样的假设不够精确,所以有下面的严格的假设:
  (1) x x 的分布是不均匀的,在有的地方是稀疏的,在有的地方是密集的
(2) 如果在高密度区域比较相近,那么这两个数据具有相同的标签。
可以如下图进行进一步解释

在距离上虽然 x2 x3 x 3 的距离更接近,但是 x2 x 2 x1 x 1 位于同一个高密度的区域中。可以认为同一个高密度区域之间的数据可以很好的接触连接,具有相同的标签值,而不同的高密度区域无法相互接触,所以标签值不相同。

4.1 先聚类再标注

  一种直观的方法是首先对数据进行聚类,看没有标签的数据落在哪一个部分,然后对其及进行标注,如下图所示

但是如果是对图像进行操作的话,无法单纯用像素对图像进行聚类,这样的聚类方法往往是不好的,这个时候可以采用 deep autoencoder 的方法提取图像的特征,利用特征对图像进行聚类,会得到较好的结果。

4.2 基于图的方法

  将所有的数据点建成一个图,如果在图上两个点之间可以连通,那么他们之间标签就是相同的。那么如何形成图呢,有些图是天然的,比如说网页之间的连接,或者论文之间的相互引用,但有的时候需要自己建图。

参考

[1]Machine Learning (2016,Fall)-National Taiwan University (NTU)


http://chatgpt.dhexx.cn/article/KoeEZ0EU.shtml

相关文章

半监督学习(SEMI-Supervised Learning)

半监督学习的工作原理 想象一下,收集了大量未标记的数据,您想在这些数据上训练模型。手动标记所有这些信息可能会花费你一大笔钱,除了需要几个月的时间来完成注释。这时候半监督机器学习方法就派上用场了。工作原理很简单。无需将标签添加到…

半监督学习概述

1、半监督学习 今天在阅读一篇论文时了解了这个之前一直不太清晰的概念。下面是查阅了相关资料后对半监督学习的理解。如有错误,望更正。 半监督学习是一种介于监督学习和无监督学习之间的学习凡是,我们都知道,在监督学习中,样本…

JS中使数组倒序排列

使用reverse方法 注意:reverse方法会使得原数组发生变化

JS实现数组和数组对象倒序(reverse方法)

const arr1 [{a:1},{b:2},{c:3},{d:4}]; const arr2 [1,2,3,4,5,6,7]; console.log(倒序前,arr1,arr2); arr1.reverse(); arr2.reverse(); console.log(倒序后,arr1,arr2);

js实现数组翻转(倒序输出)

//倒序排列var arr[2,30,1,9,5,7];var brrarr.reverse();for(var i0;i<brr.length;i){document.write(brr[i]);}console.log(brr);//控制台也能看到数组的输出

js实现数组元素的倒序

模拟循环录入采集名单存储到数组中并编码实现数组元素的倒序查看名单 :例如数组原名单: A B C D E ,倒序后展示为: E D C B A 运行后的结果如下图所示&#xff1a;

JS数组对象的正序、倒序和根据中文首字母排序

//数组对象方法排序:升序 sortByKey(array,key){return array.sort(function(a,b){var xa[key];var yb[key];return ((x<y)?-1:((x>y)?1:0));}); },//数组对象方法排序:降序 sortDownByKey(array,key){return array.sort(function(a,b){var xa[key];var yb[key];return…

js中数组反向、排序reverse、sort

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; js系列教程1-数组操作全解 js中数组反向、排序 数组反向使用reverse函数&#xff0c;数组排序使用sort函数&#xff0c;排序函数可以传入比较函数&#xff0c;也可以修改数组圆形&#xff0c;自定义添加排序…

数组倒序排序

Array.reverse()&#xff0c;数组元素的排序排列 今天做项目的时候遇到了一个需求&#xff0c;把下单字段的时间倒序排列&#xff0c;也就是最新的时间显示在前面&#xff0c;像这样 因为这个字段是一个数组元素&#xff0c;所以就想到了让数组元素倒序排列&#xff0c;然后就…

js数组排序,数组按照某个字段正序倒序排序方法,sort()

话不多说直接看案例哈 比如后端返回了一个数组集合&#xff0c;需要吧默认选项放在第一条 let arr [{isDefault: 0},{isDefault: 0},{isDefault: 1},{isDefault: 0}]arr.sort((a,b)> a.isDefault-b.isDefault)console.log(arr,正序)输出结果&#xff1a;正序&#xff0c;从…

js-实现数组翻转(倒序)

源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>翻转数组</title></head><body><script>var arr[1,2,3,4,5,6,7,8];var newArr [];console.log(arr);for(var iarr.length-1;…

js 数组倒序排列

1.使用reverse()函数&#xff1a; var array[我,喜,欢,你];array.reverse(); // 输出&#xff1a; ["你", "欢", "喜", "我"]2.循环遍历一一使其倒序&#xff1a; var array[我,喜,欢,你];var temp;for(let i0; i<array.length/2;…

重磅!超详细的 JS 数组方法整理出来了

作者&#xff1a;Yushia https://juejin.cn/post/6907109642917117965 数组是 js 中最常用到的数据集合&#xff0c;其内置的方法有很多&#xff0c;熟练掌握这些方法&#xff0c;可以有效的提高我们的工作效率&#xff0c;同时对我们的代码质量也是有很大影响。 一、创建数组 …

VS Code字体总是安装不上,vscode字体安装

VS Code字体安装&#xff0c;顽固版本 tmd&#xff0c;Vs Code老是把l看成i或者是1急死了首先要下载字体&#xff0c;下载好安装对应的字体&#xff0c;windows字体文件一般是ttf&#xff0c;安装好之后 这里有免费的供开发编程使用的字体 —》链接 下载好之后&#xff0c;解压…

VsCode字体颜色修改和背景图片修改 字体高亮

1.打开VS Code编辑器&#xff0c;在编辑器中设置。根据以下步骤&#xff0c;打开settin.json文件。 2.在json文件中若有代码覆盖即可没有代码直接添加下面代码。看注释可以自定义设置喜欢的颜色。 {//设置用户选中代码段的颜色"workbench.colorCustomizations": {/…

VScode字体超大怎么改回来?

VScode字体超大怎么改回来&#xff1f; 改背景图时不小心把字体设置的超大了&#xff0c;而且还是失去焦点自动保存了&#xff0c;难受… 网上一搜&#xff0c;真不好搜&#xff0c;答案有两种 借图一用&#xff08;本人比这个还严重&#xff0c;鼠标已经滚动不了了&#xff…

ubuntu系统下vscode字体显示异常(别扭)

修改办法 文件 》 首选项 》 设置 查找框中输入 Font 显示如下&#xff1a; 修改Font Family&#xff1a; 将&#xff1a;‘Droid Sans Mono’, ‘monospace’, Droid Sans Fallback’改为&#xff1a; monospace 如果windows和ubuntu是同一个账号&#xff0c;必须取消同步&…

vscode程序员推荐字体

今天推荐一款vscode字体:Anonymous-Pro 绝对的轻量 点击前往下载 GITHUB LIGHT Anonymous-Pro GITHUB LIGHT Anonymous-Pro GITHUB DARK Anonymous-Pro GITHUB DARK Anonymous-Pro 设置步骤: 1.打开vscode 2.依次到文件->首选项->设置 3.修改字体为 Anonymous P…

vscode字体/界面无意间变得超大,一招调回,完美解决

一、情况如下 在网上解决方法搜了半天&#xff0c;各种试都不顶事 &#xff0c;正准备卸载重载&#xff0c;又不甘心弄了几下&#xff0c;终于回来了&#xff0c;太好了&#xff01;&#xff01;&#xff01; 下面也将此方法分享给各位正在被这个问题困扰的家人们&#xff0c;希…