1.概率密度函数,密度函数,概率分布函数和累计分布函数
从数学上看,累计分布函数F(x)=P(X<x),表示随机变量X的值小于x的概率。这个意义很容易理解。
概率密度f(x)是F(x)在x处的关于x的一阶导数,即变化率。如果在某一x附近取非常小的一个邻域Δx,那么,随机变量X落在(x, x+Δx)内的概率约为f(x)Δx,即P(x<X<x+Δx)≈f(x)Δx。换句话说,概率密度f(x)是X落在x处“单位宽度”内的概率。“密度”一词可以由此理解,同时表示任意点的概率,各种概率密度函数的曲线的横坐标是x的值,纵坐标是该点被取到的概率。
例子:
a. 最简单的概率密度函数是均匀分布的密度函数,对于一个取值在区间 上的均匀分布函数。也就是说,当x 不在区间上的时候,函数值等于0,而在区间上的时候,函数值等于 。这个函数并不是完全的连续函数,但是是可积函数。
b. 正态分布是重要的概率分布。随着参数 和 变化,概率分布也产生变化。它的概率密度函数如下,其中u和delta是正态分布两个参数,标准正态分布u=0,delta=1,
在概率论中,假设随机变量的分布符合正态分布,那么根据样本的值就可以得到两个参数的值,公式如下,这种算法是极大似然的思想(下面有介绍)。但是,也可以通过MAP进行计算,效果可以更好,也可以更坏。这里注意delta是标准差,表示的是随机变量摇摆的的幅度,简单来讲摇摆的幅度越小,说明模型越稳定。
2.先验概率和后验概率
本文假设大家都知道什么叫条件概率了(P(A|B)表示在B事件发生的情况下,A事件发生的概率)。
基于条件概率,看看全概率和贝叶斯推断:
求解P(B)的过程就是全概率公式。求解P(A|B)的过程就是贝叶斯公式。
先验概率是指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现,指全概率公式中的所有信息(因)全部已知。
后验概率是指依据得到"结果"信息所计算出的最有可能是那种事件发生,如贝叶斯公式中的,是"执果寻因"问题中的"因"。这个里面的因的信息往往是未知的,需要求。
先验概率和后验概率:
教科书上的解释总是太绕了。其实举个例子大家就明白这两个东西了。
假设我们出门堵车的可能因素有两个(就是假设而已,别当真):车辆太多和交通事故。
堵车的概率就是先验概率 。(根据经验,通过假设得到每天这个时候堵车的概率。事情还没有发生,要求这件事情发生的可能性的大小,是先验概率.)
那么如果我们出门之前我们听到新闻说今天路上出了个交通事故,那么我们想算一下堵车的概率,这个就叫做条件概率 。也就是P(堵车|交通事故)。这是有因求果。
如果我们已经出了门,然后遇到了堵车,那么我们想算一下堵车时由交通事故引起的概率有多大,那这个就叫做后验概率 (也是条件概率,但是通常习惯这么说)。也就是P(交通事故|堵车)。这是有果求因。
下面的定义摘自百度百科:
先验概率是指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现.
后验概率是指依据得到"结果"信息所计算出的最有可能是那种事件发生,如贝叶斯公式中的,是"执果寻因"问题中的"因".
另外:先验概率是指根据以往经验和分析得到的概率,如全概率公式,它往往作为“由因求果”问题中的“因”出现。后验概率是指在得到“结果”的信息后重新修正的概率,如贝叶斯公式中的,是“执果寻因”问题中的“因”。先验概率与后验概率有不可分割的联系,后验概率的计算要以先验概率为基础。
----------
那么这两个概念有什么用呢?
最大似然估计,我们来看一个例子:
有一天,有个病人到医院看病。他告诉医生说自己头痛,然后医生根据自己的经验判断出他是感冒了,然后给他开了些药回去吃。有人肯定要问了,这个例子看起来跟我们要讲的最大似然估计有啥关系啊。关系可大了,事实上医生在不知不觉中就用到了最大似然估计(虽然有点牵强,但大家就勉为其难地接受吧^_^)。
大家知道,头痛的原因有很多种啊,比如感冒,中风,脑溢血...(脑残>_<这个我可不知道会不会头痛,还有那些看到难题就头痛的病人也不在讨论范围啊!)。那么医生凭什么说那个病人就是感冒呢?哦,医生说这是我从医多年的经验啊。咱们从概率的角度来研究一下这个问题。其实医生的大脑是这么工作的,他计算了一下:
P(感冒|头痛)(头痛由感冒引起的概率,下面类似)
P(中风|头痛)
P(脑溢血|头痛)
...
然后这个计算机大脑发现,P(感冒|头痛)是最大的,因此就认为呢,病人是感冒了。看到了吗?这个就叫最大似然估计(Maximum likelihood estimation,MLE) 。
咱们再思考一下,P(感冒|头痛),P(中风|头痛),P(脑溢血|头痛)是先验概率还是后验概率呢?
没错,就是后验概率。看到了吧,后验概率可以用来看病(只要你算得出来,呵呵)。事实上,后验概率起了这样一个用途,根据一些发生的事实(通常是坏的结果),分析结果产生的最可能的原因,然后才能有针对性地去解决问题。
那么先验概率有啥用呢?
我们来思考一下,P(脑残|头痛)是怎么算的。P(脑残|头痛)=头痛的人中脑残的人数/头痛的人数,头痛的样本倒好找,但是头痛的人中脑残的人数就不好调查了吧。如果你去问一个头痛的人你是不是脑残了,我估计那人会把你拍飞吧。接下来先验概率就派上用场了。
根据贝叶斯公式 : P(B|A)=P(A|B)P(B)/P(A)
我们可以知道: P(脑残|头痛)=P(头痛|脑残)P(脑残)/P(头痛), 注意: (头痛|脑残)是先验概率,那么利用贝叶斯公式我们就可以利用先验概率把后验概率算出来了。
P(头痛|脑残)=脑残的人中头痛的人数/脑残的人数,这样只需要我们去问脑残的人你头痛吗,明显很安全了。(你说脑残的人数怎么来的啊,那我们就假设我们手上有一份传说中的脑残名单吧。那份同学不要吵,我没说你在名单上啊。再说调查脑残人数的话咱就没必要抓着一个头痛的人问了。起码问一个心情好的人是否脑残比问一个头痛的人安全得多)
我承认上面的例子很牵强,不过主要是为了表达一个意思。后验概率在实际中一般是很难直接计算出来的,相反先验概率就容易多了。因此一般会利用先验概率来计算后验概率。
3.极大似然估计(MLE)和最大后验概率(MAP),贝叶斯推断和最大熵
“参数估计是…通过测量或经验数据来估计概率分布参数的数值”—Wikipedia如是说。
这时我们会发现各种各样的参数估计方法,例如极大似然估计、最大后验估计、贝叶斯推断、最大熵估计,等等。虽然方法各不相同,但实际上背后的道理大体一样。想要了解它们之间的联系与区别,只要举一个最简单的例子就可以了:观测到一堆从某个高斯分布产生的数值,请估该计高斯分布的参数之一—均值。下图就是我们的实验数据:从一个0均值一维高斯分布中产生的1000个点,横坐标是数据的序号(1:1000),纵坐标是样本点的值。
1. 极大似然估计(MLE)
怎样的参数是最好的?使得观测数据出现的概率(即所谓likelihood,似然)最大的参数就是最好的。这个朴素的思想,就是极大似然估计(Maximum Likelihood Estimation, MLE)。对一个独立同分布(i.d.d)的样本集来说,总体的似然就是每个样本似然的乘积。例如本例中的似然(Likelihood)显然是:
在实际中,因为连乘计算起来比较麻烦,并且概率都很小,难免越乘越接近0最终引发数值bug,因此多对其取log, 得到log似然( log likelihood):
log并不改变似然函数的凸性,因此可令其对u取极值(函数取极值的方法:导数为0的点,边界点。),显然得到:
这就完成了对高斯分布均值的极大似然估计。值得一提的是,该例的log似然实在是太简单,所以这个极值可以直接求导得到;在更多的情况下,我们需要通过梯度下降法等最优化算法来求解。而绝大部分最优化的工具包都默认求函数的最小值,因此别忘了把你的log似然乘以-1变成负log似然(Negative Log Likelihood),在你把它塞给一个最优化工具包之前。
2.最大后验估计(MAP)
MLE简单又客观,但是过分的客观有时会导致过拟合(Over fitting)。在样本点很少的情况下,MLE的效果并不好。为此,贝叶斯学派发明了最大后验估计(Maximum a Posterior)。先看一个最简单的概率图模型,借此来复习一下先验、似然、后验:
likelihood:对一个待估参数θ来说,它产生观测样本x的概率密度函数p(x|θ)叫做x的似然;
prior:θ本身是一个未观测到的变量,既然未观测到,也就是可以看成一个随机变量,假设其服从以α为参数的概率分布p(θ|α),叫做θ的先验;
posterior:在观测到x之后,我们对θ的认识得到了增强,将它的概率分布修正为p(θ|α,x),这个就叫做θ的后验;简单套用一下贝叶斯公式,可以得到后验分布:
即先验和似然的乘积。在本文的例子中,假设我们预先知道随机变量u本身服从一个高斯分布,其均值为u0,方差为σ0,那么观测到数据样本之后,u的后验分布为:
(公式这里u和后面的miu是同一个未知变量哦,MAP就是假设这个参数也是随机变量,并且符合正态分布,同时知道这个正态分布模型的均值和方差参数,这就是所谓的先验概率啦(即全部已知,回想全概率公式中的所有信息全部已知)。 所以这个先验概率直接影响结果,先验概率准确,那么模型比MLE好,不准确,结果就比MLE差啊。)
相当于给MLE的基础上进一步增加了信息,即先验知识(先验概率),增加了这个限制之后,同样适用MLE进行参数的求解,由于限制的准确,那么参数的求解也变得准确。
接下来就和MLE完全一样了:求一个u使得后验概率最大即可。方便起见,把u0固定成0,变化σ0做几组对比实验:
横轴是参数估计所用到的样本数,纵轴是估计值与真实值之间的误差。σ0取了0.01、0.1、1等三个值,作为方差,值越小先验的强度越大,就是指结果越准确。
可见:
1) MLE在数据较少时不准确
2) 先验强的MAP(图中红线、黄线)可以在少量数据时就达到较好的结果
3) 先验弱的MAP(图中蓝线)退化为MLE
还有一点在图中看不出来:假如我们预先知道的关于u的信息是不对的,即选择了一个强但偏离实际的先验(例如把u0设置成5, σ0设置成0.01)会怎样?其实那样的话结果甚至还不如MLE,这也是贝叶斯学派广为诟病的硬伤之一:凭什么去选择先验?大部分时候,我们选一个方便计算但不包含太多信息的共轭先验(什么是共轭先验?下回分解)。
3.贝叶斯推断(Bayesian Inference)
其实MAP不仅让频率学派的人不领情,甚至不能令苛刻的贝叶斯学派满意。
一来,MAP只取后验分布的峰值(众数,mode),而mode往往不具有很强的代表性(特别是在多峰的函数中);
二来,MAP有一个独特的缺点,对参数形式敏感。如果我们要估计方差,就会发现,将方差作为参数得到的解,并不是将标准差作为参数得到的解的平方。而MLE可不会这样。
那么与其将后验分布的峰值拿来凑合,还不如将整个后验分布求出来,用一个分布来描述待估的参数。这就是Inference。
可是我们刚才在MAP中不是已经求出了整个后验分布么?是的,这是因为例子太简单了。在绝大部分超过三个节点的概率图模型中,都无法求出精确的后验分布,我们需要借助于各种各样的近似手段,于是才有了拉普拉斯近似、变分推断、Gibbs采样…等等等等,内容庞杂,下回再表。 为了近似得到后验分布。
4.最大熵估计
前例中的估计无不建立在这样一个基础上:已知分布的形式,求分布的参数。但是如果并不知道分布的形式,还能估计么?答案是不仅可以,并且靠谱。这就是鼎鼎有名的最大熵法。关于怎么样从最大的熵原理推导出最大熵估计,已经有足够多的介绍,在这里就不说了。
我们要说的是,其实最大熵估计也是一种MLE。
首先,我们不知道样本的分布形式,但是它作为一个概率分布,一定会满足
1)处处非负
2)和为1
于是,可以随意构造一个这样的函数:
其中
指数保证了非负,Z保证了归一化,因此f(x)可以构造成任意一个关于x的函数--茫茫大海中,总会有一个f(x)使得p(x)接近样本的真实分布。
现在我们来对这个分布做MLE,其log似然是:
这个log似然对λ来说是凸的,因此使用简单的优化算法(比如梯度下降),就可以求得一个最优的λ,把λ代入p(x)的通项公式中,就可以得到分布的具体形式。特别的,当我们取f(x)=(x,x2)时,所得结果就是一个高斯分布。从另一方面来说,估计的结果严重依赖于选择怎样的f(x),这一点和MAP有些类似。
-这个结果和最大熵估计完全等价。也就是说,最大熵估计等同于对以下形式的模型的MLE:
而这种形式的模型,被统一称作“对数线性模型”(log linear model)。它是logistic回归、最大熵模型、以及以条件随机场(CRF)为代表的各种概率无向图的的基础。
最大似然估计:
最大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。简单而言,假设我们要统计全国人口的身高,首先假设这个身高服从服从正态分布,但是该分布的均值与方差未知。我们没有人力与物力去统计全国每个人的身高,但是可以通过采样,获取部分人的身高,然后通过最大似然估计来获取上述假设中的正态分布的均值与方差。
最大似然估计中采样需满足一个很重要的假设,就是所有的采样都是独立同分布的。下面我们具体描述一下最大似然估计:
首先,假设为独立同分布的采样,θ为模型参数,f为我们所使用的模型,遵循我们上述的独立同分布假设。参数为θ的模型f产生上述采样可表示为
回到上面的“模型已定,参数未知”的说法,此时,我们已知的为,未知为θ,故似然定义为:
在实际应用中常用的是两边取对数,得到公式如下:
其中称为对数似然,而称为平均对数似然。而我们平时所称的最大似然为最大的对数平均似然,即:
举个别人博客中的例子,假如有一个罐子,里面有黑白两种颜色的球,数目多少不知,两种颜色的比例也不知。我 们想知道罐中白球和黑球的比例,但我们不能把罐中的球全部拿出来数。现在我们可以每次任意从已经摇匀的罐中拿一个球出来,记录球的颜色,然后把拿出来的球 再放回罐中。这个过程可以重复,我们可以用记录的球的颜色来估计罐中黑白球的比例。假如在前面的一百次重复记录中,有七十次是白球,请问罐中白球所占的比例最有可能是多少?很多人马上就有答案了:70%。而其后的理论支撑是什么呢?
我们假设罐中白球的比例是p,那么黑球的比例就是1-p。因为每抽一个球出来,在记录颜色之后,我们把抽出的球放回了罐中并摇匀,所以每次抽出来的球的颜 色服从同一独立分布。这里我们把一次抽出来球的颜色称为一次抽样。题目中在一百次抽样中,七十次是白球的概率是P(Data | M),这里Data是所有的数据,M是所给出的模型,表示每次抽出来的球是白色的概率为p。如果第一抽样的结果记为x1,第二抽样的结果记为x2... 那么Data = (x1,x2,…,x100)。这样,
P(Data | M)
= P(x1,x2,…,x100|M)
= P(x1|M)P(x2|M)…P(x100|M)
= p^70(1-p)^30.
那么p在取什么值的时候,P(Data |M)的值最大呢?将p^70(1-p)^30对p求导,并其等于零。
70p^69(1-p)^30-p^70*30(1-p)^29=0。
解方程可以得到p=0.7。
在边界点p=0,1,P(Data|M)=0。所以当p=0.7时,P(Data|M)的值最大。这和我们常识中按抽样中的比例来计算的结果是一样的。
假如我们有一组连续变量的采样值(x1,x2,…,xn),我们知道这组数据服从正态分布,标准差已知。请问这个正态分布的期望值为多少时,产生这个已有数据的概率最大?
P(Data | M) = ?
根据公式
可得:
对μ求导可得 ,则最大似然估计的结果为μ=(x1+x2+…+xn)/n
由上可知最大似然估计的一般求解过程:
(1) 写出似然函数;
(2) 对似然函数取对数,并整理;
(3) 求导数 ;
(4) 解似然方程
注意:最大似然估计只考虑某个模型能产生某个给定观察序列的概率。而未考虑该模型本身的概率。这点与贝叶斯估计区别。贝叶斯估计方法将在以后的博文中描述
本文参考
http://en.wikipedia.org/wiki/Maximum_likelihood
http://www.shamoxia.com/html/y2010/1520.html
最大后验概率:
最大后验估计是根据经验数据获得对难以观察的量的点估计。与最大似然估计类似,但是最大的不同时,最大后验估计的融入了要估计量的先验分布在其中。故最大后验估计可以看做规则化的最大似然估计。
首先,我们回顾上篇文章中的最大似然估计,假设x为独立同分布的采样,θ为模型参数,f为我们所使用的模型。那么最大似然估计可以表示为:
现在,假设θ的先验分布为g。通过贝叶斯理论,对于θ的后验分布如下式所示:
最后验分布的目标为:
注:最大后验估计可以看做贝叶斯估计的一种特定形式。
举例来说:
假设有五个袋子,各袋中都有无限量的饼干(樱桃口味或柠檬口味),已知五个袋子中两种口味的比例分别是
樱桃 100%
樱桃 75% + 柠檬 25%
樱桃 50% + 柠檬 50%
樱桃 25% + 柠檬 75%
柠檬 100%
如果只有如上所述条件,那问从同一个袋子中连续拿到2个柠檬饼干,那么这个袋子最有可能是上述五个的哪一个?
我们首先采用最大似然估计来解这个问题,写出似然函数。假设从袋子中能拿出柠檬饼干的概率为p(我们通过这个概率p来确定是从哪个袋子中拿出来的),则似然函数可以写作
由于p的取值是一个离散值,即上面描述中的0,25%,50%,75%,1。我们只需要评估一下这五个值哪个值使得似然函数最大即可,得到为袋子5。这里便是最大似然估计的结果。
上述最大似然估计有一个问题,就是没有考虑到模型本身的概率分布,下面我们扩展这个饼干的问题。
假设拿到袋子1或5的机率都是0.1,拿到2或4的机率都是0.2,拿到3的机率是0.4,那同样上述问题的答案呢?这个时候就变MAP了。我们根据公式
写出我们的MAP函数。
根据题意的描述可知,p的取值分别为0,25%,50%,75%,1,g的取值分别为0.1,0.2,0.4,0.2,0.1.分别计算出MAP函数的结果为:0,0.0125,0.125,0.28125,0.1.由上可知,通过MAP估计可得结果是从第四个袋子中取得的最高。
上述都是离散的变量,那么连续的变量呢?假设为独立同分布的,μ有一个先验的概率分布为。那么我们想根据来找到μ的最大后验概率。根据前面的描述,写出MAP函数为:
此时我们在两边取对数可知。所求上式的最大值可以等同于求
的最小值。求导可得所求的μ为
以上便是对于连续变量的MAP求解的过程。
在MAP中我们应注意的是:
MAP与MLE最大区别是MAP中加入了模型参数本身的概率分布,或者说。MLE中认为模型参数本身的概率的是均匀的,即该概率为一个固定值。
高斯混合模型(GMM)的更多相关文章
-
贝叶斯来理解高斯混合模型GMM
最近学习基础算法<统计学习方法>,看到利用EM算法估计高斯混合模型(GMM)的时候,发现利用贝叶斯的来理解高斯混合模型的应用其实非常合适. 首先,假设对于贝叶斯比较熟悉,对高斯分布也熟悉. ...
-
6. EM算法-高斯混合模型GMM+Lasso详细代码实现
1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...
-
5. EM算法-高斯混合模型GMM+Lasso
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...
-
4. EM算法-高斯混合模型GMM详细代码实现
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 EM ...
-
3. EM算法-高斯混合模型GMM
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 GM ...
-
EM算法和高斯混合模型GMM介绍
EM算法 EM算法主要用于求概率密度函数参数的最大似然估计,将问题$\arg \max _{\theta_{1}} \sum_{i=1}^{n} \ln p\left(x_{i} | \theta_{ ...
-
高斯混合模型GMM与EM算法的Python实现
GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...
-
Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
-
高斯混合模型 GMM
本文将涉及到用 EM 算法来求解 GMM 模型,文中会涉及几个统计学的概念,这里先罗列出来: 方差:用来描述数据的离散或波动程度. \[var(X) = \frac{\sum_{i=1}^N( X_ ...
-
高斯混合模型(GMM) - 混合高斯回归(GMR)
http://www.zhihuishi.com/source/2073.html 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲 ...
随机推荐
-
【转】Controllers and Routers in ASP.NET MVC 3
Controllers and Routers in ASP.NET MVC 3 ambilykk, 3 May 2011 CPOL 4.79 (23 votes) Rate: vote 1vote ...
-
python——SQL基本使用
终于学到数据库操作了,这意味着什么?以后再也不用从文件里读写数据了,过程实在太复杂了~~~为了纪念这个激动人心的时刻,一定要写一篇博客! 使用mysql数据库——增 插入一条数据 首先,还是先解释一下 ...
-
javascript 闭包最简单理解
首先说3点与闭包有关系的东西. 一.变量的作用域 变量的作用域不难理解. 1.函数内部可以访问函数外部的变量,而函数外部不能访问函数内部的变量. 2.如果在函数内定义变量的时候,不加var,那么是全局 ...
-
xampp的Apache无法启动解决方法
XAMPP Apache 无法启动原因1(缺少VC运行库): 这个就是我遇到的问题原因,下载安装的XAMPP版本是xampp-win32-1.7.7-VC9,而现有的Windows XP系统又没有安装 ...
-
jquery------导入jquery.2.2.3.min.js
问题: 导入jquery.2.2.3.min.js后MyEclipse会提示代码有错误 方法: 选中jquery.2.2.3.min.js->右键->选择“MyEclipse”中的“Exc ...
-
LinkedList源代码深入剖析
第1部分 LinkedList介绍LinkedList简介 public class LinkedList<E> extends AbstractSequentialList<E&g ...
-
Java并发编程实践(读书笔记) 任务执行(未完)
任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元. 任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...
-
calico 原理分析
1.calico没有使用CNI的网桥模式,calico的CNI插件还需要在host机器上为每个容器的veth pair配置一条路由规则.cni插件是calico与kubernetes对接部分. 2.B ...
-
HDU-5373-水题-卡常数时间
姿势就是力量啊! 第一次意识到long long 比 int要慢很多.当时想到了各种优化仍然TLE,最后也没A出来,就是用了long long #include <cstdio> #inc ...
-
RPC框架-通俗易懂的解释
早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来.假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能.这不是整人么?于是就出现了IPC( ...