期望最大化(EM)是一种用于分类数据的概率方法。如果它不是分类器,请纠正我。
这种EM技术的直观解释是什么?这里的期望
是什么,以及什么在被最大化
?
回答:
注意:此答案背后的代码可以在这里找到。
假设我们从两个不同的组别,红色和蓝色,抽取了一些数据样本:
在这里,我们可以看到哪个数据点属于红色或蓝色组。这使得找到每个组的特征参数变得容易。例如,红色组的平均值大约是3,蓝色组的平均值大约是7(如果我们想要的话,我们可以找到确切的平均值)。
一般来说,这被称为最大似然估计。给定一些数据,我们计算最能解释这些数据的参数(或参数)的值。
现在想象我们无法看到哪个值是从哪个组中抽取的。对我们来说,一切看起来都是紫色的:
在这里,我们知道有两个值组,但我们不知道任何特定值属于哪个组。
我们仍然可以估计最适合这些数据的红色组和蓝色组的平均值吗?
是的,通常我们可以!期望最大化为我们提供了一种方法。算法背后的非常一般的想法是这样的:
- 从对每个参数可能值的初始估计开始。
- 计算每个参数产生数据点的似然。
- 根据参数产生数据点的似然,计算每个数据点的权重,指示它是更红还是更蓝。将权重与数据结合(期望)。
- 使用权重调整后的数据计算参数的更好估计(最大化)。
- 重复步骤2到4,直到参数估计收敛(过程不再产生不同的估计)。
这些步骤需要进一步解释,所以我将通过上面描述的问题进行讲解。
示例:估计均值和标准差
在这个例子中我将使用Python,但如果您不熟悉这种语言,代码应该也相当容易理解。
假设我们有两个组,红色和蓝色,其值分布如上图所示。具体来说,每个组包含从具有以下参数的正态分布中抽取的值:
import numpy as npfrom scipy import statsnp.random.seed(110) # 为了结果可重现# 设置参数red_mean = 3red_std = 0.8blue_mean = 7blue_std = 2# 从具有红色/蓝色参数的正态分布中抽取20个样本red = np.random.normal(red_mean, red_std, size=20)blue = np.random.normal(blue_mean, blue_std, size=20)both_colours = np.sort(np.concatenate((red, blue))) # 稍后使用...
这是红色和蓝色组的图像(为了节省您向上滚动的麻烦):
当我们可以看到每个点的颜色(即它属于哪个组)时,估计每个组的均值和标准差就非常容易了。我们只需将红色和蓝色的值传递给NumPy中的内置函数。例如:
>>> np.mean(red)2.802>>> np.std(red)0.871>>> np.mean(blue)6.932>>> np.std(blue)2.195
但是如果我们看不到点的颜色呢?也就是说,每个点都被染成了紫色。
为了尝试恢复红色和蓝色组的均值和标准差参数,我们可以使用期望最大化。
我们的第一步(上面的步骤1)是猜测每个组的均值和标准差的参数值。我们不必聪明地猜测;我们可以选择任何我们喜欢的数字:
# 对均值的估计red_mean_guess = 1.1blue_mean_guess = 9# 对标准差的估计red_std_guess = 2blue_std_guess = 1.7
这些参数估计产生了这样的钟形曲线:
这些是糟糕的估计。例如,两个均值(垂直虚线)看起来离任何一种“中间”位置都很远。我们希望改进这些估计。
下一步(步骤2)是计算每个数据点在当前参数猜测下的似然性:
likelihood_of_red = stats.norm(red_mean_guess, red_std_guess).pdf(both_colours)likelihood_of_blue = stats.norm(blue_mean_guess, blue_std_guess).pdf(both_colours)
在这里,我们只是将每个数据点放入使用我们当前对红色和蓝色的均值和标准差的猜测的正态分布的概率密度函数中。这告诉我们,例如,根据我们当前的猜测,数据点1.761更可能是红色(0.189)而不是蓝色(0.00003)。
对于每个数据点,我们可以将这两个似然值转换为权重(步骤3),使它们总和为1,如下所示:
likelihood_total = likelihood_of_red + likelihood_of_bluered_weight = likelihood_of_red / likelihood_totalblue_weight = likelihood_of_blue / likelihood_total
使用我们当前的估计和新计算的权重,我们现在可以计算红色和蓝色组的均值和标准差的新估计(步骤4)。
我们两次计算均值和标准差,使用所有数据点,但使用不同的权重:一次使用红色权重,一次使用蓝色权重。
关键的直觉是,颜色在数据点上的权重越大,该数据点对该颜色参数的下一次估计的影响就越大。这有“拉动”参数朝正确方向的效果。