文献阅读—GAIN:Missing Data Imputation using Generative Adversarial Nets

文章提出了一种填补缺失数据的算法—GAIN。生成器G观测一些真实数据,并用真实数据预测确实数据,输出完整的数据;判别器D试图去判断完整的数据中,哪些是观测到的真实值,哪些是填补的值。给D提供一些额外的提示信息,保证G可以学习期望的分布。提示向量向D透露了原始数据的部分信息。在多个数据集上测试了算法,算法效果较好。

一.引言

1.缺失数据可以分成三类:

        MCAR:完全随机缺失,数据的缺失不依赖于任何不完全变量和完全变量。

        MAR:随机缺失,数据的缺失不是完全随机的,依赖于其他完全变量。

        MNAR:完全非随机缺失,数据的缺失不依俩于不完全变量自身。

文章数据是基于MCAR的。

2.比较先进的填补方法:MICE、MissForest、matrix completion、Expectation Maximization、DAE 、GAN等。

        但是现有的方法存在各种缺陷。(Garc´ıa-Laencina et al., 2010)的方法加设了一个分布,但数据类型是混合型、连续变量时不适用。(Vincent et al., 2008)的DAE算法,实践效果好,但训练过程需要完整数据。(Gondara &Wang,2017)的DAE算法不需要完整数据,但它只能利用观察到的部分去学习数据的表示。

        论文提出了GAIN算法,它是GAN算法的推广。核心就是对抗,生成器要使判别器的误判率最大,判别器要使分类误差最小。

二、问题描述

 \chi = \chi _{1}\times \chi _{2}\times ...\times \chi _{d}  —  d维空间

X = (X_{1},...,X_{d})  —  数据向量(取值于\chi的随机向量)

P(X) - X的分布

M- 掩模向量(只在0、1中进行取值)

\tilde{X}-缺失值的地方为*,不缺的地方保留X中的

D = \left \{ \left (\tilde{x} ^{i},m^{i} \right ) \right \}_{i=1}^{m} - 数据集表示,m^{i}是对应的\tilde{x}^{i} M的恢复实现

目标就是填补\tilde{x}^{i}中未观测到的值 

三、GAIN

1.Generator

        输入:\tilde{X},M,Z

        输出:\bar{X},\hat{X}

        \bar{X} = G(\tilde{X},M,(1-M)\odot Z)

        \hat{X} = M\odot \tilde{X}+(1-M)\odot \bar{X}

G会针对每一个值(包括非缺失值)相应输出一个填补值,\bar{X}就是填补值。

\hat{X}是一个完整的数据向量,有缺失值的地方用相应的\bar{X}中的数据,无缺失的地方用\tilde{X}中的值。

2.Discriminator 

        判别哪个是real,哪个是fake。这就相当于是预测向量M,而M在一开始的时候就给定了。

3.Hint

        提示机制就是一个随机变量H,依赖于M,将H作为一个附加信息传给Discriminator。

        为什么要有提示机制?如果没有的话,G可以重现好几种分布,对于D来说他们都是最优的。

4.Objective

        训练D最大化的正确预测M,G有最小概率让D预测M。

        V(D ,G) = \mathbb{E}_{\hat{X},M,H} [M^{T}logD(\hat{X},H)+(1-M)^{T}log(1-D(\hat{X},H))]

        \pounds (a,b) = \sum_{i=1}^{d}[a_{i}log(b_{i})+(1-a_{i})log(1-b_{i})]

        令\hat{M} = D(\hat{X},H)​​​​​​​,则有:

        minmax(D,G) \Rightarrow minmax\mathbb{E}[\pounds (M,\hat{M})]

四、理论分析

看的晕头转向的...写不出来了

五、GAIN算法

(写一些看完论文后自己的理解的模型运行吧,也不知道对不对)

1.算法架构图

文献阅读—GAIN:Missing Data Imputation using Generative Adversarial Nets_第1张图片

2.我理解的算法运行过程:

  ​​​​​​​        首先进行数据处理,给出一个完整的数据集(data_ori)和缺失率。根据缺失率,相应的随机挖掉原始数据集中的一些数据,得到含有缺失值的数据集(data_x)。在创建一个与data_x大小维度一样的掩模向量M,data_x中有数据的位置,M相应位置为1,data_x中缺失的部分,M相应位置为0。

        由此得到三个向量:data_ori,data_x,M

        将data_x,M和Z输入到Generator中,Z为随机噪声向量(只针对有缺失值的部分添加噪声)。经过G的计算,得到一个输出G_prob,它是一个与data_x大小维度一样的向量,针对data_x中的每个值进行了生成,但原始数据为缺失部分并不需要进行填补,所以imputed matrix取:data_x中未缺失部分+G_prob中填补的缺失部分。

        将imputed matrix与Hint 输入给Discriminator,经过D的判别,得到一个输出D_prob。D_prob所有数值在范围(0,1)之间。

        将D_prob与M做loss值,反馈给D;D_prob与M做loss值+data_x与imputed matrix做loss值,反馈给G。使得D和G不断的优化,寻找最佳方案。最后得到一个最优解进行输出。

六、实验

略  

  

后记

时隔许久的今天,我好像明白了hint矩阵的意义!

生成器和判别器就像是两个人,一个人小G造假金币,一个人小D鉴定真假币。

第一次,小G造了一枚假金币,混在一堆真金币中,让小D进行鉴定;小D一下就挑出了假金币,告诉小G,假金币颜色就不对。

第二次,小G在吸取经验,造了一枚颜色一样假金币,混在一堆真金币中,让小D进行鉴定;小D掂了一下就挑出了假金币,告诉小G,假金币重量不对。

... ...

如此循环了很多次。小G造假金币的能力越来越高,小D鉴定的能力也越来越强。

终于有一天,小D再也鉴定不出小G造的假金币了。

而这个过程中,需要小D比小G稍微业务能力强一些。否则,永远不能达到鞭策小G进步,小G不进步,小D自己的业务能力也得不到提升,就废了。

感觉这个hint矩阵就是为了让小D业务能力稍微强一点。不知道是否对,但我觉得自己好像对了!为自己鼓掌!不管对不不对,我又进步了!

你可能感兴趣的:(文献阅读,python)