• 高斯混合模型的C++实现

    • 原理
    • 过程
    • 代码实现

高斯混合模型的C++实现

原理

GMM将数据的分布通过多个高斯模型进行拟合。GMM是一种聚类算法,每个component就是一个聚类中心。高斯混合模型可以得到每个数据属于每个模型的概率,是一种软聚类算法。这是来自《统计学习方法》中的定义:

过程

高斯混合模型使用EM算法估计模型参数。
1. 初始化模型的个数和每个高斯模型的参数,设定迭代结束条件(迭代次数,误差阈值)
2. 迭代:对于每一个数据,计算在每一个高斯模型中的概率
3. 根据计算得到的概率更新每个模型的参数(均值,方差)
4. 当超过迭代次数或者更新小于阈值时结束迭代。

代码实现

代码参考自网上大神,具体出处忘记了,加以修改和添加注释,如有侵权请联系~

头文件

#ifndef _GMM_H
#define _GMM_H
#include <vector>
#include <cmath>
using namespace std;
class GMM
{
public:void Init(const vector<double> &inputData, const int clustNum = 5, double eps = 0.01, double max_steps = 20);void train();int predicate(double x);//预测输入的数据属于哪一类void print();
protected:int clusterNum;             // 限制vector<double> means;vector<double> means_bkp;       // 上一次的迭代数据vector<double> sigmas;vector<double> sigmas_bkp;      // 上一次的迭代数据vector<double> probilities;vector<double> probilities_bkp;vector<vector<double>> memberships;     // 存储属于哪一个类别vector<vector<double>> memberships_bkp;vector<double> data;int dataNum;        // 数据数量double epslon;      // 相差的阈值double max_steps;   // 迭代次数
private:double gauss(const double x, const double m, const double sigma);
};
#endif

实现

#include "GMM.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <Windows.h>
using namespace std;void GMM::Init(const vector<double> &inputData, const int clustNum, double eps, double max_steps)
{/*获取输入数据*/this->data = inputData;this->dataNum = data.size();/*存储最终需要的结果*/this->clusterNum = clustNum;        // 聚类数量this->epslon = eps;                 // 阈值this->max_steps = max_steps;        // 最大的迭代次数/*保留每一个类别的均值,方差参数,保留上一个的参数*/this->means.resize(clusterNum);this->means_bkp.resize(clusterNum);this->sigmas.resize(clusterNum);this->sigmas_bkp.resize(clusterNum);/*保留每一个数据对于每一个类别下的概率,由在这个类别下的概率除以到各个类别的总概率得到*/this->memberships.resize(clusterNum);this->memberships_bkp.resize(clusterNum);for (int i = 0; i < clusterNum; i++){memberships[i].resize(data.size());memberships_bkp[i].resize(data.size());}/*每一个类别的可能性*/this->probilities.resize(clusterNum);this->probilities_bkp.resize(clusterNum);//initialize mixture probabilities 初始化每个类别的参数for (int i = 0; i < clusterNum; i++){probilities[i] = probilities_bkp[i] = 1.0 / (double)clusterNum;//init meansmeans[i] = means_bkp[i] = 255.0*i / (clusterNum);//init sigmasigmas[i] = sigmas_bkp[i] = 50;}
}void GMM::train()
{//compute membership probabilitiesint i, j, k, m;double sum = 0, sum2;int steps = 0;bool go_on;do          // 迭代{for (k = 0; k < clusterNum; k++){//compute membership probabilitiesfor (j = 0; j < data.size(); j++){//计算p(k|n),计算每一个数据在每一个类别的值的加权和sum = 0;for (m = 0; m < clusterNum; m++){sum += probilities[m] * gauss(data[j], means[m], sigmas[m]);}//求分子,第j个数据在第k类中的所占的比例memberships[k][j] = probilities[k] * gauss(data[j], means[k], sigmas[k]) / sum;}//求均值//求条件概率的和,将每个数据在第k类中的概率进行累加sum = 0;for (i = 0; i < dataNum; i++){sum += memberships[k][i];}//得到每个数据在属于第k类的加权值之和sum2 = 0;for (j = 0; j < dataNum; j++){sum2 += memberships[k][j] * data[j];}//得到新的均值 由概率加权和除以总概率作为均值means[k] = sum2 / sum;//求方差  由到均值的平方的加权和作为新的方差sum2 = 0;for (j = 0; j < dataNum; j++){sum2 += memberships[k][j] * (data[j] - means[k])*(data[j] - means[k]);}sigmas[k] = sqrt(sum2 / sum);//求概率probilities[k] = sum / dataNum;}//end for k//check improvementgo_on = false;for (k = 0; k<clusterNum; k++){if (means[k] - means_bkp[k]>epslon){go_on = true;break;}}//back upthis->means_bkp = means;this->sigmas_bkp = sigmas;this->probilities_bkp = probilities;} while (go_on&&steps++ < max_steps); //end do while
}double GMM::gauss(const double x, const double m, const double sigma)
{return 1.0 / (sqrt(2 * 3.1415926)*sigma)*exp(-0.5*(x - m)*(x - m) / (sigma*sigma));
}// 预测
int GMM::predicate(double x)
{double max_p = -100;int i;double current_p;int bestIdx = 0;for (i = 0; i < clusterNum; i++){current_p = gauss(x, means[i], sigmas[i]);if (current_p > max_p){max_p = current_p;bestIdx = i;}}return bestIdx;
}void GMM::print()
{int i;for (i = 0; i < clusterNum; i++){cout << "Mean: " << means[i] << " Sigma: " << sigmas[i] << " Mixture Probability: " << probilities[i] << endl;}
}

github地址

如有错误,欢迎指出~

高斯混合模型的C++实现相关推荐

  1. 其他算法-高斯混合模型

    目录 高斯模型 单高斯模型 高斯混合模型GMM 参数估计 单高斯模型参数估计-极大似然 高斯混合模型参数估计-EM算法 GMM与k-means 高斯模型 单高斯模型 当样本数据 x∈Rx\in\mat ...

  2. 高斯混合模型聚类实战(Gaussian Mixtures)

    高斯混合模型聚类实战(Gaussian Mixtures) 目录 高斯混合模型聚类实战(Gaussian Mixtures) 高斯混合模型构建

  3. 高斯混合模型图像聚类、图像生成、可视化分析实战

    高斯混合模型图像聚类.图像生成.可视化分析实战 目录 高斯混合模型图像聚类.图像生成.可视化分析实战 PCA图像数据降维

  4. 高斯混合模型GMM、核心参数、高斯混合模型GMM的数学形式

    高斯混合模型GMM.核心参数.高斯混合模型GMM的数学形式 高斯混合模型GMM 混合模型是一个可以用来表示在总体分布(distribution)中含有 K 个子分布的概率模型,换句话说,混合模型表示了 ...

  5. 高斯混合模型(GaussianMixture Model, GMM)聚类、可视化最优协方差形式、通过TSNE进行结果可视化分析、抽取核心特征因子

    高斯混合模型模型: sklearn.mixture.GaussianMixture 混合高斯模型(Gaussian Mixture Model,简称GMM)是用高斯概率密度函数(正态分布曲线)精确地量 ...

  6. 高斯混合模型理解汇总

    https://blog.csdn.net/weixin_42555080/article/details/92222665 高斯混合模型终极理解 https://blog.csdn.net/lin_ ...

  7. 使用高斯混合模型对不同的股票市场状况进行聚类

    来源:DeepHub IMBA 本文约2300字,建议阅读5分钟 本文为你介绍如何将 GMM 应用于金融市场和经济. 介绍 通过过去的十年的发展,普通人越来越容易进入股票市场,每天进出市场的资金量创历 ...

  8. 独家 | 使用高斯混合模型,让聚类更好更精确(附数据代码学习资源)

    作者:AISHWARYA SINGH 翻译:张玲 校对:张一豪 本文约3500字,建议阅读10+分钟. 本文简单介绍聚类的基础知识,包括快速回顾K-means算法,然后深入研究高斯混合模型的概念,并用 ...

  9. 高斯混合模型的解释及Python实现

    https://www.toutiao.com/a6698235653743706632/ 在机器学习领域,我们可以区分为两个主要领域:监督学习和无监督学习.两者的主要区别在于数据的性质以及处理数据的 ...

  10. 机器学习基础专题:高斯混合模型和最大期望EM算法以及代码实现

    高斯混合模型 混合模型是潜变量模型的一种,是最常见的形式之一.而高斯混合模型(Gaussian Mixture Models, GMM)是混合模型中最常见的一种.zzz代表该数据点是由某一个高斯分布产 ...

最新文章

  1. mysql数据库64免安装_MYSQL数据库mysql 5.7.18 winx64 免安装 配置方法
  2. 卡特兰数Catalan Number
  3. python类的动态方法是什么_如何在python中为类动态创建类方法
  4. 计算机学校推荐专科,专科计算机专业学校推荐
  5. MySQL 19个规则数据库设计总结
  6. Docker实战(精简版本)
  7. YoLo 实践(1)
  8. 洛谷P1821 [USACO07FEB]银牛派对Silver Cow Party
  9. 机器视觉常用算法C语言实现
  10. 如何给linux添加新硬盘(转)
  11. NPOI使用ShiftRows向excel插入行,并复制原有样式
  12. 3D-2D三维重建:PnP
  13. UG二次开发-加工篇:获取刀具的直径,总长,刃长等
  14. u8系统服务器已停止怎么办,紧急通知!用友U8报错:enterpriseportal 已停止工作的解决办法!...
  15. 2021年G1工业锅炉司炉考试及G1工业锅炉司炉证考试
  16. UILabel 文字描边详解
  17. 济宁:携手华为打造孔孟之乡的科技味儿
  18. pygame按键事件
  19. 【python】无限量PPT免费下载?找模板在不怕心仪得不能用啦
  20. ei capitan mysql_关于macos:El Capitan升级后Mysql无法正常工作

热门文章

  1. 常用邮箱导航(邮箱导航-使用font-awesome实现导航小图标)
  2. 用python生成邮件正文html表格
  3. java小游戏一笔画下载安装_一笔画游戏(One touch Drawing)
  4. 数学建模学习(60):matlab回归分析及残差图绘制
  5. 安卓声卡驱动:4.codec驱动
  6. android recovery 乱码,Android Recovery 支持 Adb
  7. 全屏启动chrome浏览器
  8. 我的微软漫漫信仰路【多图】
  9. 学计算机的千万不要去高中当老师.
  10. 选择大于努力,阿里工程师有话说~