资源简介
高斯混合模型的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\li
文件 2974 2018-08-16 15:58 gmm\gmm\Debug\gmm.tlog\li
文件 430 2018-08-16 15:58 gmm\gmm\Debug\gmm.tlog\li
文件 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个文件信息
评论
共有 条评论