从生成模型到GDA再到GMM和EM算法

在学习生成模型之前,先学习了解下密度估计和高斯混合模型。为什么呢?因为后面的VAE\GANs模型都需要把训练样本,也就是输入的图像样本看作是一个复杂的、多维的分布。

1. 知乎上关于图像频率的解释

作者:耳东陈
链接:https://www.zhihu.com/question/20099543/answer/13971906
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先说说图像频率的物理意义。图像可以看做是一个定义为二维平面上的信号,该信号的幅值对应于像素的灰度(对于彩色图像则是RGB三个分量),如果我们仅仅考虑图像上某一行像素,则可以将之视为一个定义在一维空间上信号,这个信号在形式上与传统的信号处理领域的时变信号是相似的。不过是一个是定义在空间域上的,而另一个是定义在时间域上的。所以图像的频率又称为空间频率,它反映了图像的像素灰度在空间中变化的情况。例如,一面墙壁的图像,由于灰度值分布平坦,其低频成分就较强,而高频成分较弱;而对于国际象棋棋盘或者沟壑纵横的卫星图片这类具有快速空间变化的图像来说,其高频成分会相对较强,低频则较弱(注意,是相对而言)。再来谈一谈如何定量的测量图像的空间频率,最为常用的方法就是二维傅里叶变换。图像经过二维傅里叶变换后会形成与图像等大的复数矩阵,取其幅值形成幅度谱,取其相位形成相位谱。图像的频率能量分布主要体现在幅度谱中。通常习惯将低频成分放在幅度谱的中央,而将高频成分放在幅度谱边缘。大多数自然图像的幅度谱在统计上呈现1/f^2分布,也就是频率成分的能量与频率的平方成反比。所以从绝对数值上看,低频能量通常是要高于高频能量的,这一规则也称为power law。power law并非是上帝的无心之作,事实上power law的出现时源于自然图像的尺度不变性(scale invariance)。这一点在很多文献中被解释为从不同的距离观察同样的自然场景,获得的图像的幅度谱是基本相同的。相关内容可以搜索关键字power law & natural image statistics。除了傅里叶变换外,正弦变换、余弦变换、Gabor变换、小波变换、WH变换也可以用来对图像频率分布进行定量测量。目前小波变换是研究的热点,因为小波变换不但能够反映频率能量的分布,同时还保留了图像特征的空间分布特性。

2. 生成学习算法(cs229,Ng)

2.1 生成算法和判别算法的区别
举个栗子:

我们要区分elephants(y=1)和dogs(y=0)

  • 对判别模型(discriminative),以logistic回归为例:

    • logistic回归模型: p(y|x;θ) , hθ=g(θTx) 其中g是sigmoid函数。通过logistic回归,我们找到一条决策边界decision boundary,能够区分elephants和dogs.
  • 而对于生成模型(generative):

    • 模型:p(x|y),在给定了样本所属的类的条件下,对样本特征建立概率模型。
    • p(x|y=1)是elephants的分类特征模型
    • p(x|y=0)是dogs的分类特征模型
  • 已知p(y)是先验类别的分布,生成模型p(x|y)可通过学习得到,则根据Bayes公式,可以推导出后验概率分布,即通过特征数据进行预测

    p(y=1|x)=p(x|y=1)p(x)p(x)

    其中分母可以这么计算得到 p(x)=p(y=0|x)p(x)+p(y=1|x)p(x)

  • 但p(y)和p(x|y)我们已经知道了,那么可以不用计算p(x),计算方法如下:

    argmaxyp(y|x)=argmaxyp(x|y)p(y)p(x)=argmaxyp(x|y)p(y)

总结下就是:
- 生成模型:一般是学习一个代表目标的模型,然后通过它去搜索图像区域,然后最小化重构误差。类似于生成模型描述一个目标,然后就是模式匹配了,在图像中找到和这个模型最匹配的区域,就是目标了。

  • 判别模型:以分类问题为例,然后找到目标和背景的决策边界。它不管目标是怎么描述的,那只要知道目标和背景的差别在哪,然后你给一个图像,它看它处于边界的那一边,就归为哪一类。

  • 由生成模型可以得到判别模型,但由判别模型得不到生成模型。

然鹅,生成模型p(x|y)怎么得到呢?不慌,我们先了解下多维正态分布~

2.2 多维正态分布(the multivariate nirmal distribution)

这里写图片描述

关于一维正态分布怎么推导出多维正态分布的概率密度函数,可参考知乎:多维高斯分布是如何由一维发展而来的?

首先一维正态分布:

p(x)=12πexp(x22)

二维标准正态分布,就是两个独立的一维标准正态分布随机变量的联合分布:

p(x,y)=p(x)p(y)=12πexp(x2+y22)

把两个随机变量组合成一个随机向量: v=[xy]T

p(v)=12πexp(12vTv) 显然x,y相互独立的话,就是上面的二维标准正态分布公式~

然后从标准正态分布推广到一般正态分布,通过一个线性变化: v=A(xμ)

p(x)=|A|2πexp[12(xμ)TATA(xμ)]

注意前面的系数多了一个|A|(A的行列式)。

可以证明这个分布的均值为 μ ,协方差为 (ATA)1 。记 Σ=(ATA)1 ,那就有

p(x)=12π|Σ|1/2exp[12(xμ)TΣ1(xμ)]

推广到n维:

p(x)=1(2π)n/2|Σ|1/2exp[12(xμ)TΣ1(xμ)]

需要注意的是:这里的二维、n维到底指的是什么?
- 以飞机检测的数据点为例,假设它由heat和time决定,那么这就是个二维正态分布,数据点的生成所处的位置由其概率决定,也就是 p(x)
- 如果这个数据有n个特征,那么其分布就是n维正态分布。
- 之前一直理解的是,n维正态分布是两个向量巴拉巴拉。。好像一直没搞懂。。

再顺便了解下协方差矩阵吧~

2.3 关于协方差矩阵,参考blog

对多维随机变量 X=[X1,X2,,Xn]T ,我们往往需要计算各维度之间的协方差,这样协方差就组成了一个n×n的矩阵,称为协方差矩阵。协方差矩阵是一个对角矩阵,对角线上的元素是各维度上随机变量的方差,非对角线元素是维度之间的协方差。 我们定义协方差为 Σ , 矩阵内的元素 Σij 为:

Σij=cov(Xi,Xj)=E[(XiE(Xi))(XjE(Xj))]

则协方差矩阵为:

Σ=E[(
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDA算法即为高斯判别分析算法,是一种机器学习方法,旨在通过对样本数据的高斯分布进行分析,对数据进行分类。在代码实现方面,可以使用Python的numpy库来进行复现。 首先,我们需要构建一个符合高斯分布的数据集。假设我们要生成两个类别的数据,每个类别包含100个样本,每个样本有两个特征,可以使用如下代码: import numpy as np mean1 = np.array([0, 0]) mean2 = np.array([1.5, 1.5]) cov = np.array([[1, 0.5], [0.5, 1]]) data1 = np.random.multivariate_normal(mean1, cov, 100) data2 = np.random.multivariate_normal(mean2, cov, 100) 将数据集分为训练集和测试集,并计算每个类别的先验概率、均值和协方差矩阵: train_X = np.vstack((data1[:70], data2[:70])) train_y = np.vstack((np.zeros((70, 1)), np.ones((70, 1)))) test_X = np.vstack((data1[70:], data2[70:])) test_y = np.vstack((np.zeros((30, 1)), np.ones((30, 1)))) p1 = len(train_X[train_y == 0]) / len(train_X) p2 = len(train_X[train_y == 1]) / len(train_X) mean1 = np.mean(train_X[train_y == 0], axis=0) mean2 = np.mean(train_X[train_y == 1], axis=0) cov1 = np.cov(train_X[train_y == 0].T) cov2 = np.cov(train_X[train_y == 1].T) 计算协方差矩阵在GDA算法中很重要,需要注意对每个类别单独计算。接下来,定义GDA分类器: def gaussian(x, mean, cov): d = len(mean) dev = x - mean return (1.0 / (np.sqrt((2 * np.pi) ** d * np.linalg.det(cov)))) * np.exp(-0.5 * np.dot(np.dot(dev.T, np.linalg.inv(cov)), dev)) def predict(x): g1 = np.log(p1) + np.log(gaussian(x, mean1, cov1)) g2 = np.log(p2) + np.log(gaussian(x, mean2, cov2)) return int(g1 < g2) 对于一个测试集中的样本,输入到predict函数中即可以得到预测的类别。在测试集上计算分类正确率: correct = 0 for i in range(test_X.shape[0]): if predict(test_X[i]) == test_y[i]: correct += 1 accuracy = correct / test_X.shape[0] print('Test Accuracy:', accuracy) GDA算法的代码实现也可以通过sklearn库中的GaussianNB类来实现,但通过自己的代码实现可以清晰地了解算法原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值