资源简介
C++实现GMM分类模型的源码,高斯参数自己可以调整
代码片段和文件信息
#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个文件信息
相关资源
- 基于Visual C++/Access实现的学生宿舍管理
- Visual C++.NET图像处理编程源代码 陆宗
- c++ MFC 通讯录 源代码
- Linux多线程服务端编程:使用muduo C+
- 简易防火墙使用C++与Qt4.5带源代码
- 数据库课程设计 - 汽车租借信息系统
- VC++课程设计 计算器
-
C++调用Windows MediaPla
yer实现的多媒体 - c++坦克大战源码_写的不错
- 粒子群优化算法PSOC++
- C++语言程序设计(郑丽)含课本知识
- NTFS文件系统下用C++定位文件簇号和目
- 基于C++的SNMP++开发包
- c++程序设计语言英文第三版.pdf
- Parasoft C++ test 9.2官方用户手册_中文版
- Spline曲线(穿过控制点CC++版本)
- 非常帅的军棋源代码附说明文档 VC
- C++调用C#库例程
- C++统计英文词频
- C++花店销售管理系统源码及文档
- OpenSSL RSA 非对称加密(VS2013,C++实现
- C++ 五子棋游戏 图形界面
- soble 算子的 边缘检测 VisualC++
- Effective C++ 中文mobi格式
- VC6.0_MFC画图demo小程序源码
- 浙工大研究生考试c++历年真题(2008
- C++Builder开发的数据采集系统上层应用
- 使用C++实现HDLC协议
- accelerated C++英文版
- 上期CTP_API_C++可实盘的源代码(更新)
评论
共有 条评论