以上包括了高斯混合模型的原理,公式推导过程,完整的代码实现,以及高斯概率密度公式的例子解析。

02

二维高斯分布聚类数据生成

在此不再将完整的代码黏贴上,有需要的请参考上个推送或者在微信或QQ群中和我要Jupyter NoteBook的实现代码。


下面仍然借助sklearn的高斯分布的数据簇生成功能,注意参数n_features的含义是生成2维(2个特征)的数据集。


x,label = make_blobs(n_samples=500,n_features=2, centers=3,

                     cluster_std=[0.6,1.2,1.8],

                     random_state=1)  

sklearn生成的满足二维高斯分布的3簇数据如下所示:



kmeans多维聚类算法代码 多维数据聚类_协方差矩阵

这是生成3簇二维的高斯分布数据,下面借助自己实现的GMM聚类接口直接对以上模型进行聚类(详细代码请参考之前的推送,文章开头)。


03

二维数据的聚类分析

下面是调用自己写的GMM聚类接口的代码,最终聚类的结果为:3类,可以看出聚类结果较好。

#一维特征的GMM聚类模拟
px,aves,sigmas =GMM(x,3)
mylabel = classifior(px)
#可以看到不掉包的实现与sklearn的模拟结果是基本一致的
plt.scatter(x[:, 0],x[:,1],marker='o', c=mylabel)




kmeans多维聚类算法代码 多维数据聚类_协方差矩阵_02

因为GMM聚类会返回每个样本点属于每个簇的概率密度,因此500个样本点,会有一个500 by 3的概率密度结果矩阵,即代码中的 px,下面列出px的部分数据,选取最大值对应的簇即为样本的聚类归属。

array([[  2.82354561e-01,   9.62092908e-09,   1.55829697e-10],
7.71577880e-02,   8.29431337e-06],
1.06570065e-01,
       ..., 
9.55957280e-02,   2.51601671e-05],
8.36655897e-02,   1.17357149e-10,   4.61517416e-12],
1.18809399e-02]])
 
看下预测的3个簇的平均值:
array([[ 3.2710034 , -4.3257953 ],
       [-0.90882595,  2.05269608],
       [ 1.64356224,  8.96388503]])

重点看下每个簇的协方差,这个是多维高斯分布的一个重要区别于一维的高斯分布之处,它是一个D by D (D表示数据的维数(特征数))的方阵,而不再是一个标量,

#簇0的协方差矩阵
sigmas[:,:,0]
array([[ 0.27663524,  0.02760814],
       [ 0.02760814,  0.40283533]])
 
#簇1的协方差矩阵
sigmas[:,:,1]
array([[ 1.62581999, -0.16528428],
       [-0.16528428,  1.29252665]])
 
#簇2的协方差矩阵
sigmas[:,:,2]
array([[ 2.74381182,  0.02889155],
       [ 0.02889155,  4.21288365]])
 
注意:
1.多维高斯分布的协方差矩阵是对称矩阵
2.主对角线上的元素为方差
3. 非主对角线上的元素为两两特征间的相关系数

04

总结和展望

至此,高斯混合模型从原理,到公式推导,再到编写完整代码借助EM算法求解,都完整的走了一遍,可以看到GMM模型的聚类特点,能给出样本点属于每个簇的概率,取概率最大的簇为所属簇。


在最近几天的推送中,我们先后模拟了一维和两维的高斯分布的数据样本,实际上,我们已经实现的算法可以模拟更多维度的数据,因为假定了是D维,但是当维度很高时,我们往往不容易分析,计算效率慢,同时也容易发生奇异问题,尤其有几个维度具有强相关性时,那么应该怎么办呢?


因此,当我们面对一堆样本由100维组成的数据时,学会如何提取出主要的特征,是非常重要的。本节描述的协方差矩阵将会大展身手,常用的算法是PCA降维,这通常是数据预处理的常用降维手法,通过降维,一来方便画图展示,二来也是去掉次要矛盾解决主要矛盾的过程。


预知PCA降维的原理和操作过程,请看接下来的推送。