Browsed by
Author: birfy

Deep Learning 1.1 深度前馈网络

Deep Learning 1.1 深度前馈网络

深度前馈网络(deep feedforward network),也叫做前馈神经网络(feedforward neural network)或者多层感知机(multilayer perceptionm, MLP),是典型的深度学习模型。前馈网络的目标是近似某个函数 f*f^* 。例如,对于分类器,将输入映射到一个类别y。前馈网络定义了一个映射,并且学习参数的值,使它能够得到最佳的函数近似 这种模型称为前向的,是因为信息流过 x\mathbf{x} 的函数,流经用于定义f的中间计算过程,最终到达。在模型的输入和模型本身之间没有反馈连接。当前馈神经网路被扩展成包含反馈连接时,它们被称为循环神经网络(recurrent neural network) 前馈网络之所以被称为网络,是因为它们通常用许多不同函数复合在一起来表示。该模型与一个有向无环图相关联,而图描述了函数是如何复合在一起的。例如,我们有三个函数连接在一条脸上以形成。这些链式结构是神经网络中最常用的结构。在这种情况下,网络被分为多个层,链的全长被称为模型的深度(depth)。前馈网络的最后一层被称为输出层(output layer)。在神经网络训练的过程中,我们让去匹配的值。训练数据为我们提供了在不同训练点上取值的、含有噪声的 f*(x)f^*(\mathbf{x}) 的近似实例。每个样本 x\mathbf{x} 都伴随着一个标签 y≈f*(x) 。训练样本直接指明了输入层在每一点 x\mathbf{x} 上必须做什么;它必须产生一个接近y的值。但是训练数据并没有直接指明其他层应该怎么做。学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。相反,学习算法必须决定如何使用这些层来最好地实现 f*f^* 的近似。因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层。 网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度(width)。向量的每个元素都可以被视为起到类似一个神经元的作用。除了将层想想成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元组成,每个单元表示一个向量到标量的函数。 一种理解前馈网络的方式是从线性模型开始,考虑如何克服它的局限性。线性回归无论是通过闭解形式还是使用凸优化都能高效并且可靠的拟合。线性模型也有明显的缺陷,那就是该模型的能力被局限在线性函数里,无法理解任何两个输入变量之间的相互作用 为了扩展线性模型来表示 x\mathbf{x} 的非线性函数,我们可以不把线性模型用于 x\mathbf{x} 本身,而是用在一个变换后的输入 ϕ(x) 上,这里 ϕ 是一个非线性变换。同样,我们可以使用核技巧,来得到一个基于隐含地使用 ϕ\phi 映射的非线性学习算法。我们可以认为 ϕ\phi 提供了一组描述 x\mathbf{x} 的特征 剩下的问题就是如何选择映射 ϕ\phi 一种选择是使用一个通用的 ϕ\phi ,例如无限维的 ϕ\phi ,这样我们总是由足够的能力来拟合训练集,但是对于测试集的泛化往往不佳。非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题 另一种选择是手动地设计 ϕ\phi 。这种方法对于每个单独的任务都需要人们数十年地努力,在不同的领域之间很难迁移 深度学习的策略是去学习 ϕ\phi 。在这种方法中,我们有一个模型 y=f(x;θ,w)=ϕ(x;θ)⊤w 。我们现在有两种参数:用于从一大类函数中学习 ϕ\phi 的参数 θ ,以及用于将 ϕ(x)\phi(\mathbf{x}) 映射到所需的输出的参数 w 。这是深度前馈网络的一个例子,其中 ϕ\phi 定义了一个隐藏层。 训练一个前馈网络至少需要做和线性模型同样多的设计决策:选择一个优化模型、代价函数以及输出单元的形式。前馈网络引入了隐藏层的概念,这需要我们去选择计算隐藏层值的激活函数(activation function)。我们还必须设计网络的结构,包括网络应该包含多少层、这些层应该如何连接、以及每一层包含多少单元。在深度神经网络的学习中需要计算复杂函数的梯度。我们给出反向传播(back propagation)算法和它的现代推广来高效的计算这个梯度 学习XOR XOR函数是两个二进制值 x1 和 x2 的运算。当这些二进制值中恰好有一个为1时,XOR函数的返回值为1。XOR函数提供了我们想要学习的目标函数 y=f*(x) 。我们的模型给出了一个函数 y=f(x;θ)…

Read More Read More

Deep Learning 0.4 机器学习

Deep Learning 0.4 机器学习

学习算法 机器学习算法是一类能够从数据中学习的算法,对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习,通过经验E改进后,它在任务T上由性能度量P衡量的性能会有所提升 任务T 机器学习任务定义为机器学习系统应该如何处理样本。样本是指我们从某些希望机器学习系统处理的对象或事件中收集到的已经量化的特征的集合。 机器学习可以分为很多类型的任务: 分类:计算机 需要制定某些输入属于k类中的哪一类。为了完成这个任务,学习算法通常会返回一个函数,将输入的向量分类到特定的类别 输入缺失分类:当输入向量的每个度量不被保证时,学习算法需要定义一个从输入向量映射到输出类别的函数。当一些输入可能丢失时,学习算法必须学习一组函数,因为每个函数对应着分类具有不同缺失输入子集的输入向量。有效地定义这样一个大集合函数的方法时学习所有相关变量的概率分布,然后通过边缘化缺失变量来解决分类任务。使用n个输入变量,我们现在可以获得 2n 个不同的分类函数,但是计算机程序仅需要学习一个描述联合概率分布的函数。如在医疗诊断中的分类 回归:计算机程序需要对给定输入预测数值。如预测投保人的索赔金额 转录:机器学习系统观测一些相对非结构化表示的数据,并转录信息为离散的文本形式。如计算机程序输入一段音频波形,输出一序列音频记录中所说的英文字符或单词ID的编码 机器翻译:输入是一种语言的符号序列,计算机程序将其转化为另一种语言的符号序列 结构化输出:结构化输出的任务的输出是向量或者其他包含很多个值的数据结构,并且构成输出的这些不同元素间具有重要关系。如映射自然语言句子到语法结构树,标注航拍照片中的道路位置。在这类任务中,输出的结构形式不需要和输入尽可能相似 异常检测:计算机程序在一组事件或对象中筛选,并标记不正常或者非典型的个体。如信用卡欺诈检测,检测是否被滥用 合成和采样:机器学习程序生成一些和训练数据相似的新样本。如视频游戏中可以自动生成大型物体或风景的纹理,而不是让艺术家手动标记每个像素 缺失值填补:算法填补输入样本中的缺失值 去噪:算法根据损坏后的样本 x^ 预测干净的样本 x ,或者预测条件概率分布 p(x|x^) 密度估计:机器学习算法学习函数,可以解释成样本采样空间的概率密度函数或者质量密度函数。算法需要学习预测到的数据的结构,必须知道什么情况下样本剧集出现,什么情况下不太可能出现 性能度量P 机器学习算法性能的定性度量。对于分类、缺失输入分类和转录任务,我们通常度量模型的准确度,指输出正确结果的样本比率。 通常我们会关注机器学习算法在未观测数据上的性能如何,因为这将决定其在实际应用中的性能。因此我们使用测试集(test set)数据来评估系统性能,并将其与训练机器学习的训练集数据分开 经验E 机器学习算法可以分为无监督(unsupervised)算法和监督(supervised)算法两类。 机器学习算法从整个数据集上获取经验,数据集是指很多样本组成的集合 无监督学习算法训练含有很多特征的数据集,然后学习出这个数据集上有用的结构性质。在深度学习中,我们通常要学习生成数据集的整个概率分布,比如密度估计、合成或去噪、聚类 监督学习算法训练含有很多特征的数据集,不过数据集中的样本都有一个标签或目标。 无监督学习设计观察随机向量 x\mathbf{x} 的好几个样本,试图显式或隐式地学习出概率分布 p(x) ,或者是该分布的性质;而监督学习包含观察随机向量 x\mathbf{x} 及其相关联的值或向量 y 。然后从 x\mathbf{x} 预测 y\mathbf{y} ,通常是估计 p(y|x) 无监督学习和监督学习之间的界限是模糊的。很多机器学习技术可以用于这两个任务。例如,概率的链式法则,对于随机向量 x∈Rn ,联合分布可以分解成 p(x)=∏i=1np(xi|x1,⋯,xi–1) 该分解意味着我们可以将其拆分成n个监督学习问题,来解决表面上的无监督学习问题。我们求解监督学习问题 p(y|x) 时,也可以使用传统的无监督学习策略学习联合分布 p(x,y) ,然后推断 p(y|x)=p(x,y)∑y‘p(x,y‘) 有些机器学习算法并不是训练于一个固定的数据集上,强化学习算法会和环境进行交互,所以学习系统和它的训练过程会有反馈回路。 大部分机器学习算法简单地训练于一个数据集上,数据集可以用很多不同方式来表示。数据集是样本的集合,样本是特征的集合 表示数据集的常用方法是设计矩阵(design matrix)。设计矩阵的每一行包含一个不同的样本,每一列对应不同的特征。每一个样本都能表示成向量,并且这些向量的维度相同。 在监督学习中,样本包含一个标签或目标和一组特征,通常在处理包含观测特征的设计矩阵的数据集时,我们也会提供一个标签向量。 线性回归 线性回归解决回归问题,目标是建立一个系统,将一个向量作为输入,预测标量作为输出。我们定义输出为 y^=w⊤x\hat{y}=\mathbf{w}^\top \mathbf{x} 其中 w\mathbf{w} 是参数向量 参数是控制系统行为的值,我们可以将 w\mathbf{w} 看作一组界定每个特征如何影响预测的权重(weight)。接下来需要定义性能度量P。加入我们有m个输入样本组成的设计矩阵,不用它来训练模型,而是评估模型性能如何。我没也有每个样本对应的正确值y组成的回归目标向量。因为这个数据集只是用来评估性能,称之为测试集(test set)。我们将输入的设计矩阵记作 X(test) ,回归目标向量记作 y(test) 度量模型性能的一种方法是计算模型在测试集上的均方误差(mean squared error),表示为 MSEtest=1m∑i(y^(test)–y(test))i2…

Read More Read More

Deep Learning 0.3 数值计算

Deep Learning 0.3 数值计算

机器学习算法需要通过迭代过程更新解的估计值来解决数学问题,而不是通过解析过程推导出公式来提供正确解 上溢和下溢 计算机中我们需要通过有限数量的位模式来表示无限多的实数,因此总会引入一些近似误差。最小化舍入误差的累积可能会导致算法的失效 下溢指接近零的数被四舍五入为零,而上溢指大量级的数被近似为无穷。必须对上溢和下溢进行数值稳定的一个例子是softmax函数,它经常用于预测与Multinoulli分布相关联的概率 softmax(x)i=exp(xi)∑j=1nexp(xi) 当所有的 xi 都等于某个常数c时,如果c是很小的负数,exp(c)就会下溢。这意味着softmax函数的分母会变成0,如果c是非常大的正数,exp(c)就会上溢,这两个困难能通过计算 softmax(x–maxixi) 这样exp的最大参数为0,排除了上溢的可能性,同样分母中至少有一个值为1的项,排除了分母下溢的可能性。 病态条件 条件数是指函数相对于输入的微小变化而变化的快慢程度,输入被轻微扰动而迅速改变的函数可能会引发问题,因为舍入误差可能导致巨大的变化 考虑函数 f(x)=A–1x ,当 A 具有特征值分解时,其条件数为 maxi,j|λiλj| 当该数很大时,矩阵求逆对输入的误差特别敏感 基于梯度的优化方法 优化指的是改变 x 以最小化或最大化某个函数的任务 我们把要最小化或最大化多的函数称为目标函数(objective function)或准则(criterion)。当我们对其进行最小化时,也把它称为代价函数、损失函数或误差函数,这个输出量必须是一维的(标量) 导数对于最小化一个函数很有用,我们可以将函数向导数的反方向移动一小步来减小 f(x) f‘(x)=0 时,称为临界点或驻点,包括极小值点、极大值点和鞍点 针对具有多维输入的函数,需要用到偏导数(partial derivative),衡量点 x\mathbf{x} 处只有 xix_i 增加时函数的值如何变化。梯度时相对一个向量求导的函数,函数的梯度时包含所有偏导数的向量,记为 Δxf(x) 。在多维情况下,临界点是梯度中所有元素为零的点 在 u 方向的方向导数(directional derivative)是函数在 u\mathbf{u} 方向的斜率,方向导数是函数 f(x+αu) 关于 α 的导数, ∂∂αf(x+αu)=u⊤Δxf(x) 为了最小化 f ,我们希望找到使它下降最快的方向,计算方向 导数 minu⊤Δxf(x) 这个值在 u\mathbf{u} 与梯度方向相反时取得最小,这被称为最速下降法(method of steepest descent)或梯度下降(gradient descent),最速下降建议新的点为 x‘=x–ϵΔxf(x) 其中 ϵ 称为学习率(learning rate),是一个确定步长大小的正标量,通常选择一个小常数。最速下降在梯度的每一个元素为零时收敛。 梯度下降的概念可以推广到离散空间,称为爬山算法 Jacobian和Hessian矩阵 有时需要计算输入和输出都为向量的函数的所有偏导数,包含所有这样偏导数的矩阵称为Jacobian矩阵。如果有一个函数 f:Rm→Rn,f 的Jacobian矩阵 J∈Rn×m 定义为 Ji,j=∂∂xjf(x)i 有时我们也对二阶导数感兴趣,如果二阶导数是正的,函数将比梯度下降慢,如果二阶导数是正的,函数将比梯度下降快 当函数具有多维输入时,二阶导数也有很多,可以合并成一个矩阵,称为Hessian矩阵 H(f)(x)i,j=∂2∂xi∂xjf(x) Hessian矩阵是一个对称矩阵,因为在偏导连续的点微分算子可以交换,因此我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向 d 上的二阶导数可以写成 d⊤Hd…

Read More Read More

DeepLearning 0.2 概率与信息论

DeepLearning 0.2 概率与信息论

概率论是用于表示不确定性声明的数学框架,在人工智能领域,概率论可以告诉我们AI系统如何推理,据此我们设计一下算法来计算或者估计概率论导出的表达式;同时可以用概率和统计从理论上分析我们提出的AI系统的行为 信息论使我们能够量化概率分布中的不确定性总量 随机变量 随机变量(random variable)是可以随机地取不同值的变量,它只是对可能的状态的描述 可以是离散的或者连续的 必然伴随着一个概率分布来指定每个状态的可能性 概率分布 概率分布(probability distribution)用来描述随机变量或者一簇随机变量在每一个可能取到的状态的可能行大小 离散型变量的概率分布可以用概率质量函数(probability mass function, PMF)来描述,记作 P(x) ,概率为1表示变量为 x 是确定的,而为0表示是不可能的 概率质量函数可以同时作用于多个随机变量,记作 P(x,y) ,表示两个变量分别为 xx 和 y 的概率 函数P是随机变量的PMF需满足: P的定义域必须是所有可能状态的集合 ∀x,0≤P(x)≥1 ∑xP(x)=1 ,我们把这条性质称为归一化的(normalized) 当研究的对象是连续型随机变量时,我们用概率分布密度(probability density function, PDF)来描述概率分布,它需要满足: p定义域必须是所有可能状态的集合 ∀x,p(x)≥0 ∫p(x)dx=1 概率密度函数给出了落在面积为 δx 的无限小的区域内的概率为 p(x)δx 边缘概率 有时,我们知道了一组变量的联合概率分布,但想要了解其中一个子集的概率分布,这种定义在子集上的概率分布称为边缘概率分布(marginal probability distrubution) 例如,假设由离散型随机变量X和Y, 并且我们知道 P(X,Y) ,可以依据下面的求和法则计算 P(X) ∀x∈X,P(X=x)=∑yP(X=x,Y=y) 对于连续型变量,要用积分替代求和 p(x)=∫p(x,y)dy 条件概率 很多情况下,我们需要知道某个事件在给定其他事件发生时出现的概率,这种概率叫条件概率。如给定 X=x,Y=y 发生的条件概率记为 P(Y=y∣X=x)=P(Y=y,X=x)P(X=x)P(Y=y\mid X=x)=\frac{P(Y=y,X=x)}{P(X=x)} 条件概率的链式法则 多维随机变量的联合概率分布可以分解成只有一个变量的条件概率相乘的形式 P(X(1),⋯,X(n))=P(X(1))∏i=2nP(X(i) ∣X(1) ,⋯,X(i–1)) 独立性和条件独立性 两个随机变量X和Y,如果它们的概率分布可以表示成两个因子乘积的形式,并且一个因子只包含X,另一个因子只包含Y,那么称这两个随机变量时相互独立的 ∀x∈X,y∈Y,p(X=x,Y=y)=P(X=x)P(Y=y) 如果关于X和Y的条件概率分布对于 z 的每一个值都可以写成乘积的形式,那么这两个随机变量X和Y在给定随机变量 zz 时是条件独立的(conditionally independent),记作 X\botY ∀x∈X,y∈Y,z∈Z,p(X=x,Y=y∣Z=z)=p(X=x∣Z=z)p(Y=y∣Z=z) 期望、方差和协方差 期望是指当 xx 由 P…

Read More Read More

DeepLearning 0.1 线性代数基础

DeepLearning 0.1 线性代数基础

基本概念 标量(scalar):一个单独的数 向量(vector):一组有序排列的数,可以看作空间中的点,每个元素是不同坐标轴上的坐标 矩阵(matrix):矩阵是一个二维数组,每个元素由两个索引确定 张量(tensor):坐标超过两维的数组,其元素分布在若干维坐标的规则网络中 标量、向量、矩阵都可看作张量的低维形式 转置(transpose)将矩阵以对角线为轴进行对称操作,定义如下: (A⊤)i,j=Ai,j 如果矩阵的形状一样,我们可把两个矩阵相加,操作为将对应位置的元素相加;如果矩阵的形状不同,将矩阵在大小不足的维度上进行平移操作使两个矩阵大小一致从而进行加法操作,这种方法称为广播(broadcasting) 矩阵的乘法 矩阵的乘法要求矩阵的A列数必须和矩阵B的行数相等。相乘得到的矩阵形状为行数和A相同,列数和B\mathbf{B}相同。乘法操作定义为 Ci,j=∑kAi,jBk,j 书写方法为C=AB 矩阵的元素对应乘积或者Hadamard乘积记为A⊙B 两个相同维度的向量x和y的点积(dot product)可看作矩阵乘积x⊤y 矩阵乘积服从分配律 A(B+C)=AB+AC 矩阵乘积也服从结合律 A(BC)=(AB)C 矩阵乘积不满足交换律,但是向量的点积满足如下的交换律 x⊤y=y⊤x 单位矩阵和逆阵 单位矩阵In和任意向量和单位矩阵相乘都不会改变矩阵或向量,它的结构很简单:沿主对角线的元素都是1,其他位置的所有元素都是0 矩阵A的逆矩阵记为A–1,其定义的矩阵满足如下条件 A–1A=In 对于一个线性方程组Ax=b,其解为x=A–1b,前提是逆矩阵要存在 线性空间 如果逆阵存在,那么线性方程组有唯一解,但是对于某些b值,有可能不存在解,或者存在无穷多个解我们可以将A\mathbf{A}的列向量看作从远点出发的不同方向的向量,求解即为确定有多少种方法可以到达向量b\mathbf{b},即 Ax=∑ixiA:,i 这种操作称为线性组合(linear combination),一组向量的生成子空间(span)是原始向量线性组合后所能到达的点的集合 确定Ax=b\mathbf{A}\mathbf{x}=\mathbf{b}是否有解,相当于确定向量b\mathbf{b}是否在A\mathbf{A}的列向量的生成子空间中,这个特殊的生成子空间称作列空间(column space)或值域(range) 如果一组向量中任意一个向量都不能表示成其他向量的线性组合,那么这组向量称为线性无关。如果某个向量是一组向量中某些向量的线性组合,那么我们将这个向量加入这组向量后不会增加这组向量的生成子空间。矩阵的列空间的维数和该矩阵包含的线性无关的向量数相同。 若要使方程有唯一解,矩阵必须是方阵(square),并且所有的列向量都是线性无关的。一个列向量线性相关的方阵被称为奇异的(singular) 范数 范数用来衡量一个向量的大小,Lp 范数定义如下: ∥x∥p=(∑ixip)1p, p∈ℝ, p⩾1 当p=2时,L2范数被称为欧几里得范数,它表示从原点出发到向量x\mathbf{x}所确定的点的距离。平方范数在计算上通常更方便,如平方L2L^2范数的导数只取决于对应的元素,而L2L^2范数对每个元素的导数和整个向量有关。但是平方L2L^2范数在远点附近增长十分缓慢,在某些机器学习应用中,区分接近零的元素是很重要的,因此一些情况下会使用L1范数 ∥x∥1=∑i∣xi∣ 当需要统计向量中非零元素的个数时会使用“L0范数” L∞范数也被称为最大范数(max norm),定义为像两种具有最大绝对值元素的绝对值: ∥x∥∞=maxi∣xi∣ 使用Frobenius范数可以衡量矩阵的大小: ∥A∥F=∑i,jAi,j2 特殊的矩阵和向量 对角矩阵(diagonal matrix)只在主对角线上含有非零元素,其他位置都是零。用diag(v)表示对角元素由向量v中元素给定的一个对角方阵。对角矩阵在乘法计算中很高效,它的乘法相当于对其他矩阵中的元素进行缩放。同时它的逆阵diag(v)–1=diag([1/v1, ⋯, 1.vn]⊤) 非方阵的对角矩阵没有逆阵,对于一个长方形的对角矩阵而言,和其他矩阵相乘可以对其他矩阵进行缩放,并在缩放后的末尾添加一些零或者去掉一些元素 对称矩阵时转置和自己相等的矩阵,即A=A⊤\mathbf{A}=\mathbf{A}^\top 单位向量(unit vector)是具有单位范数的向量,即∥x∥2=1 如果x⊤y=0或xy=0,那么向量x\mathbf{x}和y\mathbf{y}相互正交。在n维实数空间中,最多由n个范数非零向量相互正交。如果这些向量的范数都为1,那么称它们为标准正交。 正交矩阵(orthogonal matrix)指行向量和列向量是分别标准正交的方阵,即A–1=A⊤ 特征分解 特征分解将矩阵分解为一组特征向量和特征值,方阵A\mathbf{A}的特征向量(eigenvector)是指与A\mathbf{A}相乘后相当于对该向量进行缩放的非零向量v\mathbf{v}: Av=λv 其中标量λ称为这个特征向量对应的特征值(eigenvalue) 如果v\mathbf{v}是A\mathbf{A}的特征向量,那么任何缩放后的向量sv也是A\mathbf{A}的特征向量,因此我们只考虑单位特征向量 假设矩阵A\mathbf{A}有n个线性无关的特征向量,对应着n个特征值,我们可以将特征向量连成一个矩阵,使得每一列是一个特征向量V;将特征值连接为一个向量λ,则A\mathbf{A}的特征分解可以记作: A=Vdiag(λ)V–1 每个实对称矩阵都可以分解成实特征向量和实特征值: A=QΛQ⊤ 其中Q是A\mathbf{A}的特征向量组成的正交矩阵,Λ是对角矩阵。我们可以将A看作沿特征向量延展特征值倍的空间 矩阵是奇异的,当且仅当矩阵含有零特征值。 所有特征值都是正数的矩阵称为正定(positive definite),所有特征值都是非负数的矩阵称为半正定(positive semidifinite)。对于半正定矩阵,它保证∀x,x⊤Ax≥0,正定矩阵还保证x⊤Ax=0则x=0 奇异值分解 奇异值分解(sigular value decomposition, SVD)将矩阵分解为奇异向量和奇异值。每个实数矩阵都有一个奇异值分解,但不一定有特征分解。 奇异值分解将矩阵A\mathbf{A}分解为三个矩阵的乘积: A=UDV⊤ 假设A\mathbf{A}是一个m×n的矩阵,那么U是一个m×m的矩阵,D是一个m×nm\times…

Read More Read More

利用机器学习识别嵌段共聚物自组装的微观相结构

利用机器学习识别嵌段共聚物自组装的微观相结构

对浓度做傅里叶变换是识别微观相结构的极佳方法,由于快速傅里叶变换隐含的周期性,只要在做傅里叶变换时浓度矩阵是晶胞的整数倍,在做傅里叶变换之后可以消除相位的影响,即使是对浓度做了平移变换(即随机初始化跑出来的相),也不会改变傅里叶空间的形态。这一点可以在快速傅里叶变换的公式(以二维的傅里叶变换为例)中看出来,即使做了平移变换,由于周期性,对整个晶胞中所有的点求和后傅里叶空间中每个位置的值并不会发生改变。 在之前的识别中,为了简化运算而切割了矩阵的过中心的三个面做快速傅里叶变换,但现在看来是得不偿失的。三维快速傅里叶变换由于增加了一个轴,因此可以适当降低精度也可以得到较多的判断点;同时切面上做傅里叶变换由于只做了两次求和,只能消除两个方向的相位,如果相发生了平移变换,这个面的浓度和傅里叶矩阵的浓度都会发生变化,因此并不能很好地用于识别。因此仍然要靠三维快速傅里叶变换来获得相的特征。在这里傅里叶空间的大小选为128*128*128,由于傅里叶变换后主要值集中在八个角上,因此截取[0:8,0:8,0:8](最初为了加快计算选择了4*4*4的正方体,但是后来发现这样精度太低,对很多相的识别并不好)这个值比较集中的小正方体来作为相的特征来进行识别。通过验证,单纯地通过峰的位置来识别并不能行得通,因为随着嵌段比例的变化,峰的位置也会发生变化,导致判断出现问题。因此考虑把这个矩阵看作一个高维向量,用支持向量机的方法,来对这个三维矩阵进行分类和识别。 支持向量机(Support Vector Machine)是通过寻找一个超平面来对样本进行分割,并努力使分开的两个类别有最大的间隔,这样才能是的分隔具有更高的可信度。支持向量机通过让离分割面最近的数据点具有最大的距离。 利用支持向量机可以对已知标签的向量进行分类。利用Python的scikit-learn库可以很方便地进行训练和识别。同时为了处理偏离正常位置,即跑出来的相与初始化相不同的点,加入一个惩罚因子,它代表对离群点带来的损失的重视程度,它的值越大,对目标函数的损失越大,通过设置一个值来实现参数调优。经过调试,使用线性核函数有着最好的分类效果。经过调试,识别的精确率很高,并且在csHelix只有16个样本的情况下也能实现很好的识别,同时可以获取一个浓度是什么相的概率(根据点到超平面的距离来计算)。 另外,如果进行判断的相并不在训练过的相的范围内,支持向量机也会在被超平面分割出的区域中,因此也会判断出一个相,这样就发生了错误。为了判断跑出来的相是否在我们已知的范围内,需要进行异常检测,这有四种方法来实现,一类支持向量机(OneClassSVM),孤立森林(IsolationForest), 局部异常因子(LocalOutlierFactor),EllipticEnvelop,相对而言孤立森林算法效率比较高,可以指定样本的异常率来进行计算,因此选择了孤立森林算法。经过实验,在异常很少的样本中进行计算得到的包容性过强,很多其他相的相区都被包在了超平面以内从而达不到预期的效果,因此通过人工地在样本中加入一些异常值后进行计算可以得到较好的异常检测效果。 训练程序,训练后生成一个estimator.pkl和classifier.pkl两个文件,第一个是孤立森林算法计算的异常值检测数据,第二个是支持向量机计算的超平面数据。训练后会自动判断训练文件的相与识别结果是否相符,并打印出来,可以根据这个来调整训练的参数。 测试程序,可以判断是否是训练过的相,如果是,输出相的种类和概率