一,介绍

学习混合高斯,先要了解几个概念:

1,协方差:

协方差是对两个随机变量联合分布线性相关程度的一种度量。两个随机变量越线性相关,协方差越大,完全线性无关,协方差为零。

根据数学期望的性质:

推导协方差为:

2,协方差矩阵:

对多维随机变量X=[X1,X2,X3,...,Xn],我们往往需要计算各维度两两之间的协方差,这样各协方差组成了一个n×n的矩阵,称为协方差矩阵:

百度百科给出的实例:

3,服从高斯分布的概率密度函数:

可以看出高斯分布由均值向量μ和协方差矩阵∑这两个参数确定,故将概率密度函数记为:p(x|μ,∑) 
可定义高斯混合分布为:

给定一组数据,假设该数据由多个高斯分布产生,现在我们要估计这些高斯分布的参数,以及每个样本属于每个高斯分布的概率,那么根据样本推测出元GMM的概率分布就可以了。具体求解借助EM算法可得。

二,公式推导

假设有K个样本,服从C个高斯分布,随机抽取一个样本X得到:

(1)

其中,为协方差矩阵,是聚类的中心(向量均值)

根据上式,可以写出关于样本值(第i个样本)的概率密度函数:

(2)

再根据贝叶斯定理:

该分布由c个混合成分组成,每个混合对应一个高斯分布,P(Cj)为对应的“混合系数”,且=1。

我们定义m个观测样本的对数似然函数:

为了得到最大对数似然函数,需要对分别对求偏导并令其为0:

(1)求:

将公式(2)代入,并且除去第K个分量其余可以看做常数,得到:

由于,只有第K个样本与有关,其他的都可以视为常数,上式变为:

再利用对数复合函数求导得到:

利用贝叶斯公式,整理获得:

(3)

接着,求解,

求偏导:

(4)

令偏导为0,公式(4)代入公式(3),又知不为0,可得:

(2)求

类似与求

利用矩阵求导的性质:

再继续求解得:

我们假设K的位置再行i和列j上,那么可知,∑除了在位置(i,j)上为1以外,其他的都为零,上式结果为:

代入上式,获得:

(3)求k个分量的比例的问题

在(1)和(2)中,我们已经获取了,我们要求K个分量最佳比例值,相当于优化:

我们利用拉格朗日定理求解:

综上所述得到:

将其代入第K个分量,获得:

我们总结下算法流程:

第一步,初始化模型参数;

第二步,计算高斯混合分布

第三步,计算Ck的后验分布:

第四步,计算新的均值向量、协方差矩阵、混合系数

第五步,如果不满足条件,跳转到第二步继续计算。

第六步,满足条件,确定均值向量中心,获得分类模型

二,代码实现

数据:

0.697   0.46
0.774  0.376
0.634  0.264
0.608  0.318
0.556  0.215
0.403  0.237
0.481  0.149
0.437  0.211
0.666  0.091
0.243  0.267
0.245  0.057
0.343  0.099
0.639  0.161
0.657  0.198
0.36   0.37
0.593  0.042
0.719  0.103
0.359  0.188
0.339  0.241
0.282  0.257
0.748  0.232
0.714  0.346
0.483  0.312
0.478  0.437
0.525  0.369
0.751  0.489
0.532  0.472
0.473  0.376
0.725  0.445
0.446  0.459
import numpy as np
import matplotlib.pyplot as plt# 预处理数据
def loadDataSet(filename):dataSet = []fr = open(filename)for line in fr.readlines():curLine = line.strip().split('\t')fltLine = list(map(float, curLine))dataSet.append(fltLine)return dataSet# 高斯分布的概率密度函数
def prob(x, mu, sigma):n = np.shape(x)[1]expOn = float(-0.5 * (x - mu) * (sigma.I) * ((x - mu).T))divBy = pow(2 * np.pi, n / 2) * pow(np.linalg.det(sigma), 0.5)  # np.linalg.det 计算矩阵的行列式return pow(np.e, expOn) / divBy# EM算法
def EM(dataMat, maxIter=50,c=3):m, n = np.shape(dataMat)# 第一步,初始化参数alpha = [1 / 3, 1 / 3, 1 / 3]   # 初始化参数 alpha1=alpha2=alpha3=1/3mu = [dataMat[5, :], dataMat[21, :], dataMat[26, :]] # 初始化聚类中心 mu1=x6,mu2=x22,mu3=x27sigma = [np.mat([[0.1, 0], [0, 0.1]]) for x in range(3)]    # 初始化协方差矩阵gamma = np.mat(np.zeros((m, c)))for i in range(maxIter):for j in range(m):sumAlphaMulP = 0for k in range(c):gamma[j, k] = alpha[k] * prob(dataMat[j, :], mu[k], sigma[k]) # 计算混合成分生成的后验概率sumAlphaMulP += gamma[j, k]    # 第二步,计算高斯混合分布for k in range(c):gamma[j, k] /= sumAlphaMulP   # 第三步,计算后验分布sumGamma = np.sum(gamma, axis=0)for k in range(c):mu[k] = np.mat(np.zeros((1, n)))sigma[k] = np.mat(np.zeros((n, n)))for j in range(m):mu[k] += gamma[j, k] * dataMat[j, :]mu[k] /= sumGamma[0, k] #  第四步,计算均值向量for j in range(m):sigma[k] += gamma[j, k] * (dataMat[j, :] - mu[k]).T *(dataMat[j, :] - mu[k])sigma[k] /= sumGamma[0, k]  #  第四步,计算协方差矩阵alpha[k] = sumGamma[0, k] / m   # 第四步,计算混合系数return gamma# init centroids with random samples
def initCentroids(dataMat, k):numSamples, dim = dataMat.shapecentroids = np.zeros((k, dim))for i in range(k):index = int(np.random.uniform(0, numSamples))centroids[i, :] = dataMat[index, :]return centroidsdef gaussianCluster(dataMat):m, n = np.shape(dataMat)centroids = initCentroids(dataMat, m)clusterAssign = np.mat(np.zeros((m, 2)))gamma = EM(dataMat)for i in range(m):clusterAssign[i, :] = np.argmax(gamma[i, :]), np.amax(gamma[i, :])for j in range(m):pointsInCluster = dataMat[np.nonzero(clusterAssign[:, 0].A == j)[0]]centroids[j, :] = np.mean(pointsInCluster, axis=0)  # 第五步,确定各均值中心,获得分类模型return centroids, clusterAssigndef showCluster(dataMat, k, centroids, clusterAssment):numSamples, dim = dataMat.shapeif dim != 2:print("Sorry! I can not draw because the dimension of your data is not 2!")return 1mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']if k > len(mark):print("Sorry! Your k is too large!")return 1for i in range(numSamples):markIndex = int(clusterAssment[i, 0])plt.plot(dataMat[i, 0], dataMat[i, 1], mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']for i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)plt.show()if __name__=="__main__":dataMat = np.mat(loadDataSet('watermelon4.0.txt'))centroids, clusterAssign = gaussianCluster(dataMat)print(clusterAssign)showCluster(dataMat, 3, centroids, clusterAssign)

机器学习-聚类(混合高斯算法)相关推荐

  1. OpenCV中的混合高斯算法原理

    申明:以下内容为笔者翻译自国际会议论文,鉴于本人水平有限,翻译难免有误,请大家多多包容. 原文为: An Improved Adaptive Background Mixture Model for  ...

  2. spark mlilib 聚类 混合高斯

    为什么80%的码农都做不了架构师?>>>    运行代码如下 package spark.clusteringimport org.apache.spark.mllib.cluste ...

  3. 机器学习-聚类(学习向量量化算法)

    一,介绍 算法主要步骤包括:初始化原型向量:迭代优化,更新原型向量. 流程如下: 具体来说,主要是:  1.对原型向量初始化,可以选择满足yj=tj,j∈{1,2,-,m}yj=tj,j∈{1,2,- ...

  4. 聚类和EM算法——K均值聚类

    20211116 数据分析 | 聚类分析--kmean kmeans最优k值的确定方法-手肘法和轮廓系数法 - 简书 python大战机器学习--聚类和EM算法 注:本文中涉及到的公式一律省略(公式不 ...

  5. 机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)

    之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ). 但是,在更 ...

  6. 混合高斯背景建模算法GMM

    高斯混合模型介绍 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了**期望最大(Expectatio ...

  7. 聚类2-高斯混合-EM算法

    转自http://blog.csdn.net/lvhao92/article/details/50802703 这篇主要想说的是高斯混合模型,我发现,纵观网上大体的博客,都是沿用了吴恩达老师的上课套路 ...

  8. 聚类(1)——混合高斯模型 Gaussian Mixture Model

    聚类系列: 聚类(序)----监督学习与无监督学习 聚类(1)----混合高斯模型 Gaussian Mixture Model 聚类(2)----层次聚类 Hierarchical Clusteri ...

  9. python gmm em算法 2维数据_AI大语音(六)——混合高斯模型(GMM)(深度解析)...

    1 GMM基础 高斯混合模型(GMM)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况. 灵魂的拷问:为什么GMM可以拟合出 ...

最新文章

  1. 新手一看就懂的线程池
  2. 题目1200:最大的两个数
  3. 不同浏览器前端调试查看返回页面的json数据
  4. MPU6050开发 -- 在 C52 单片机上测试
  5. 【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】
  6. 2019春季学期进度报告(十四)
  7. 信用评分系统运行原理上篇
  8. 图算法--深度优先/广度优先/最小生成树/最短路径
  9. ctfshow-萌新-web13( 利用代码执行漏洞获取网站敏感文件)
  10. linux 扩展挂载盘大小_Linux 挂载新添加磁盘LVM配置
  11. wps2013打开word是xml
  12. 用 Visual Studio 2019 编译 FFmpeg 简单教程
  13. JAVA之父----詹姆斯.高斯林
  14. server r2 系统更新文件清理
  15. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
  16. 基于java的婚恋交友动态网站
  17. 【php图片上传在网页显示】
  18. google新搜索网站
  19. DPDK and XDP and ebpf
  20. 科比投篮预测——可视化与探索性数据分析(二)

热门文章

  1. 一体化时代又要来临了。
  2. Python Appium 安装与设置 全网最全!
  3. 大厂技术博客汇总/美团/腾讯/网易/百度/头条
  4. 高质量c++/c编程指南pdf
  5. HASH和HMAC(8):HMAC算法原理
  6. 基于SM3的HMAC算法的实现
  7. 修改ubuntu docker timezone
  8. 感谢你曾来过(原版)
  9. WinRAR自解压安装并开机自启
  10. Linux Shell脚本编程--curl命令详解