• 大小: 2.18MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-10-30
  • 语言: C/C++
  • 标签: GMM  

资源简介

高斯混合模型的C++代码,包含详细注释,可直接运行。mian函数中的"data.txt"是数据,可设置数据的维度和数目

资源截图

代码片段和文件信息

#define _CRT_SECURE_NO_DEPRECATE
#include 
#include 
#include 
#include “gmm.h“

using namespace std;

void GMM::Read_Feature(char *filename) // 这个函数从文件中读取特征数据,并且存到一个特征数组Feature[NumData][DIM]里面
{
FILE *file;
file = fopen(filename “r“);
if (file == NULL)
{
cerr << “文件打开错误“ << endl;
exit(0);
}
for (int i = 0; i < NumData; ++i)
{
for (int j = 0; j < DIM; ++j)
{
fscanf(file “%f“ &Feature[i][j]);
Feature[i][j] = Feature[i][j] * factor;
}
}
fclose(file);
}

//利用Feature数组的前Num_Mix个数据作为初始聚类
void GMM::Random_Init()
{
for (int i = 0; i < Num_Mix; ++i)
{
for (int j = 0; j < DIM; ++j)
{
Mixtures[i].Mean[j] = Feature[i][j];
}
}
}

//根据当前的中心,重新聚类
void GMM::Recluster()
{
int closest_mix; // 最近的聚类种类从0 - Num_Mix
 //首先清除每一类的聚类
for (int i = 0; i < Num_Mix; ++i)
{
Mixtures[i].Sample_Index.clear(); // 清楚每一个之前的聚类
Mixtures[i].Total_Sample = 0; // 清除每一类的样本个数为0
}
// 再重新聚类,这一步骤和k-means相似
for (int i = 0; i < NumData; ++i)
{
closest_mix = find_closest_mixture(i); // 找到第i条数据属于哪一个类
Mixtures[closest_mix].Sample_Index.push_back(i);
Mixtures[closest_mix].Total_Sample++; // 这一closest_mix类的元素数量+1
}
}

// 找一个特征向量feature属于哪一个最近的类
int GMM::find_closest_mixture(int feature)
{
int mix_id; // feature属于这个类mix_id
float d;
float minimum_distance = Infinity;
for (int i = 0; i < Num_Mix; ++i)
{
d = Distance(feature i); // 第feature条数据和第i个聚类之间的距离
if (d < minimum_distance)
{
minimum_distance = d;
mix_id = i;
}
}
return mix_id;
}

//计算欧式距离
float GMM::Distance(int pattern int mix) // 这里的mix指的是聚类的哪一组,就是0 - Num_Mix中的一个
{
float d = 0;
for (int i = 0; i < DIM; ++i)
{
// 第pattern条数据的DIM维向量与第mix个聚类的DIM维向量的欧式距离
d += (Feature[pattern][i] - Mixtures[mix].Mean[i])*(Feature[pattern][i] - Mixtures[mix].Mean[i]);
}
return d;
}

//再重新聚类Recluster后,寻找聚类不好的点也就是找聚类后,一个类中的元素个数小于2的bad cell
int GMM::Check_Badcell()
{
for (int i = 0; i < Num_Mix; ++i)
{
if (Mixtures[i].Total_Sample < Min_samples)
{
return i;
}
}
return (-1);
}

//调整bad cell的聚类中心
void GMM::Adjust_Badmean(int bad_id) //bad_id就是聚类不好的哪一类,就是上面函数Check_Badcell返回的i
{
int popular_id = 0; // 这个是聚类元素最多的那一类
int feat_id;
float New_mean[DIM]; // Use a sample from the most popular cluster to replace the bad mean
 // 寻找聚类元素最多的那一类
for (int i = 1; i < Num_Mix; ++i)
{
if (Mixtures[i].Total_Sample > Mixtures[popular_id].Total_Sample)
{
popular_id = i;
}
}
// 如果popular类还是小于Min_samples,则返回错误
if (Mixtures[popular_id].Total_Sample < Min_samples)
exit(0);
// 为bad cell创造一个新的中心
for (int k = 0; k < DIM; ++k)
New_mean[k] = 0;
//计算popular聚类的中心
for (int j = 0; j {
feat_id = Mixtures[popular_id].Sample_Index[j]; // popular聚类的第j个元素索引
for (int k = 0; k New_mean[k] = New_mean[k] + 1.0 / (Mixtures[popular_id].Total_Sample)*Feature[feat_id]

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    ..A..H.     31744  2018-08-20 11:06  gmm\.vs\gmm\v14\.suo

     文件     115200  2018-08-16 15:58  gmm\Debug\gmm.exe

     文件     506916  2018-08-16 15:58  gmm\Debug\gmm.ilk

     文件     659456  2018-08-16 15:58  gmm\Debug\gmm.pdb

     文件     143846  2018-08-16 15:36  gmm\gmm\data.txt

     文件        688  2018-08-16 15:58  gmm\gmm\Debug\gmm.Build.CppClean.log

     文件       3929  2018-08-16 15:58  gmm\gmm\Debug\gmm.log

     文件     285569  2018-08-16 15:58  gmm\gmm\Debug\gmm.obj

     文件       1126  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\CL.command.1.tlog

     文件      21650  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\CL.read.1.tlog

     文件        880  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\CL.write.1.tlog

     文件        192  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\gmm.lastbuildstate

     文件       1226  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\link.command.1.tlog

     文件       2974  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\link.read.1.tlog

     文件        430  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog\link.write.1.tlog

     文件     105741  2018-08-16 15:58  gmm\gmm\Debug\main.obj

     文件     453632  2018-08-16 15:58  gmm\gmm\Debug\vc140.idb

     文件     405504  2018-08-16 15:58  gmm\gmm\Debug\vc140.pdb

     文件      11091  2018-08-16 21:10  gmm\gmm\gmm.cpp

     文件       2038  2018-08-16 15:47  gmm\gmm\gmm.h

     文件       5929  2018-08-16 15:42  gmm\gmm\gmm.vcxproj

     文件       1239  2018-08-15 21:02  gmm\gmm\gmm.vcxproj.filters

     文件        542  2018-08-16 16:36  gmm\gmm\main.cpp

     文件        463  2018-08-16 16:02  gmm\gmm\parameter.h

     文件       1291  2018-08-15 19:08  gmm\gmm.sln

     文件    8613888  2018-08-20 11:06  gmm\gmm.VC.db

     目录          0  2018-08-15 19:08  gmm\.vs\gmm\v14

     目录          0  2018-08-16 15:58  gmm\gmm\Debug\gmm.tlog

     目录          0  2018-08-15 19:08  gmm\.vs\gmm

     目录          0  2018-08-16 15:58  gmm\gmm\Debug

............此处省略7个文件信息

评论

共有 条评论