sklearn数据降维之字典学习
文章目录
- 字典学习简介
- 构造函数
- 实战
- Step1 制作实验数据
- Step2 小批字典学习
- Step 3 参数调整
字典学习简介
如果把降维理解成压缩的话,那么字典学习的本质是编码,其目的是找到少量的原子
,用以描述或构建原始样本。举个一维的例子,以abcabcabc
为例,很显然abc
就是一个院子,这个字符串无非是abc
重复了三次而已,用abc
这个词条,或者说原子,就可以构建abcabcabc
这样的字符串。
一般来说,字典学习所面对的并不是一个字符串,而是一个稀疏矩阵,基于此,需要对一些概念做下定义
- 原始样本YYY,就是原始矩阵
- 字典矩阵DDD,内部含有的词条为列向量,被称为原子,记作dkd_kdk
- 稀疏矩阵XXX,可以理解为查字典的方法
从而,Y=DXY=DXY=DX就是通过XXX来查阅DDD从而得到YYY的过程,在sklearn
中,字典学习实际上是求解如下优化问题
(D,X)=arg min0.5∥Y−DX∥F2+α∥X∥1,1D,Xwith∥Xk∥2⩽1∀0⩽k<N(D, X) = \argmin 0.5 \Vert Y - DX \Vert_{F}^2 + \alpha\Vert X\Vert_{1,1}\\ D, X with \Vert X_k\Vert_2 \leqslant 1\quad\forall 0 \leqslant k < N (D,X)=argmin0.5∥Y−DX∥F2+α∥X∥1,1D,Xwith∥Xk∥2⩽1∀0⩽k<N
其中∥∥1,1\Vert\quad\Vert_{1,1}∥∥1,1表示对矩阵中所有实数求和;∥∥F\Vert\quad\Vert_F∥∥F为佛罗贝尼乌斯范数,可定义为
∥A∥F=∑i=1n∑j=1n∣aij∣2=trace(AA)\Vert A\Vert_F=\sqrt{\sum^n_{i=1}\sum^n_{j=1}\vert a_{ij}\vert^2}=\sqrt{\operatorname{trace}(AA)} ∥A∥F=i=1∑nj=1∑n∣aij∣2=trace(AA)
构造函数
字典学习作为类被封装在sklearn
中,其构造函数如下
class decomposition.DictionaryLearning(n_components=None, *, alpha=1, max_iter=1000, tol=1e-08, fit_algorithm='lars', transform_algorithm='omp', transform_n_nonzero_coefs=None, transform_alpha=None, n_jobs=None, code_init=None, dict_init=None, verbose=False, split_sign=False, random_state=None, positive_code=False, positive_dict=False, transform_max_iter=1000)
其中,n_components
为要提取的元素个数,alpha
即为前文公式中的α\alphaα,表示稀疏控制参数。
由于构造函数参数太多,故只则取一些常用参数
fit_algorithm
为拟合算法,可选
'lars'
: 最小角回归'cd'
:坐标下降
transform_algorithm
为数据转换方案:
'lars'
:最小角回归'lasso_lars'
:lasso最小角回归'lasso_cd'
:lasso坐标下降'omp'
: 正交匹配追踪'threshold'
: 阈值法,将字典所有小于α\alphaα的值置为0
当transform_algorithm
为lars
或omp
时,可选参数transform_n_nonzero_coefsint
,表示DDD的每一列中非零系数的目标值。
此外,还有一些通用的参数:max_iter
表示最大迭代次数;tol
表示最大误差;n_jobs
表示并行进程数;random_state
为随机数状态,便于成果复现。
考虑到在处理矩阵问题时往往比较耗时,所以提供了小批字典学习类MiniBatchDictionaryLearning
,便于处理较大数据,其构造函数与字典学习基本相同。
实战
Step1 制作实验数据
sklearn
官网提供了基于字典学习进行图像去噪的例子,首先向图像中添加噪声,得到类似下图这样的
代码为
import matplotlib.pyplot as plt
import numpy as npimg = plt.imread("lean_gray.jpg")/255.0
h, w = img.shape
imNoise = img*1
mid = w//2
imNoise[:, mid:] += 0.1 * np.random.randn(h, mid)def showError(imNoise, img, title):plt.subplot(1, 2, 1)plt.imshow(imNoise, vmin=0, vmax=1, cmap=plt.cm.gray)plt.title("image")plt.axis('off')plt.subplot(1, 2, 2)err = imNoise - imgmsg = f"err std:{np.std(err):.2f}"plt.title(msg) plt.imshow(err, vmin=-0.5, vmax=0.5, cmap=plt.cm.PuOr)plt.axis('off')plt.suptitle(title)showError(imNoise, img, "Distorted image")
plt.show()
Step2 小批字典学习
接下来,创建MiniBatchDictionaryLearning
对象,并fit
,完成训练,然后查看一下字典学习中的"原子"components_
from sklearn.decomposition import MiniBatchDictionaryLearning as mbdlfrom sklearn.feature_extraction.image import extract_patches_2d as ep2dpatch_size = (7, 7)
data = extract_patches_2d(imNoise[:, : mid], patch_size)
data = data.reshape(data.shape[0], -1)
# 按行归一化
data = (data-np.mean(data, axis=0))/ np.std(data, axis=0)### !!!!!!!!!!!!!!!!!!!!
dico = mbdl(n_components=50, batch_size=200,alpha=1.0, max_iter=10)
dico.fit(data)
X = dico.components_
### !!!!!!!!!!!!!!!!!!!!for i, comp in enumerate(X[:50]):plt.subplot(5, 10, i + 1)plt.imshow(comp.reshape(patch_size))plt.axis('off')
Step 3 参数调整
最后,调整参数,对比不同情况下字典学习的效果,如图所示
A | B |
---|---|
代码如下
from sklearn.feature_extraction.image import reconstruct_from_patches_2ddata = extract_patches_2d(imNoise[:, mid:], patch_size)
data = data.reshape(data.shape[0], -1)
intercept = np.mean(data, axis=0)
data -= intercepttf_algs = [("omp @1 atom", "omp", {"transform_n_nonzero_coefs": 1}),("omp @2 atoms", "omp", {"transform_n_nonzero_coefs": 2}),("las @4 atoms", "lars", {"transform_n_nonzero_coefs": 4}),("Thresholding @ alpha=0.1", "threshold",{"transform_alpha": 0.1}),
]recons = {}
for title, tf_alg, kwargs in tf_algs:print(title + "...")recons[title] = img.copy()dico.set_params(transform_algorithm=tf_alg, **kwargs)code = dico.transform(data)Ys = np.dot(code, X)Ys += interceptYs = Ys.reshape(len(data), *patch_size)if tf_alg == "threshold":Ys = (Ys - Ys.min())/Ys.max()recons[title][:, mid:] = reconstruct_from_patches_2d(Ys, (h, mid))plt.figure(title)showError(recons[title], img, title)plt.show()
sklearn数据降维之字典学习相关推荐
- sklearn自学指南(part49)--字典学习
学习笔记,仅供参考,有错必纠 文章目录 分解信号的分量(矩阵分解问题) 字典学习 用预先计算的字典进行稀疏编码 通用词典学习 Mini-batch字典学习 分解信号的分量(矩阵分解问题) 字典学习 用 ...
- sklearn——数据降维
sklearn--数据 一.特征选择 1.特征选择是什么 特征选择就是单纯地从所有特征中选择一部分特征作为训练所使用的特征.这些特征在选择前和选择后数值可能会发生变化,也可能不发生变化.但是在特征选择 ...
- Dictionary Learning(字典学习、稀疏表示以及其他)
第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是 稀疏字典学习(Sparse D ...
- 字典学习以及稀疏表示的概要
https://www.cnblogs.com/hdu-zsk/p/5954658.html https://www.cnblogs.com/endlesscoding/p/10090866.html ...
- 字典学习(KSVD)详解
关于字典学习 对于一个事物,我们如何表征它呢?很明显,这个事物是有特征的,或者说,这个事物它是由许多个不同的特征经过一定的组合而形成的.字典学习的目标是提取实物的最本质特征.用字典来表征该事物的特征. ...
- Py之scikit-learn:机器学习sklearn库的简介、六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类)、安装、使用方法(实际问题中如何选择最合适的机器学习算法)之详细攻略
Py之scikit-learn:机器学习sklearn库的简介(组件/版本迭代).六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类).安装.使用方法(实际问题中如何选择最合适的机器学 ...
- 稀疏学习、稀疏表示、稀疏自编码神经网络、字典学习、主成分分析PCA、奇异值分解SVD 等概念的梳理,以及常用的特征降维方法
稀疏学习.稀疏表示.稀疏自编码神经网络.字典学习.主成分分析PCA.奇异值分解SVD 等概念的梳理,以及常用的特征降维方法 关于稀疏 稀疏编码 Sparse Coding 与字典学习 神经网络的正则化 ...
- 【深度学习】数据降维方法总结
引言: 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达 ...
- 【Python学习】 - sklearn - PCA降维相关
1.PCA算法介绍 主成分分析(Principal Components Analysis),简称PCA,是一种数据降维技术,用于数据预处理.一般我们获取的原始数据维度都很高,比如1000个特征,在这 ...
最新文章
- 神经架构搜索在视频理解中研究进展的综述
- java错误代码1061_java.sql.SQLException
- 人工智能阴影检测与去除,实现一种基于反射的阴影检测与去除方法
- 【c++面向对象编程】工资管理系统
- iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串
- lucene 源码分析_Lucene分析过程指南
- 微信怎么绑定消息服务器吗,fastweixin: 极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...
- mysql连接nacat_【mysql】使用Navicat连接数据库
- “陆奇争夺战”:江湖传言,得陆奇者得AI天下。
- 午夜时分的51CTO博客与白天有什么不同?
- InnoSetup 如何获取安装程序的路径?
- 炫酷报表制作工具:RDP报表工具
- android修改屏幕比例,安卓屏幕比例修改器
- js调用一次函数,中间增加一个内容
- 6-13 折半查找 (15 分)
- 马王堆版《道德经》--原原本本的帛书版(转载)
- 【树莓派不吃灰】基础篇⑯ 搭建sqlite3数据库环境
- 【嵌入式】SIM808/SIM900发送短信AT指令0X1A
- Jetson TX2 重装系统(刷机)+后续设置(安装Fcitx、解决拼音候选词不显示、换国内源、局域网实现VNC远程桌面)
- 直流无刷电机和霍尔传感器