【字典学习+稀疏编码Sparse Encoding】简单介绍与sklearn的实现方式

news2024/11/25 18:40:22

文章目录

  • 1、字典学习与稀疏编码
  • 2、sklearn的实现
  • 3、示例

1、字典学习与稀疏编码

  • 简单来说,稀疏编码就是把输入向量(信号)/ 矩阵(图像)表示为稀疏的系数向量和一组超完备基向量(字典)的线性组合。
  • 因此,稀疏编码通过上述方式以后,就可以将输入数据重构为稀疏的向量:即向量内部元素满足只有很少的几个非零元素或只有很少的几个远大于零的元素。
  • 一般情况下要求超完备基向量的个数k非常大(远大于输入数据的维度n),因为这样的基向量组合才能更容易的学到输入数据内在的结构和特征。
  • 为什么要转换为稀疏向量?

1)特征选择(Feature Selection): 直接对原始图像提取的特征很多情况下其实是有冗余成分的,就是说我们只需要关键特征识别就可以,没有必要用那么多特征,更多情况下,那些冗余信息会干扰我们最后的识别结果!而稀疏编码可以实现特征的自动选择,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
2)可解释性(Interpretability):另一个青睐于稀疏的理由是,模型更容易解释,即只有那几个关键特征会影响最终的结果,更容易解释。

例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。

  • 更多的稀疏编码的解释见该博客:https://blog.csdn.net/Julialove102123/article/details/78349811

2、sklearn的实现

  • 通过MiniBatchDictionaryLearning来实现字典学习与稀疏编码
class sklearn.decomposition.MiniBatchDictionaryLearning(n_components=None, *, alpha=1, n_iter='deprecated',
max_iter=None, fit_algorithm='lars', n_jobs=None, batch_size=256, shuffle=True, dict_init=None,
transform_algorithm='omp', transform_n_nonzero_coefs=None, transform_alpha=None, verbose=False,
split_sign=False, random_state=None, positive_code=False, positive_dict=False, transform_max_iter=1000,
callback=None, tol=0.001, max_no_improvement=10)

1)n_components:int, default=None,要提取的字典中每个基向量/atoms的个数,每个基向量的维度应该为输入向量的维度,因此字典的维度应该是(n_components, n_features)
2)alpha:float, default=1,正则化项(Lasso回归项)的权重,用于平衡稀疏性和重构误差
3)n_iter:int, default=1000,迭代的总次数,1.1版本弃用,改用max_iter
4)max_iter:int, default=None,迭代的最大次数(早停策略之前),不为None时,n_iter将被忽略
5)fit_algorithm:{‘lars’, ‘cd’}, default=’lars’,解决优化问题的算法(首先使用fit算法训练出字典), 默认为lars,最小角度回归
6)n_jobs:int, default=None,并行jobs的数量,默认为None,就是1
7)batch_size:int, default=256,每个mini-batch中的样本数量
8)shuffle:bool, default=True,在构建batch之前是否打乱样本
9)dict_init:ndarray of shape (n_components, n_features), default=None,字典的初始化值
10)transform_algorithm:{‘lasso_lars’, ‘lasso_cd’, ‘lars’, ‘omp’, ‘threshold’}, default=’omp’,用于变换数据的算法,即该算法用于学习每个样本的稀疏的系数向量(即稀疏编码的结果),再对原始输入数据进行变换。每个样本的稀疏向量的维度应该等于字典中的基向量的个数,即n_components,因此对输入数据变换后的维度应该是(n_samples,n_components),每个向量都具有稀疏性。
11)transform_n_nonzero_coefs:int, default=None,在解的每一列中非零系数的数目。这只适用于algorithm='lars’和algorithm=‘omp’。如果None,则transform_n_nonzero_coefs=int(n_features / 10)。
12)transform_alpha:float, default=None,如果algorithm='lasso_lars’或algorithm=‘lasso_cd’, alpha是应用于L1范数的惩罚。如果algorithm=‘threshold’, alpha是阈值的绝对值,低于该阈值,系数将被压扁为零。如果为None,默认为alpha。
13)split_sign:bool, default=False,是否将稀疏特征向量拆分为其负部分与正部分的拼接。这可以提高下游分类器的性能。
14)random_state:int, RandomState instance or None, default=None,当dict_init未被指定时,用于初始化字典
15)positive_code:bool, default=False,是否强制编码为正
16)positive_dict:bool, default=False,是否强制字典为正
17)transform_max_iter:int, default=1000,如果algorithm=‘lasso_cd’或’lasso_lars’,执行的最大迭代次数。

  • 该类的成员变量:
    在这里插入图片描述

  • components_是学习到的字典,[n_components, n_features],表示有n_components个基向量/atom,每个基向量的维度等于输入向量的维度

  • 该类常用的的方法为:
    在这里插入图片描述

1、fit(X, y=None)
拟合X中的数据,即学习到shape为[n_components, n_features]的字典
X:待学习/待训练的样本,[n_samples, n_featues]的ndarray
返回MiniBatchDictionaryLearning类实例本身

2、transform(X)
将数据X编码为字典atom/基向量的稀疏组合,返回的就是稀疏编码的结果
X:待编码的样本,[n_samples, n_featues]的ndarray
返回:编码后的结果,[n_samples, n_components]的ndarray,需要先进行fit后学习到字典再进行稀疏编码

3、fit_transform(X)
字典学习+稀疏编码,就是上述两个函数的结合
X:待学习/待训练的样本,[n_samples, n_featues]的ndarray
返回:编码后的结果,[n_samples, n_features_new]的ndarray

3、示例

  • 先使用make_sparse_coded_signal构建训练样本X,是由dictionary和code相乘得到的
    在这里插入图片描述
  • 构建字典学习/稀疏编码 dict_learner,学习到的字典为:
    在这里插入图片描述
  • 最后对输入数据进行变换:
    在这里插入图片描述
import numpy as np
from sklearn.datasets import make_sparse_coded_signal
from sklearn.decomposition import MiniBatchDictionaryLearning

X, dictionary, code = make_sparse_coded_signal(n_samples=100, n_components=300, n_features=20,
                                               n_nonzero_coefs=10, random_state=42)

dict_learner = MiniBatchDictionaryLearning(n_components=300, batch_size=4, transform_algorithm='lasso_lars',
                                           transform_alpha=0.1, random_state=42, shuffle=False)
X_transformed = dict_learner.fit_transform(np.transpose(X))
print(X_transformed)

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

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

相关文章

BeanFactory与Applicationcontext(1)

BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。BeanFactory是spring的“心脏”,核心容器,它也是Applicationcontext的父接口。 BeanFactory实质上并未提供过多的方法,spring容器的I…

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…

通达信接口调用过程需要借助什么?

通达信接口是一种用于获取、传输和处理股票市场相关数据的软件接口,以提供了一种连接股票市场数据源和数据使用者之间的通道,允许开发者通过编程方式获取股票行情数据、交易数据和相关信息等。如果调用通达信接口,需要借助以下几个方面的工具…

9-AJAX-1入门

AJAX 目录 AJAX 概念和 axios 使用认识 URLURL 查询参数常用请求方法和数据提交HTTP协议-报文接口文档案例 - 用户登录form-serialize 插件 01.AJAX 概念和 axios 使用 目标 了解 AJAX 概念并掌握 axios 库基本使用 讲解 什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest…

前后端分离------后端创建笔记(06)新增接口页面布局

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

[PyTorch][chapter 50][创建自己的数据集 2]

前言: 这里主要针对图像数据进行预处理.定义了一个 class Pokemon(Dataset) 类,实现 图像数据集加载,划分的基本方法. 目录: 整体框架 __init__ load_images save_csv divide_data __len__ denormalize __g…

[NepCTF 2023] crypto 复现

这个赛很不理想,啥都不会。 拿了WP看了几个题,记录一下 random_RSA 这题不会是正常情况,我认为。对于论文题,不知道就是不知道,基本没有可能自己去完成论文。 题目不长,只有两个菜单,共可交…

Springboot 在 redis 中使用 BloomFilter 布隆过滤器机制

一、导入SpringBoot依赖 在pom.xml文件中&#xff0c;引入Spring Boot和Redis相关依赖 <!-- Google Guava 使用google的guava布隆过滤器实现--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><vers…

IPv4分组

4.3.1 IPv4分组 IP协议定义数据传送的基本单元——IP分组及其确切的数据格式 1. IPv4分组的格式 IPv4分组由首部和数据部分&#xff08;TCP、UDP段&#xff09;组成&#xff0c;其中首部分为固定部分&#xff08;20字节&#xff09;和可选字段&#xff08;长度可变&#xff0…

行业追踪,2023-08-14

自动复盘 2023-08-14 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

深入浅出 栈和队列(附加循环队列、双端队列)

栈和队列 一、栈 概念与特性二、Stack 集合类及模拟实现1、Java集合中的 Stack2、Stack 模拟实现 三、栈、虚拟机栈、栈帧有什么区别&#xff1f;四、队列 概念与特性五、Queue集合类及模拟实现1、Queue的底层结构&#xff08;1&#xff09;顺序结构&#xff08;2&#xff09;链…

做海外游戏推广有哪些条件?

做海外游戏推广需要充分准备和一系列条件的支持。以下是一些关键条件&#xff1a; 市场调研和策略制定&#xff1a;了解目标市场的文化、玩家偏好、竞争格局等是必要的。根据调研结果制定适合的推广策略。 本地化&#xff1a;将游戏内容、界面、语言、货币等进行本地化&#…

计算两个字符串之间的编辑距离【支持多字节字符串】

/*** 计算两个字符串之间的编辑距离【支持多字节字符串】** param string $str1 求编辑距离中的其中一个字符串* param string $str2 求编辑距离中的另一个字符串** return int*/ function levenshtein_copy(string $str1, string $str2): int {$arr1 mb_str_split($str1);$ar…

IK分词器升级,MySQL热更新助一臂之力

ik分词器采用MySQL热更新 ​ 官方所给的IK分词器只支持远程文本文件热更新&#xff0c;不支持采用MySQL热更新&#xff0c;没关系&#xff0c;这难不倒伟大的博主&#xff0c;给哈哈哈。今天就来和大家讲一下如何采用MySQL做热更新IK分词器的词库。 一、建立数据库表 CREATE…

20个常考的前端算法题,你全都会吗?

现在面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂基本必考 今天给大家带来20个常见的前端算法题&#xff0c;重要的地方已添加注释&#xff0c;如有不正确的地方&#xff0c;欢迎多多指正&#x1f495; 1、两数之和 题目&#xff1a;给定一个数组 nums 和一…

d3dcompiler43.dll缺失怎么修复?dll缺失解决方法分享

在使用电脑过程中&#xff0c;我们有时会遇到一些系统文件的问题&#xff0c;其中一个常见的问题是d3dcompiler43.dll文件的损坏或丢失。当这个文件出现问题时&#xff0c;可能会导致应用程序无法正常运行或图形渲染出现异常。最近我也遇到了这个问题&#xff0c;以下是我修复d…

ClickHouse(十八):Clickhouse Integration系列表引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

UE4拾取物品高亮显示

UE4系列文章目录 文章目录 UE4系列文章目录前言一、如何实现 前言 先看下效果&#xff0c;当角色靠近背包然后看向背包&#xff0c;背包就会高亮显示。 一、如何实现 1.为选中物品创建蓝图接口 在“内容” 窗口中&#xff0c;鼠标右键选择“蓝图”->蓝图接口&#xff0c…

P13-CNN学习1.3-ResNet(神之一手~)

论文地址:CVPR 2016 Open Access Repository https://arxiv.org/pdf/1512.03385.pdf Abstract 翻译 深层的神经网络越来越难以训练。我们提供了一个残差学习框架用来训练那些非常深的神经网络。我们重新定义了网络的学习方式&#xff0c;让网络可以直接学习输入信息与输出信息…

乐鑫ESP32S3串口下载出现奇怪问题解决方法

正在学习ESP32S3&#xff0c;有一个原厂BOX开发板&#xff0c;使用虚拟机&#xff0c;安装 debian11 &#xff0c;安装IDF4.4.5版本工具。下载box示例代码。 进入example,idf.py set-target esp32s3, idf.py flash 下载时&#xff0c;出现错误&#xff1a; Wrote 22224 bytes…