博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【机器学习笔记】EM算法及其应用
阅读量:5278 次
发布时间:2019-06-14

本文共 11896 字,大约阅读时间需要 39 分钟。

极大似然估计

考虑一个高斯分布\(p(\mathbf{x}\mid{\theta})\),其中\(\theta=(\mu,\Sigma)\)。样本集\(X=\{x_1,...,x_N\}\)中每个样本都是独立的从该高斯分布中抽取得到的,满足独立同分布假设。

因此,取到这个样本集的概率为:

\[\begin{aligned} p(X\mid{\theta}) &= \prod_{i=1}^Np(x_i\mid\theta) \end{aligned}\]

我们要估计模型参数向量\(\theta\)的值,由于现在样本集\(X\)已知,所以可以把\(p(X\mid{\theta})\)看作是参数向量\(\theta\)的函数,称之为样本集\(X\)下的似然函数\(L(\theta\mid{X})\)

\[\begin{aligned} L(\theta\mid{X}) &= \prod_{i=1}^Np(x_i\mid\theta) \end{aligned}\]

极大似然估计要做的就是最大化该似然函数,找到能够使得\(p(X\mid{\theta})\)最大的参数向量\(\theta\),换句话说,就是找到最符合当前观测样本集\(X\)的模型的参数向量\(\theta\)

为方便运算,通常我们使用似然函数的对数形式(可以将乘积运算转化为求和形式),称之为“对数似然函数”。由于底数大于1的对数函数总是单调递增的,所以使对数似然函数达到最大值的参数向量也能使似然函数本身达到最大值。故,对数似然函数为:

\[\begin{aligned} L(\theta\mid{X}) &= \log\Big(\prod_{i=1}^Np(x_i\mid\theta)\Big) \\ &= \sum_{i=1}^N\log{p(x_i\mid\theta)} \end{aligned}\]

参数的估计值 \(\hat{\theta}=\arg\underset{\theta}{\max}L(\theta\mid{X})\)

混合高斯模型及其求解困境

混合高斯模型是指由\(k\)个高斯模型叠加形成的一种概率分布模型,形式化表示为:

\[ p(\mathbf{x}\mid{\Theta}) = \sum_{l=1}^{k}\alpha_lp_l(\mathbf{x}\mid{\theta_l})\]
其中,参数 \(\Theta=(\alpha_1,...,\alpha_k,\theta_1,...,\theta_k)\),并且有\(\Sigma_{l=1}^{k}\alpha_l=1\)\(\alpha_l\)代表单个高斯分布在混合高斯模型中的权重。

现在我们假设观测样本集\(X=(x_1,...x_N)\) 来自于该混合高斯模型,满足独立同分布假设。为了估计出该混合高斯模型的参数\(\Theta\),我们写出这n个数据的对数似然函数:

\[\begin{aligned} L(\Theta\mid{X}) &= \log\Big(p(X\mid{\Theta})\Big) \\ &= \log\Big(\prod_{i=1}^{N}p(x_i\mid{\Theta})\Big) \\ &= \sum_{i=1}^{N}\log\Big(p(x_i\mid{\Theta})\Big) \\ &= \sum_{i=1}^{N}\log\Big(\sum_{l=1}^{k}\alpha_lp_l(x_i\mid{\theta_l})\Big) \end{aligned}\]

我们的目标就是要通过最大化该似然函数从而估计出混合高斯模型的参数 \(\Theta\)

观察该式,由于对数函数中还包含求和式,因此如果仿照极大似然估计单个高斯分布参数的方法来求解这个问题,是无法得到解析解的。所以我们要寻求更好的方式来解决这个问题。

EM算法

基本过程

考虑一个样本集\(X\)是从某种分布(参数为\(\Theta\))中观测得到的,我们称之为不完全数据(incomplete data)。我们引入一个无法直接观测得到的随机变量集合\(Z\),叫作隐变量。X和Z连在一起称作完全数据。我们可以得到它们的联合概率分布为:

\[ p(X,Z\mid{\Theta})=p(Z\mid{X,\Theta})p(X\mid{\Theta}) \]

我们定义一个新的似然函数叫作完全数据似然:

\[ L(\Theta\mid{X,Z})=p(X,Z\mid{\Theta}) \]

我们可以通过极大化这样一个似然函数来估计参数Theta。然而Z是隐变量,其分布未知上式无法直接求解,我们通过计算完全数据的对数似然函数关于Z的期望,来最大化已观测数据的边际似然。我们定义这样一个期望值为Q函数:

\[\begin{aligned} Q(\Theta,\Theta^{g}) &= \mathbb{E}_Z\Big[\log{p(X,Z\mid\Theta)}\mid{X,\Theta^g}\Big]\\ &= \sum_Z\log{p(X,Z\mid{\Theta})p(Z\mid{X,\Theta^g})} \end{aligned}\]

其中,\(\Theta^g\)表示当前的参数估计值,X是观测数据,都作为常量。\(\Theta\)是我们要极大化的参数,\(Z\)是来自于分布\(p(Z\mid{X,\Theta^g})\)的随机变量。\(p(Z\mid{X,\Theta^g})\)是未观测变量的边缘分布,并且依赖于观测数据\(X\)和当前模型参数\(\Theta^g\)

EM算法中的E-setp就是指上面计算期望值的过程。

M-step则是极大化这样一个期望,从而得到能够最大化期望的参数\(\Theta\)

\[\begin{aligned} \Theta^{g+1} &= \arg\underset{\theta}{\max}Q(\Theta,\Theta^{g}) \\ &= \arg\underset{\theta}{\max}\sum_Z\log{p(X,Z\mid{\Theta})p(Z\mid{X,\Theta^g})} \end{aligned}\]

重复执行E-step和M-step直至收敛。

收敛性证明

(略)

EM算法应用于高斯混合模型

回到高斯混合模型的参数估计问题,我们将样本集\(X\)看作不完全数据,考虑一个无法观测到的随机变量\(Z=\{z_i\}_{i=1}^{N}\),其中\(z_i\in\{1,...,k\}\),用来指示每一个数据点是由哪一个高斯分布产生的,(可以类比成一个类别标签,这个标签我们是无法直接观测得到的)。比如,\(z_i=k\) 表示第\(i\)个样本点是由混合高斯模型中的第\(k\)个分量模型生成的。

那么完全数据\((X,Z)\)的概率分布为:

\[\begin{aligned} p(X,Z\mid{\Theta}) &= \prod_{i=1}^{N}p(x_i,z_i\mid{\Theta}) \\ &= \prod_{i=1}^{N}p(z_i\mid{\Theta})p(x_i\mid{z_i,\Theta}) \\ &= \prod_{i=1}^{N}\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}}) \end{aligned}\]

在混合高斯模型问题中,\(p(z_i\mid\Theta)\) 是指第\(z_i\)个模型的先验概率,也就是其权重\(\alpha_{z_i}\)。给定样本点来源的高斯分布类别后,\(p(x_i\mid{z_i,\Theta})\)可以写成对应的高斯分布下的概率密度形式,即\(p_{z_i}(x_i\mid{\theta_{z_i}})\)

根据贝叶斯公式,又可以得到隐变量的条件概率分布:

\[\begin{aligned} p(Z\mid{X,\Theta}) &= \prod_{i=1}^Np(z_i\mid{x_i,\Theta}) \\ &= \prod_{i=1}^N\frac{p(x_i,z_i,\Theta)}{p(x_i,\Theta)} \\ &= \prod_{i=1}^N\frac{\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})}{\sum_{z_i=1}^k\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})} \end{aligned}\]

因此,我们可以写出相应的\(Q\)函数:

\[\begin{aligned} Q(\Theta,\Theta^{g}) &= \sum_Z\log{p(X,Z\mid{\Theta})p(Z\mid{X,\Theta^g})} \\ &= \sum_Z\log{\prod_{i=1}^{N}\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})}\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &= \sum_Z\sum_{i=1}^{N}\log\Big(\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})\Big)\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &= \sum_{z_1=1}^k\sum_{z_2=1}^k...\sum_{z_N=1}^k\sum_{i=1}^{N}\log\Big(\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})\Big)\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &= \sum_{z_1=1}^k\sum_{z_2=1}^k...\sum_{z_N=1}^k\log\Big(\alpha_{z_1}p_{z_1}(x_1\mid{\theta_{z_1}})\Big)\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &\quad+ \sum_{z_1=1}^k\sum_{z_2=1}^k...\sum_{z_N=1}^k\sum_{i=2}^{N}\log\Big(\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})\Big)\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &= \mathcal{A} + \mathcal{B} \end{aligned}\]

其中,

\[\begin{aligned} \mathcal{A} &= \sum_{z_1=1}^k\sum_{z_2=1}^k...\sum_{z_N=1}^k\log\Big(\alpha_{z_1}p_{z_1}(x_1\mid{\theta_{z_1}})\Big)\prod_{i=1}^Np(z_i\mid{x_i,\Theta^g}) \\ &= \sum_{z_1=1}^k\log\Big(\alpha_{z_1}p_{z_1}(x_1\mid{\theta_{z_1}})\Big)p(z_1\mid{x_1,\Theta^g})\underbrace{\sum_{z_2=1}^k...\sum_{z_N=1}^k\prod_{i=2}^Np(z_i\mid{x_i,\Theta^g})}_{result=1} \\ &= \sum_{z_1=1}^k\log\Big(\alpha_{z_1}p_{z_1}(x_1\mid{\theta_{z_1}})\Big)p(z_1\mid{x_1,\Theta^g}) \\ \end{aligned}\]

\(\mathcal{B}\)式可以按照同样的操作技巧进行分解,故不赘述。

并且,我们用\(l\)代替\(z_i\)来简化我们的表达式。

因此,\(Q\)函数可以化简为:

\[\begin{aligned} Q(\Theta,\Theta^{g}) &= \sum_{i=1}^N\sum_{z_i=1}^k\log\Big(\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})\Big)p(z_i\mid{x_i,\Theta^g}) \\ &= \sum_{i=1}^N\sum_{l=1}^k\log\Big(\alpha_{l}p_{l}(x_i\mid{\theta_{l}})\Big)p(l\mid{x_i,\Theta^g}) \\ &= \sum_{l=1}^k\sum_{i=1}^N\log\Big(\alpha_{l}p_{l}(x_i\mid{\theta_{l}})\Big)p(l\mid{x_i,\Theta^g}) \\ &= \sum_{l=1}^k\sum_{i=1}^N\log(\alpha_l)p(l\mid{x_i,\Theta^g})+\sum_{l=1}^k\sum_{i=1}^N\log\Big(p_l(x_i\mid{\theta_{l}})\Big)p(l\mid{x_i,\Theta^g}) \\ \end{aligned}\]

这样,我们可以对包含参数\(\alpha_l\) 和参数\(\theta_l\) 的项分别进行最大化从而得到各自的估计值。

估计参数\(\alpha_l\)

这个问题可以表示为下面的约束最优化问题:

\[\begin{aligned} \underset{\alpha_l}{\max}&\quad \sum_{l=1}^k\sum_{i=1}^N\log(\alpha_l)p(l\mid{x_i,\Theta^g}) \\ s.t.& \quad\sum_{l=1}^k{\alpha_l}=1 \end{aligned}\]

引入拉格朗日乘子\(\lambda\),构建拉格朗日函数:

\[\begin{aligned} \mathcal{L}(\alpha_1,...,\alpha_2,\lambda) &= \sum_{l=1}^k\sum_{i=1}^N\log(\alpha_l)p(l\mid{x_i,\Theta^g})-\lambda\Big(\sum_{l=1}^k{\alpha_l}-1\Big) \\ &= \sum_{l=1}^k\log(\alpha_l)\sum_{i=1}^Np(l\mid{x_i,\Theta^g})-\lambda\Big(\sum_{l=1}^k{\alpha_l}-1\Big) \end{aligned}\]

对参数\(\alpha_l\)求偏导并令其为0:

\[\frac{\partial\mathcal{L}}{\partial\alpha_l}=\frac{1}{\alpha_l}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})-\lambda=0\]

得到:

\[ \alpha_l=\frac{1}{\lambda}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g}) \]

代回约束条件,有:

\[ 1-\frac{1}{\lambda}\sum_{l=1}^{k}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})=0 \]

在之前的推导中,我们得到过这样一个公式,即隐变量\(z\)的条件分布:

\[\begin{aligned} p(z_i\mid{x_i,\Theta}) &= \frac{p(x_i,z_i,\Theta)}{p(x_i,\Theta)} \\ &= \frac{\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})}{\sum_{z_i=1}^k\alpha_{z_i}p_{z_i}(x_i\mid{\theta_{z_i}})} \end{aligned}\]

同样用\(l\)代替\(z_i\)来简化我们的表达式,得到:

\[\begin{aligned} p(l\mid{x_i,\Theta}) &= \frac{p(x_i,l,\Theta)}{p(x_i,\Theta)} \\ &= \frac{\alpha_{l}p_{l}(x_i\mid{\theta_{l}})}{\sum_{l=1}^k\alpha_{l}p_{l}(x_i\mid{\theta_{l}})} \end{aligned}\]

故将其代回之前的式子,得到:

\[\begin{aligned} 1-\frac{1}{\lambda}\sum_{l=1}^{k}\sum_{i=1}^{N}\frac{\alpha_{l}p_{l}(x_i\mid{\theta_{l}})}{\sum_{l=1}^k\alpha_{l}p_{l}(x_i\mid{\theta_{l}})}&=0 \\ 1-\frac{1}{\lambda}\sum_{i=1}^{N}\sum_{l=1}^{k}\frac{\alpha_{l}p_{l}(x_i\mid{\theta_{l}})}{\sum_{l=1}^k\alpha_{l}p_{l}(x_i\mid{\theta_{l}})}&=0 \\ 1-\frac{1}{\lambda}\sum_{i=1}^{N}(1)&=0 \\ 1-\frac{N}{\lambda}&=0 \\ \lambda&=N \end{aligned}\]

故,

\[ \alpha_l=\frac{1}{N}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g}) \]

在估计剩下的参数之前,先补充一下一会要用到的线性代数知识。

【知识点~Matrix Algebra】

  • 矩阵的迹等于矩阵的主对角线上元素之和,且有以下性质
    • \[tr(A+B)=tr(A)+tr(B)\]
    • \[tr(AB)=tr(BA)\]
    • \[\sum_ix_i^TAx_i=tr(AB) \quad where \quad B=\sum_ix_ix_i^T\]
  • \(|A|\)表示矩阵\(A\)的行列式,当\(A\)可逆时,有以下性质
    • \[|A^{-1}|=|A|^{-1}\]
  • \(a_{i,j}\)表示矩阵\(A\)的第\(i\)行,\(j\)列的元素,给出矩阵函数求导的一些公式:
    • \[\frac{\partial{x^TAx}}{\partial{x}}=(A+A^T)x\]
    • \[\frac{\partial\log|A|}{\partial{A}}=2A^{-1}-diag(A^{-1})\]
    • \[\frac{\partial{tr(AB)}}{\partial{A}}=B+B^T-diag(B)\]

估计参数\(\theta_l\)

对于\(d\)维高斯分布来说,参数\(\theta=(\mu,\Sigma)\),且:

\[ p_l(x\mid{\mu_l,\Sigma_l})=\frac{1}{(2\pi)^{d/2}\vert\Sigma_l\vert^{1/2}}\exp\big[-\frac{1}{2}(x-\mu_l)^T\Sigma_l^{-1}(x-\mu_l)\big]\]

估计参数\(\mu_l\)

\[\begin{aligned} &\quad\sum_{l=1}^k\sum_{i=1}^N\log\Big(p_l(x_i\mid{\mu_l,\Sigma_l})\Big)p(l\mid{x_i,\Theta^g}) \\ &= \sum_{l=1}^k\sum_{i=1}^N\Big(\log(2\pi^{-d/2})+\log|\Sigma_l|^{-1/2}-\frac{1}{2}(x_i-\mu_l)^T\Sigma_l^{-1}(x_i-\mu_l)\Big)p(l\mid{x_i,\Theta^g}) \\ \end{aligned}\]

忽略其中的常数项(因为常数项在求导之后为0),上式化简为:

\[\sum_{l=1}^k\sum_{i=1}^N\Big(-\frac{1}{2}\log|\Sigma_l|-\frac{1}{2}(x_i-\mu_l)^T\Sigma_l^{-1}(x_i-\mu_l)\Big)p(l\mid{x_i,\Theta^g})\]

关于\(\mu_l\)求导,得到:

\[\sum_{l=1}^k\sum_{i=1}^N\Bigg(-\frac{1}{2}\Big(\Sigma_l^{-1}+(\Sigma_l^{-1})^T\Big)\Big(x_i-\mu_l\Big)\Big(-1\Big)\Bigg)p(l\mid{x_i,\Theta^g})\]

因为协方差矩阵Sigma为对称阵,故\(\frac{1}{2}\Big(\Sigma_l^{-1}+(\Sigma_l^{-1})^T\Big)=\Sigma_l^{-1}\),因此,上式继续化简为:

\[ \sum_{l=1}^k\sum_{i=1}^N\Sigma_l^{-1}(x_i-\mu_l)p(l\mid{x_i,\Theta^g}) \]

令该式为0,得到:

\[\begin{aligned} \sum_{l=1}^k\Sigma_l^{-1}\sum_{i=1}^N{\mu_l}p(l\mid{x_i,\Theta^g})&=\sum_{l=1}^k\Sigma_l^{-1}\sum_{i=1}^N{x_i}p(l\mid{x_i,\Theta^g}) \\ \sum_{i=1}^N{\mu_l}p(l\mid{x_i,\Theta^g})&=\sum_{i=1}^N{x_i}p(l\mid{x_i,\Theta^g}) \\ \mu_l\sum_{i=1}^Np(l\mid{x_i,\Theta^g})&=\sum_{i=1}^N{x_i}p(l\mid{x_i,\Theta^g}) \\ \mu_l&=\frac{\sum_{i=1}^N{x_i}p(l\mid{x_i,\Theta^g})}{\sum_{i=1}^Np(l\mid{x_i,\Theta^g})} \\ \end{aligned}\]

估计参数\(\Sigma_l\)

\[\begin{aligned} &\quad\sum_{l=1}^k\sum_{i=1}^N\log\Big(p_l(x_i\mid{\mu_l,\Sigma_l})\Big)p(l\mid{x_i,\Theta^g}) \\ &= \sum_{l=1}^k\sum_{i=1}^N\Big(\log(2\pi^{-d/2})+\log|\Sigma_l|^{-1/2}-\frac{1}{2}(x_i-\mu_l)^T\Sigma_l^{-1}(x_i-\mu_l)\Big)p(l\mid{x_i,\Theta^g}) \\ \end{aligned}\]

忽略其中的常数项(因为常数项在求导之后为0),上式化简为:

\[\begin{aligned} &\quad\sum_{l=1}^k\sum_{i=1}^N\Big(-\frac{1}{2}\log|\Sigma_l|-\frac{1}{2}(x_i-\mu_l)^T\Sigma_l^{-1}(x_i-\mu_l)\Big)p(l\mid{x_i,\Theta^g}) \\ &= \sum_{l=1}^k\sum_{i=1}^N\Big(\frac{1}{2}\log|\Sigma_l^{-1}|p(l\mid{x_i,\Theta^g})-\frac{1}{2}(x_i-\mu_l)^T\Sigma_l^{-1}(x_i-\mu_l)p(l\mid{x_i,\Theta^g})\Big) \\ &= \sum_{l=1}^k\Big(\frac{1}{2}\log|\Sigma_l^{-1}|\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})-\frac{1}{2}\Sigma_l^{-1}\sum_{i=1}^{N}(x_i-\mu_l)^T(I)(x_i-\mu_l)p(l\mid{x_i,\Theta^g})\Big) \\ &= \sum_{l=1}^k\Bigg(\frac{1}{2}\log|\Sigma_l^{-1}|\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})-\frac{1}{2}tr\Big(\Sigma_l^{-1}\sum_{i=1}^{N}(x_i-\mu_l)(x_i-\mu_l)^Tp(l\mid{x_i,\Theta^g})\Big)\Bigg) \\ \end{aligned}\]

考虑方程\(S(\mu_l,\Sigma_{l}^{-1})\)为上式中\(\sum_{l=1}^k\)内部的式子,即:

\[ S(\mu_l,\Sigma_{l}^{-1})= \frac{1}{2}\log|\Sigma_l^{-1}|\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})-\frac{1}{2}tr\Big(\Sigma_l^{-1}\underbrace{\sum_{i=1}^{N}(x_i-\mu_l)(x_i-\mu_l)^Tp(l\mid{x_i,\Theta^g})}_{M_l}\Big)\]

\(S\)关于\(\Sigma_l^{-1}\)求导数,得到:

\[\begin{aligned} \frac{\partial{S(\mu_l,\Sigma_l^{-1})}}{\partial{\Sigma_l^{-1}}} &= \frac{1}{2}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})\Big(2\Sigma_l-diag(\Sigma_l)\Big)-\frac{1}{2}\frac{\partial{tr(\Sigma_l^{-1}M_l)}}{\partial\Sigma_l^{-1}} \\ &= \frac{1}{2}\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})\Big(2\Sigma_l-diag(\Sigma_l)\Big)-\frac{1}{2}\Big(2M_l-diag(M_l)\Big) \\ \end{aligned}\]

令该导数值为0,得到:

\[\begin{aligned} \sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})\Big(2\Sigma_l-diag(\Sigma_l)\Big) &= \Big(2M_l-diag(M_l)\Big) \\ 2\Big(\underbrace{\sum_{i=1}^{N}\Sigma_lp(l\mid{x_i,\Theta^g})-M_l}_{\mathcal{A}}\Big) &= diag\Big(\underbrace{\sum_{i=1}^{N}\Sigma_lp(l\mid{x_i,\Theta^g})-M_l}_{\mathcal{A}}\Big) \\ 2\mathcal{A} &= diag(\mathcal{A}) \end{aligned}\]

解得\(\mathcal{A}=0\),即:

\[\begin{aligned} \sum_{i=1}^{N}\Sigma_lp(l\mid{x_i,\Theta^g}) &= M_l \\ \sum_{i=1}^{N}\Sigma_lp(l\mid{x_i,\Theta^g}) &= \sum_{i=1}^{N}(x_i-\mu_l)(x_i-\mu_l)^Tp(l\mid{x_i,\Theta^g}) \\ \Sigma_l\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g}) &= \sum_{i=1}^{N}(x_i-\mu_l)(x_i-\mu_l)^Tp(l\mid{x_i,\Theta^g}) \\ \Sigma_l &= \frac{\sum_{i=1}^{N}(x_i-\mu_l)(x_i-\mu_l)^Tp(l\mid{x_i,\Theta^g})}{\sum_{i=1}^{N}p(l\mid{x_i,\Theta^g})} \end{aligned}\]

转载于:https://www.cnblogs.com/surfzjy/p/7785187.html

你可能感兴趣的文章
使用xrdp或Xmanager 远程连接 CentOS6
查看>>
Linux误删恢复
查看>>
Unity调用Windows窗口句柄,选择文件和目录
查看>>
HashMap循环遍历方式
查看>>
React Native 入门 调试项目
查看>>
C# 通过 Quartz .NET 实现 schedule job 的处理
查看>>
关于java之socket输入流输出流可否放在不同的线程里进行处理
查看>>
目前为止用过的最好的Json互转工具类ConvertJson
查看>>
Day13
查看>>
tensorflow saver简介+Demo with linear-model
查看>>
Luogu_4103 [HEOI2014]大工程
查看>>
Oracle——SQL基础
查看>>
项目置顶随笔
查看>>
Redis的安装与使用
查看>>
P1970 花匠
查看>>
java语言与java技术
查看>>
NOIP2016提高A组五校联考2总结
查看>>
iOS 项目的编译速度提高
查看>>
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>