统计机器学习中的一些概念
目录
- 最大似然估计
- 熵,交叉熵,KL散度
- 变分推理
- example 1:边缘分布难以计算
- example 2:后验概率正比于联合分布
- 使用简单的分布近似复杂的后验概率分布
- 实例理解
最大似然估计
假设我们现在有一批数据,我们想要用一个概率分布去拟合这批数据,概率分布模型的概率密度函数会有一些参数,我们需要参数估计方法获得参数,以得到实际的概率密度函数。
最大似然估计就是一种参数估计方法。
首先,对于一批数据 X = { x 0 , . . . x n } X=\left\{x_{0},...x_{n}\right\} X={x0,...xn},概率分布的参数为 θ \theta θ,有下面式子(贝叶斯公式): p ( θ ∣ X ) = p ( X ∣ θ ) p ( θ ) p ( X ) ∝ p ( X ∣ θ ) p ( θ ) p(\theta|X)=\frac{p(X|\theta)p(\theta)}{p(X)}\propto p(X|\theta)p(\theta) p(θ∣X)=p(X)p(X∣θ)p(θ)∝p(X∣θ)p(θ)其中, p ( θ ∣ X ) p(\theta|X) p(θ∣X)为后验概率,表示给定一组数据,参数出现的概率值。 p ( X ∣ θ ) p(X|\theta) p(X∣θ)为似然,表示给定参数,数据出现的概率值。 p ( θ ) p(\theta) p(θ)为先验概率,表示参数出现的分布。
先验概率,似然,后验概率的具体含义是根据贝叶斯公式灵活变动的。
由于 X X X已经给定,因此, p ( X ) p(X) p(X)可以认为从一个变化的概率值收敛到一个常数值。因此有上面式子的后验概率正比于似然×先验概率。
此时如果再加上一个假设,我们假设参数的分布是一个均匀分布,对于均匀分布,此时参数的取值,只要在取值范围内,概率都是一样的,可以进一步化简: p ( θ ∣ X ) ∝ p ( X ∣ θ ) p(\theta|X)\propto p(X|\theta) p(θ∣X)∝p(X∣θ)此时,我们可以发现,如果要获得最符合 X X X的 θ \theta θ(给定 X X X,获取出现概率最大的那个参数 θ \theta θ),其实就是最大化似然 p ( X ∣ θ ) p(X|\theta) p(X∣θ)。
考虑到 X = { x 0 , . . . x n } X=\left\{x_{0},...x_{n}\right\} X={x0,...xn}的样本的出现是独立同分布的,因此有: θ ^ = a r g m a x p ( X ∣ θ ) = a r g m a x ∏ i n p ( x i ∣ θ ) = a r g m a x l o g ∏ i n p ( x i ∣ θ ) = a r g m a x ∑ i n l o g ( p ( x i ∣ θ ) ) \widehat{\theta}=argmax\thinspace p(X|\theta)=argmax\prod_{i}^{n}p(x_{i}|\theta)\\=argmax\thinspace log\prod_{i}^{n}p(x_{i}|\theta)=argmax\sum_{i}^{n}log(p(x_{i}|\theta)) θ =argmaxp(X∣θ)=argmaxi∏np(xi∣θ)=argmaxlogi∏np(xi∣θ)=argmaxi∑nlog(p(xi∣θ))以具体分布为例,假设已经知道分布是高斯分布,则有: θ = { μ , σ } p ( x i ∣ μ , σ ) = 1 2 π σ 2 e ( − ( x i − μ ) 2 σ 2 ) \theta=\left\{\mu,\sigma\right\}\thinspace p(x_{i}|\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^{2}}}e^{(-\frac{(x_{i}-\mu)^{2}}{\sigma^{2}})} θ={μ,σ}p(xi∣μ,σ)=2πσ2 1e(−σ2(xi−μ)2)将 p ( x i ∣ μ , σ ) p(x_{i}|\mu,\sigma) p(xi∣μ,σ)代入 ∑ i n l o g ( p ( x i ∣ θ ) ) \sum_{i}^{n}log(p(x_{i}|\theta)) ∑inlog(p(xi∣θ)),通过计算极值(求偏导数),我们可以找到最大似然对应的参数 θ ^ \widehat{\theta} θ 。
结合到有监督学习,此时的数据变为 { ( x 0 , y 0 ) , . . . ( x n , y n ) } \left\{(x_{0},y_{0}),...(x_{n},y_{n})\right\} {(x0,y0),...(xn,yn)}, y y y是 x x x的标签。样本的概率分布 p ( ( x i , y i ) ∣ θ ) p((x_{i},y_{i})|\theta) p((xi,yi)∣θ)不知道是正态分布还是任何分布,但可以用深度网络来计算概率,深度网络的参数依然假设服从均匀分布,因此我们可以用最大似然估计参数,优化方法可以使用SGD等。
熵,交叉熵,KL散度
首先了解信息量,对于一个事件,其信息量有三个特征:
- 小概率事件,具有更大的信息量;
- 大概率事件,具有更少的信息量:
- 对于独立事件,互相的信息量可以相加;
根据这三个特征,事件 x x x的信息量被定义为: I ( x ) = l o g ( 1 p ( x ) ) = − l o g ( p ( x ) ) I(x)=log(\frac{1}{p(x)})=-log(p(x)) I(x)=log(p(x)1)=−log(p(x))建立在信息量的基础上,有熵(香农熵)的定义(信息量是描述事件的,熵是描述概率分布的):
- 一个概率分布中,所包含的平均信息量: H ( p ) = ∑ p i I i p = ∑ p i l o g ( 1 p i ) = − ∑ p i l o g ( p i ) H(p)=\sum p_{i}I_{i}^{p}=\sum p_{i}log(\frac{1}{p_{i}})=-\sum p_{i}log(p_{i}) H(p)=∑piIip=∑pilog(pi1)=−∑pilog(pi)熵是用来描述一个概率分布不确定性的方法。
可以发现,如果概率密度函数比较均匀(这会导致样本出现更加随机,比如硬币正面概率0.5,则出现正面或者反面的概率,相比0.8概率正面的情况更随机)此时熵的值更大。
如果概率密度函数更聚拢,则熵的值更小。
思考一个问题,硬币出现正面的ground truth概率为 p ( h ) = 0.5 p(h)=0.5 p(h)=0.5,则出现反面的概率为 p ( t ) = 0.5 p(t)=0.5 p(t)=0.5,但是如果人类一开始不知道硬币是这样的,我们通过统计实验估计出正面出现频率为 q ( h ) = 0.2 q(h)=0.2 q(h)=0.2,反面频率为 q ( t ) = 0.8 q(t)=0.8 q(t)=0.8。其中, q q q代表我们估计的概率分布。
下面引入交叉熵的定义:假设估计出的概率分布 q q q,对于真实的概率分布 p p p的平均信息量。
交叉熵表示为: H ( p , q ) = ∑ p i I i q = ∑ p i l o g ( 1 q i ) = − ∑ p i l o g ( q i ) H(p,q)=\sum p_{i}I_{i}^{q}=\sum p_{i}log(\frac{1}{q_{i}})=-\sum p_{i}log(q_{i}) H(p,q)=∑piIiq=∑pilog(qi1)=−∑pilog(qi)可以理解为,最小化交叉熵,也就是将估计的概率分布调整拟合到ground truth的概率分布。
进一步,过渡到KL散度,这是一种用于量化衡量两个概率分布区别的方法。KL散度等于交叉熵减去熵: D ( p ∣ ∣ q ) = H ( p , q ) − H ( p ) = ∑ p i I i q − ∑ p i I i p = ∑ p i l o g ( p i q i ) D(p||q)=H(p,q)-H(p)=\sum p_{i}I_{i}^{q}-\sum p_{i}I_{i}^{p}=\sum p_{i}log(\frac{p_{i}}{q_{i}}) D(p∣∣q)=H(p,q)−H(p)=∑piIiq−∑piIip=∑pilog(qipi)注意,KL散度的值大于等于零,并且: D ( p ∣ ∣ q ) ≠ D ( q ∣ ∣ p ) D(p||q)\neq D(q||p) D(p∣∣q)=D(q∣∣p)因此,KL散度不能作为一个距离度量指标。
另外: ∇ θ D ( p ∣ ∣ q θ ) = ∇ θ H ( p , q θ ) − ∇ θ H ( p ) = ∇ θ H ( p , q θ ) \nabla_{\theta}D(p||q_{\theta})=\nabla_{\theta}H(p,q_{\theta})-\nabla_{\theta}H(p)=\nabla_{\theta}H(p,q_{\theta}) ∇θD(p∣∣qθ)=∇θH(p,qθ)−∇θH(p)=∇θH(p,qθ)因此,最小化KL散度等价于最小化交叉熵。
变分推理
首先认识隐变量图模型,隐变量代表了被观测变量的一些属性,比如下图,被观测变量是一张猫的图像,隐变量为类别的one-hot编码。
隐变量和被观测变量组成了隐变量图模型。
对于变分推理,首先看推理部分,一般来说,我们希望通过观测数据获得数据的知识,即:从被观测变量推理无法观测到的隐变量。从概率的角度有: x ∼ p ( x ) z ∼ p ( z ∣ x ) x\sim p(x)\thinspace z\sim p(z|x) x∼p(x)z∼p(z∣x)在贝叶斯公式中, p ( z ∣ x ) p(z|x) p(z∣x)可以理解为后验概率(隐变量在给定观测变量下出现的概率): p ( z ∣ x ) = p ( x ∣ z ) p ( z ) p ( x ) = p ( x ∣ z ) p ( z ) ∫ z p ( x , z ) d z p(z|x)=\frac{p(x|z)p(z)}{p(x)}=\frac{p(x|z)p(z)}{\int_{z}p(x,z)dz} p(z∣x)=p(x)p(x∣z)p(z)=∫zp(x,z)dzp(x∣z)p(z)通常,边缘分布 p ( x ) = ∫ z p ( x , z ) d z p(x)=\int_{z}p(x,z)dz p(x)=∫zp(x,z)dz是难以计算的(详细理解参考下面的example 1),因此,后验分布也是难以计算的。
p ( x ) p(x) p(x)与最大似然估计中的 p ( X ) p(X) p(X)是不同的, p ( X ) p(X) p(X)是整体samples出现的概率,由于数据 X X X已经是给定的,所以 p ( X ) p(X) p(X)是一个常数。
p ( x ) p(x) p(x)描述的是具体sample的概率,不同的 x x x值对应着不同的 p ( x ) p(x) p(x)值,并且,我们不能武断地假设成样本服从某个已知的分布,再利用该分布的概率密度函数计算概率。
为了解决这个问题,我们使用一个可以参数化的已知概率分布 q ( z ) q(z) q(z)近似真实的后验分布 p ( z ∣ x ) p(z|x) p(z∣x)。这个近似的过程称之为变分。
使用近似的概率分布,尝试在给定被观测变量情况下,估计隐变量概率分布的过程称为变分推理。如果我们对隐变量进行采样,并且在给定隐变量的情况下,使用似然对被观测变量进行采样,就称为生成过程。
example 1:边缘分布难以计算
变分推理的描述依然抽象,下面以具体例子来理解。
假设隐变量服从指数分布: z ∼ p ( z ) = e − z I ( z ≥ 0 ) z\sim p(z)=e^{-z}I(z\geq 0) z∼p(z)=e−zI(z≥0)其中, I ( ⋅ ) I(\cdot) I(⋅)为指示函数(或者说阶跃函数)。
假设被观测变量服从高斯分布: x ∼ p ( x ∣ z ) = N ( x ∣ μ = z , σ = 1 ) = 1 2 π e ( − 1 2 ( x − z ) 2 ) x\sim p(x|z)=N(x|\mu=z,\sigma=1)=\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(x-z)^{2})} x∼p(x∣z)=N(x∣μ=z,σ=1)=2π 1e(−21(x−z)2)在这样的假设下,联合分布为: p ( x , z ) = p ( x ∣ z ) p ( z ) = 1 2 π e ( − 1 2 ( x − z ) 2 ) e − z I ( z ≥ 0 ) p(x,z)=p(x|z)p(z)\\=\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(x-z)^{2})}e^{-z}I(z\geq 0) p(x,z)=p(x∣z)p(z)=2π 1e(−21(x−z)2)e−zI(z≥0)因此边缘分布为: p ( x ) = ∫ p ( x , z ) d z = ∫ 0 ∞ e − z 1 2 π e ( − 1 2 ( x − z ) 2 ) d z p(x)=\int p(x,z)dz=\int_{0}^{\infty}e^{-z}\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(x-z)^{2})}dz p(x)=∫p(x,z)dz=∫0∞e−z2π 1e(−21(x−z)2)dz在这种情况下,边缘分布是很难甚至没法计算的,因为 z z z是连续空间,积分难以找到形式解析解。
example 2:后验概率正比于联合分布
由于被观测的数据 x x x给定,此时 p ( x ) p(x) p(x)是一个具体的数值(常数),根据贝叶斯公式有: p ( z ∣ x ) = p ( x , z ) p ( x ) ∝ p ( x , z ) = p ( x ∣ z ) p ( z ) = 1 2 π e ( − 1 2 ( x − z ) 2 ) e − z I ( z ≥ 0 ) p(z|x)=\frac{p(x,z)}{p(x)}\propto p(x,z)=p(x|z)p(z)=\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(x-z)^{2})}e^{-z}I(z\geq 0) p(z∣x)=p(x)p(x,z)∝p(x,z)=p(x∣z)p(z)=2π 1e(−21(x−z)2)e−zI(z≥0)化简后有以下正比关系: p ( z ∣ x ) ∝ 1 2 π e ( − 1 2 ( z − ( x − z ) ) 2 ) I ( z ≥ 0 ) p(z|x)\propto\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(z-(x-z))^{2})}I(z\geq 0) p(z∣x)∝2π 1e(−21(z−(x−z))2)I(z≥0)我们可以从下图得到验证:
- 当我们分别令 x = 1.5 , 0 x=1.5,0 x=1.5,0代入 1 2 π e ( − 1 2 ( z − ( x − z ) ) 2 ) I ( z ≥ 0 ) \frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(z-(x-z))^{2})}I(z\geq 0) 2π 1e(−21(z−(x−z))2)I(z≥0)得到蓝色的联合概率分布,红色曲线为数值计算统计出的真实后验概率分布。可以发现两者确实成正比。
我们发现后验概率正比于联合分布,但是 p ( x ) p(x) p(x)虽然是常数,但 x x x不同,常数的值也不同,因此,不能简单的用联合分布去表示后验概率。
在比较概率时,我们不能比较联合分布,应该比较正则化的后验概率分布,图像分类就是比较后验概率的例子。
使用简单的分布近似复杂的后验概率分布
我们使用KL散度衡量两个分布的差距: D ( q ∣ ∣ p ) = H ( q , p ) − H ( q ) = ∫ q ( x ) l o g q ( x ) p ( x ) d x = E x ∼ q [ l o g q ( x ) − l o g p ( x ) ] D(q||p)=H(q,p)-H(q)=\int q(x)log\frac{q(x)}{p(x)}dx\\=E_{x\sim q}[log\thinspace q(x)-log\thinspace p(x)] D(q∣∣p)=H(q,p)−H(q)=∫q(x)logp(x)q(x)dx=Ex∼q[logq(x)−logp(x)]现在我们有一个直观的想法,使用近似分布 q θ ( z ) q_{\theta}(z) qθ(z)近似到 p ( z ∣ x ) p(z|x) p(z∣x),即: D ( q θ ( z ) ∣ ∣ p ( z ∣ x ) ) = E z ∼ q [ l o g q θ ( z ) − l o g p ( z ∣ x ) ] = E z ∼ q [ l o g q θ ( z ) − l o g p ( z , x ) p ( x ) ] = E z ∼ q [ l o g q θ ( z ) − l o g p ( z , x ) ] + l o g p ( x ) D(q_{\theta}(z)||p(z|x))=E_{z\sim q}[log\thinspace q_{\theta}(z)-log\thinspace p(z|x)]\\=E_{z\sim q}[log\thinspace q_{\theta}(z)-log\thinspace \frac{p(z,x)}{p(x)}]\\=E_{z\sim q}[log\thinspace q_{\theta}(z)-log\thinspace p(z,x)]+log\thinspace p(x) D(qθ(z)∣∣p(z∣x))=Ez∼q[logqθ(z)−logp(z∣x)]=Ez∼q[logqθ(z)−logp(x)p(z,x)]=Ez∼q[logqθ(z)−logp(z,x)]+logp(x)上面式子可以改为: l o g p ( x ) = E z ∼ q [ l o g p ( z , x ) − l o g q θ ( z ) ] + D ( q θ ( z ) ∣ ∣ p ( z ∣ x ) ) log\thinspace p(x)=E_{z\sim q}[log\thinspace p(z,x)-log\thinspace q_{\theta}(z)]+D(q_{\theta}(z)||p(z|x)) logp(x)=Ez∼q[logp(z,x)−logqθ(z)]+D(qθ(z)∣∣p(z∣x))由于KL散度大于等于0,因此有: l o g p ( x ) ≥ E z ∼ q [ l o g p ( z , x ) − l o g q θ ( z ) ] log\thinspace p(x)\geq E_{z\sim q}[log\thinspace p(z,x)-log\thinspace q_{\theta}(z)] logp(x)≥Ez∼q[logp(z,x)−logqθ(z)]并且根据等式有,最小化KL散度,等价于最大化 E z ∼ q [ l o g p ( z , x ) − l o g q θ ( z ) ] E_{z\sim q}[log\thinspace p(z,x)-log\thinspace q_{\theta}(z)] Ez∼q[logp(z,x)−logqθ(z)](ELBO,evidence lower bound)。
实例理解
以实际例子理解,假设隐变量服从指数分布: z ∼ p ( z ) = e − z I ( z ≥ 0 ) z\sim p(z)=e^{-z}I(z\geq 0) z∼p(z)=e−zI(z≥0)其中, I ( ⋅ ) I(\cdot) I(⋅)为指示函数(或者说阶跃函数)。
假设我们有近似分布 q θ ( z ) q_{\theta}(z) qθ(z): q θ ( z ) = θ e − θ z I ( z ≥ 0 ) q_{\theta}(z)=\theta e^{-\theta z}I(z\geq 0) qθ(z)=θe−θzI(z≥0)假设被观测变量服从高斯分布: x ∼ p ( x ∣ z ) = N ( x ∣ μ = z , σ = 1 ) = 1 2 π e ( − 1 2 ( x − z ) 2 ) x\sim p(x|z)=N(x|\mu=z,\sigma=1)=\frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(x-z)^{2})} x∼p(x∣z)=N(x∣μ=z,σ=1)=2π 1e(−21(x−z)2)则ELBO为: L = E z ∼ q [ l o g p ( z , x ) − l o g q θ ( z ) ] = E z ∼ q [ l o g p ( x ∣ z ) p ( z ) − l o g q θ ( z ) ] L=E_{z\sim q}[log\thinspace p(z,x)-log\thinspace q_{\theta}(z)]=E_{z\sim q}[log\thinspace p(x|z)p(z)-log\thinspace q_{\theta}(z)] L=Ez∼q[logp(z,x)−logqθ(z)]=Ez∼q[logp(x∣z)p(z)−logqθ(z)]以 x = 1.5 x=1.5 x=1.5为例,通过计算偏导数 ∂ L ∂ θ = 0 \frac{\partial L}{\partial \theta}=0 ∂θ∂L=0,得到 θ = 1.186 \theta=1.186 θ=1.186。因此,我们得到了与真实后验概率近似的近似概率(基底形式为指数函数)。下图可以作为验证:
- 以 x = 1.5 x=1.5 x=1.5为例,代入 1 2 π e ( − 1 2 ( z − ( x − z ) ) 2 ) I ( z ≥ 0 ) \frac{1}{\sqrt{2\pi}}e^{(-\frac{1}{2}(z-(x-z))^{2})}I(z\geq 0) 2π 1e(−21(z−(x−z))2)I(z≥0)得到蓝色的联合概率分布,红色曲线为数值计算统计出的真实后验概率分布。绿色曲线为对应的近似分布。可以看到确实有拟合的现象。
在VAE中,编码器部分相当于计算后验分布 p ( z ∣ x ) p(z|x) p(z∣x),解码器部分相当于计算 p ( x ∣ z ) p(x|z) p(x∣z),对于VAE,我们不一定使用 q ( z ) q(z) q(z)是正态分布的假设,而是假设 p ( z ∣ x ) p(z|x) p(z∣x)是正态分布:
- 即VAE为每个样本构造正态分布,然后采样实现重建;
- 给定一个样本 x x x,假设存在专属于 x x x的正态分布 p ( z ∣ x ) p(z|x) p(z∣x),为了使模型具有正确的生成能力,我们通常要求其接近标准正态分布,即 x x x经过编码, z z z的分布接近零均值和单位方差,但依然有专属于该样本的 μ \mu μ和 σ \sigma σ。
- 因此,在这里, q ( z ) q(z) q(z)就被设置为标准正态分布。
统计机器学习中的一些概念相关推荐
- 《机器学习》Chapter 1 绪论——机器学习中的基本概念和术语
<机器学习>Chapter 1 绪论 机器学习中的基本概念和术语 首先,通过思维导图来描述一下西瓜书第一章的知识内容与结构. 西瓜书第一章思维导图 基本概念 在学习机器学习之前,首先要搞清 ...
- 机器学习中的基本概念
基本概念有: 训练集,测试集,特征向量,概念学习,监督学习,非监督学习,半监督学习,分类,回归 训练集:用来进行训练,也就是产生模型或者算法的数据集 测试集:用来专门进行测试已经学习好的模型或者算法的 ...
- 复习01统计学习方法(机器学习中的重要概念)---图片版
- 机器学习中的一些概念
显著式编程:显著式编程从一开始就定死了程序的输入和输出. 非显著式编程:让计算机自己总结规律的编程方法叫做非显著式编程.非显著式编程是让计算机通过数据.经验自动的学习完成我们交给的任务. 机器学习关注 ...
- 机器学习中常用的基本概念
目录 1. 机器学习定义 2. 机器学习中的属性与特征 3.误差 4.过拟合与欠拟合 4.1 过拟合 4.2欠拟合 5.交叉验证 5.1交叉验证基本思想 5.2 交叉验证训练过程 6.调参 7. 机器 ...
- (Latent Space)理解机器学习中的潜在空间
原文链接:https://zhuanlan.zhihu.com/p/369946876 搬运自 https://towardsdatascience.com/understanding-latent- ...
- 彻底搞懂机器学习中的正则化
正则化在机器学习当中是十分常见的,本次就来比较完整地总结一下~ 首先列一下本篇文章所包含的内容目录,方便各位查找: LP范数 L1范数 L2范数 L1范数和L2范数的区别 Dropout Batch ...
- 一文读懂机器学习中的正则化
来源:Poll的笔记 本文约2600字,建议阅读5分钟 还在被正则化困扰?本文为你答疑解惑! 目录 LP范数 L1范数 L2范数 L1范数和L2范数的区别 Dropout Batch Normaliz ...
- 收藏 | 一文读懂机器学习中的正则化
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨Poll的笔记 来源丨数据派THU 编辑丨极市平台 A ...
最新文章
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置边界颜色)实战
- 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)
- swift3.0调用相册
- Windows 市场份额十年来首次跌破 90%
- IOS开发笔记(Swift):UITableView表格视图的静态使用
- 微软官方的.NET Framework API 参考网址
- REDIS一致性检查
- java treeset subset_Java中TreeSet的详细用法
- 织梦的if(!defined('DEDEINC')) exit("Request Error!");解析
- 启动/关闭数据库、实例及服务
- zabbix3.0.2 使用percona mysql插件来监控mysql5.7的详细实现过程
- 转JMeter 利用Jmeter批量数据库插入数据
- 高通联机修改IMEI等参数的相关解析
- feasycom蓝牙对接Android,蓝牙音频收发一体方案
- 英特尔全面布局云边协同,夯实医疗云数智创新底座
- python中判断生肖和星座哪个准_星座准还是属相
- 为求一层栈,追踪八万里
- 设计模式知我所见。。。
- excel流程图分叉 合并_流程图怎么画多个分支
- vscode 程序员鼓励师_程序员鼓励师插件Rainbow Fart(彩虹屁)