变分自编码器
Vae他有一些烦恼反正现在的年轻人都有许多烦恼那么多要思考那么多要寻找诱惑太多 不坚定就犯错了
哦哦,不对,不是这个Vae,也不是uae~
是接下来出场的VAE~
对比AE,引出VAE之前介绍了自编码器(AE)的原理(传送门),当时讲到自编码器并不具有真正的生成能力,以图像为例来说,它只能将输入的图像$X$编码成隐向量$z$,然后将$z$作为解码器的输入,得到输出图像$X’$。如果我们尝试将与$z$的shape一致的”随机特征表示”输入解码器,那么得到的将是毫无意义的噪声图像。
变分自编码器(VAE)突破了这一限制!
先给出结论:在VAE中,只要随机特征表示(这里也将这些特征表示记作$z$)是从某些分布,如标准正态分布中采样得到的,那么将$z$输入解码器之后可以得到与训练集图像类似但不同于训练集中任何一张图像的新图像。
比如,训练集是手写数字图像,那么在训练完成后,将从标准正态分布中采样得到的$z$输入解码器,可以得到一些新的手写数字图像。
以上所说的特征表示$z$,被称为隐向量(latent vector)。
VAE究竟是如何做到这一点的呢?且往下看。
VAE的结构
变分自编码 ...
自编码器
自编码器的结构自编码器(Auto Encoder)是一种神经网络模型。它由两部分组成:编码器(Ecoder)和解码器(Decoder)。
编码器用于将输入数据(Input Data)进行编码,从而将输入数据映射到维度较低的隐空间(Latent Space),得到被编码的数据(Encoded Data)。
解码器用于将隐空间中被编码的数据还原(解码)成”输入数据”。这里之所以打引号,是因为还原得到的”输入数据”相比于一开始的输入数据来说会有一些损失,所以并不是真正意义上的输入数据。
下图展示了自编码器的结构
自编码器的应用数据降维/特征提取从自编码器的结构很容易想到它的这一用途。在训练阶段,$X$经过编码器映射得到低维的$z$,$z$通过解码器还原出与$X$维度一致,内容相似的$X’$,通过反向传播来更新网络权重,以最小化输入$X$与输出$X’$之间的损失。
其中的$z$便是降维后的数据,因为如果可以通过$z$还原出输入$X$,那么可以说$z$已经学习到了$X$的大部分特征。
同时,$z$是一个被高度压缩(降维)的输入数据的表示,所以也可以将自编码器看作一个特征提取器,提取到的特征表示就 ...
回归树
开篇在之前的决策树讲解(传送门)中,我们使用ID3算法生成了一棵决策树,并且在文章最后指出除了ID3算法,常用的决策树生成算法还有C4.5。
但是,无论是基于信息增益的ID3算法,还是基于信息增益比的C4.5算法,它们都只能处理分类问题,而对于回归问题就束手无策了。
现在,我们要介绍一种既可用于分类任务又可用于回归任务的决策树的生成算法:CART算法。
CART的全称是 classification and regression tree,译为分类与回归树,该算法由两步组成:(1)决策树生成;(2)决策树剪枝。
本文重点关心如何用决策树做回归任务,因此本文的主题是讲解回归树的生成原理及其Python实现。下面正文开始。
回归树的生成对于使用ID3算法或者C4.5算法生成的决策树,这棵树可能是多岔的,因为某个被选定用于划分数据集的特征的不同取值可能多于两个。而这里基于CART算法的决策树,无论是回归树还是分类树,它们都是二叉树。
以回归树为例,为什么是二叉树呢?这还得从回归树的生成原理讲起。
对于给定的训练集$(X,Y)$,其中$Y$是连续型变量,首先*按照某种方法选择某一个特征(这里记 ...
AdaBoost
开篇AdaBoost是一种提升(boosting)方法。
你可能听过“众人拾柴火焰高”这句话,提升方法的思想与这句话的思想颇有相似之处。
一个人拾到的柴火,只能维持小的火苗;但一群人一起拾柴,供给同一火堆,那么这个火堆终将燃起熊熊大火。
对于给定的训练集,单个分类器的分类能力可能并不算好;但如果同时训练一堆分类器,让分类器们一起做判断,那么分类结果将会比任何一个单独的分类器做分类都要好。
上面的单个分类器被称为“弱分类器”,若干个“弱分类器”联合起来,就得到了“强分类器”。
AdaBoost作为最具代表性的提升方法,自然也蕴含着这种集体智慧的思想。至于其具体细节,且往下看。
AdaBoost 算法AdaBoost为训练集中每个样本设置一个可调整的权值,并且在每一轮训练结束后将被误分类的样本的权值加大,将被正确分类的样本的权值减小。这样被误分类的样本在下一轮分类时会更加受到关注。
假设经过了$M$轮训练,则会得到$M$个弱分类器。将这$M$个弱分类器通过加权求和(弱分类器分类能力相对越强,权值就越大)的方式联结起来,便得到了一个强分类器。
以上是AdBoost核心思想的文字描述,现在用数 ...
朴素贝叶斯
开篇正如其名,”朴素贝叶斯”原理”朴素”,实现简单,是一种常用的机器学习算法。
为何“朴素”?如何“学习”?如何分类?别急,咱们慢慢道来~
概率统计回忆录朴素贝叶斯也是贝叶斯方法的一种,提起贝叶斯,学过概率统计的你一定听说过条件概率公式,全概率公式和贝叶斯公式吧,忘记了也没关系,我们先来快速过一遍。
条件概率公式:
$$P(A|B)=\frac{P(A,B)}{P(B)}$$
全概率公式:
$$P(B)=\sum_{i=1}^{n}P(A_i)P(B|A_i)$$
贝叶斯公式:
$$P(A|B)=\frac{P(A,B)}{P(B)}=\frac{P(B|A)P(A)}{ \sum_{i=1}^{n}P(A_i)P(B|A_i)}$$
可以发现,贝叶斯公式其实就是由条件概率公式和全概率公式推导的,贝叶斯公式的分母是一个全概率公式,分子是一个条件概率公式。
后续的推导将会用到上面的公式。
朴素贝叶斯的训练(学习)方法朴素贝叶斯在使用训练数据进行“学习”时,其实是在学习数据的生成机制,具体点,是在学习特征$X$与标签$Y$的联合概率分布$P(X,Y)$ 。
再进一步解释:根据条件概率公式, ...
决策树
开篇决策树,可以看做一个if-else规则的集合,比如下图就是一棵决策树:
其中,圆圈代表特征,矩形代表最终的类别,圆圈和矩形都可以称为树的节点,决策树正是由这样一个个节点组成的。
本文的主要内容是从零开始构建一棵决策树,中间过程会涉及诸如熵,信息增益以及决策树等概念。
按照老规矩,先上栗子。
信贷决策问题这里有一份数据集,其中每个ID代表一个人,类别列代表是否同意这个人的贷款申请,中间列(年龄,有工作,有自己的房子,信贷情况)是4个特征,现在要求你利用这四个特征及类别标签,构建一棵决策树来决定是否同意贷款申请人的贷款申请。| ID| 年龄| 有工作 | 有自己的房子| 信贷情况 |类别|| ——– | —–: | :—-: |:—–:|:—–:|:—–:|| 1 | 青年 | 否 |否|一般|否|2 | 青年 | 否 |否|好|否| 3 | 青年 | 是 |否|好|是|| 4 | 青年 | 是 |是|一般|是| 5 | 青年 | 否 ...
异常处理_Python基础连载(十五)
开篇本期介绍Python的异常处理方法。
为什么需要做异常处理看下面的函数:
12def div(a,b): return a/b
这个函数用于求解两数相除的结果
我们可以调用它:
12345678#求解1/2>>> div(1,2)0.5#求解3/4>>> div(3,4)0.75
程序貌似没问题
但是我们知道,除数是不能为0的,现在来尝试让除数为0:
1234567>>> div(1,0)Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> div(1,0) File "C:/Users/fanxi/Desktop/swe.py", line 2, in div return a/bZeroDivisionError: division by zero
毫无疑问,程序报错了!
报错信息也很明显:ZeroDivisionError: divis ...
排序_不止于升降-Python基础连载(十四)
开篇本期将介绍排序方法,注意是方法而不是算法,因此更侧重方法的使用,而不对其内部细节的实现原理进行深究。
简单的列表(list)排序list自带有sort()方法可实现排序
默认是升序排列:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> lis.sort()>>> lis[1, 2, 3, 4, 5, 6, 8, 9]
可通过传入reverse=True来实现降序:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> lis.sort(reverse=True)>>> lis[9, 8, 6, 5, 4, 3, 2, 1]
你应该已经发现,上述的排序操作是直接在原列表中进行的。
除了上面的sort(),Python语言本身也有一种排序的函数,叫做sorted()
同样默认是升序排列:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> sorted_lis=sorted(lis)>>& ...
Python将批量图片转pdf
最近在整理以前的书籍和资料,发现了一堆自己写的笔记:
摊开之后的画面是这样的:
丢了吧,太可惜,留着呢,又用不到,而且还占地方。思来想去,我决定将它们扫描做成电子档,永久储存在云端。
说干就干,先拿<操作系统笔记>开刀。我用手机摄像头充当扫描仪,开始了漫长的扫描,这真是个体力活。
许久,终于扫描完了,共134张图片。二话不说,在手机相册中选中扫描的图片,传送到手机wps,开始合成pdf…
然后就好了………………………………………………………吗?
事实是:wps最高只支持一次将50张图片合成pdf,而且还是在开会员的前提下才能操作。emm, 看来要另寻他法了。
一个新的想法是,把图片全部弄进word里,导出pdf就好了
这确实可行,但是每两张图片之间的间隔实在是太大了,有点丑
而且作为一个Python爱好者,一遇到问题,就习惯性的想着能不能用Python来解决
因为如果下次,你有1000份文档的图片需要转pdf,使用word的话,你需要手动创建1000个word文档,然后做1000次导入图片的操作,这可真让人手酸。
拥抱Python吧!
经过一番搜索,我发现了img2pdf这 ...
kd树
开篇在讲解k-近邻算法的时候,我们提供的思路是:对于新到来的样本,计算该样本与训练集中所有样本之间的距离,选取训练集中距离新样本最近的k个样本中大多数样本的类别作为新的样本的类别。
也就是说,每次都要计算新的样本与训练集中全部样本的距离。但是,在实际应用中,训练集的样本量和特征维度都是比较庞大的,这就导致该算法不得不在计算距离上花费大量的时间,那有没有什么方法可以在时间开销上对之前的k-近邻算法进行优化呢?
采用以空间来换时间的思想,就引出了今天的主角:kd树。
构造kd树kd树是一种二叉树,它可以将k维特征空间中的样本进行划分存储,以便实现快速搜索。
一头雾水?没关系,来看一个经典的构造kd树的例子。
现给定一个二维的训练集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
要求构造一个平衡kd树
第一步,选取第0个维度作为被划分的坐标轴,并按照第0个维度从小到大排列全部样本,得到:
{(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)}
第二步,找到第0个维度的中位数对应的样本。注意,这里的中位数与我们之前认知的中位数有些不 ...