每天进步一点点《ML - 高斯混合模型》

上一篇文章学习了极大似然估计和EM算法,这一章节就是学习EM算法的具体应用场景,高斯混合模型,是一中聚类的算法。

一:高斯混合模型(GMM)

在这里插入图片描述

我们将一个分布复杂的数据分布,用多个高斯概率分布来共同表示,如上图,一维数据下,红色的线条,用了三个高斯分布来表示了。红色线条可以看成是数据分布的密度分布,三个波峰,数据分布的密度相对较大。

再举个例子,我们那堆西瓜,如果我们不考虑类别,就可以直接全部看成是一个类别的,用分布密度曲线统计出,在体积区间范围内的西瓜个数密度,得到了一个概率密度曲线Y,但是实际上,我们西瓜是来自是那三个地方的,也就是三个类别的,因此概率密度曲线其实是三个概率分布共同组成的,如果每个类别的西瓜都是服从于高斯分布,那么概率密度曲线Y就是有三个高斯分布组成而成,这个就叫做高斯混合模型。

用到的算法也就是上述学习到的EM算法,通过给定类别个数,还有预设值的高斯模型,进行反复迭代更新求值,最终得到最优化的各个类别的模型参数。

所以高斯混合模型也是一个聚类的算法,通过自动学习出各个高斯模型的分布来对数据进行聚类。

二:实例运行

代码实例使用的是sklearn官网的例子,主要是看看该库函数额使用。

import itertools

import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn import mixture

color_iter = itertools.cycle(['navy', 'c', 'cornflowerblue', 'gold',
                              'darkorange'])


def plot_results(X, Y_, means, covariances, index, title):
    splot = plt.subplot(2, 1, 1 + index)
    for i, (mean, covar, color) in enumerate(zip(
            means, covariances, color_iter)):
        v, w = linalg.eigh(covar)
        v = 2. * np.sqrt(2.) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        # as the DP will not use every component it has access to
        # unless it needs it, we shouldn't plot the redundant
        # components.
        if not np.any(Y_ == i):
            continue
        plt.scatter(X[Y_ == i, 0], X[Y_ == i, 1], .8, color=color)

        # Plot an ellipse to show the Gaussian component
        angle = np.arctan(u[1] / u[0])
        angle = 180. * angle / np.pi  # convert to degrees
        ell = mpl.patches.Ellipse(mean, v[0], v[1], 180. + angle, color=color)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-9., 5.)
    plt.ylim(-3., 6.)
    plt.xticks(())
    plt.yticks(())
    plt.title(title)


# Number of samples per component
n_samples = 500

# Generate random sample, two components
np.random.seed(0)
C = np.array([[0., -0.1], [1.7, .4]])
X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
          .7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]

# Fit a Gaussian mixture with EM using five components
gmm = mixture.GaussianMixture(n_components=5, covariance_type='full').fit(X)
plot_results(X, gmm.predict(X), gmm.means_, gmm.covariances_, 0,
             'Gaussian Mixture')

# Fit a Dirichlet process Gaussian mixture using five components
dpgmm = mixture.BayesianGaussianMixture(n_components=5,
                                        covariance_type='full').fit(X)
plot_results(X, dpgmm.predict(X), dpgmm.means_, dpgmm.covariances_, 1,
             'Bayesian Gaussian Mixture with a Dirichlet process prior')

plt.show()

我们能看到一些随机样本点,能够按照高斯分布模型被分为不同的类别,不同的的类别是不同的颜色。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/109193325