資源簡介
高斯混合模型的C++代碼,包含詳細(xì)注釋,可直接運(yùn)行。mian函數(shù)中的"data.txt"是數(shù)據(jù),可設(shè)置數(shù)據(jù)的維度和數(shù)目

代碼片段和文件信息
#define?_CRT_SECURE_NO_DEPRECATE
#include?
#include?
#include?
#include?“gmm.h“
using?namespace?std;
void?GMM::Read_Feature(char?*filename)?//?這個(gè)函數(shù)從文件中讀取特征數(shù)據(jù),并且存到一個(gè)特征數(shù)組Feature[NumData][DIM]里面
{
FILE?*file;
file?=?fopen(filename?“r“);
if?(file?==?NULL)
{
cerr?<“文件打開錯(cuò)誤“?< exit(0);
}
for?(int?i?=?0;?i? {
for?(int?j?=?0;?j? {
fscanf(file?“%f“?&Feature[i][j]);
Feature[i][j]?=?Feature[i][j]?*?factor;
}
}
fclose(file);
}
//利用Feature數(shù)組的前Num_Mix個(gè)數(shù)據(jù)作為初始聚類
void?GMM::Random_Init()
{
for?(int?i?=?0;?i? {
for?(int?j?=?0;?j? {
Mixtures[i].Mean[j]?=?Feature[i][j];
}
}
}
//根據(jù)當(dāng)前的中心,重新聚類
void?GMM::Recluster()
{
int?closest_mix;?//?最近的聚類種類從0?-?Num_Mix
?//首先清除每一類的聚類
for?(int?i?=?0;?i? {
Mixtures[i].Sample_Index.clear();?//?清楚每一個(gè)之前的聚類
Mixtures[i].Total_Sample?=?0;?//?清除每一類的樣本個(gè)數(shù)為0
}
//?再重新聚類,這一步驟和k-means相似
for?(int?i?=?0;?i? {
closest_mix?=?find_closest_mixture(i);?//?找到第i條數(shù)據(jù)屬于哪一個(gè)類
Mixtures[closest_mix].Sample_Index.push_back(i);
Mixtures[closest_mix].Total_Sample++;?//?這一closest_mix類的元素?cái)?shù)量+1
}
}
//?找一個(gè)特征向量feature屬于哪一個(gè)最近的類
int?GMM::find_closest_mixture(int?feature)
{
int?mix_id;?//?feature屬于這個(gè)類mix_id
float?d;
float?minimum_distance?=?Infinity;
for?(int?i?=?0;?i? {
d?=?Distance(feature?i);?//?第feature條數(shù)據(jù)和第i個(gè)聚類之間的距離
if?(d? {
minimum_distance?=?d;
mix_id?=?i;
}
}
return?mix_id;
}
//計(jì)算歐式距離
float?GMM::Distance(int?pattern?int?mix)?//?這里的mix指的是聚類的哪一組,就是0?-?Num_Mix中的一個(gè)
{
float?d?=?0;
for?(int?i?=?0;?i? {
//?第pattern條數(shù)據(jù)的DIM維向量與第mix個(gè)聚類的DIM維向量的歐式距離
d?+=?(Feature[pattern][i]?-?Mixtures[mix].Mean[i])*(Feature[pattern][i]?-?Mixtures[mix].Mean[i]);
}
return?d;
}
//再重新聚類Recluster后,尋找聚類不好的點(diǎn)也就是找聚類后,一個(gè)類中的元素個(gè)數(shù)小于2的bad?cell
int?GMM::Check_Badcell()
{
for?(int?i?=?0;?i? {
if?(Mixtures[i].Total_Sample? {
return?i;
}
}
return?(-1);
}
//調(diào)整bad?cell的聚類中心
void?GMM::Adjust_Badmean(int?bad_id)?//bad_id就是聚類不好的哪一類,就是上面函數(shù)Check_Badcell返回的i
{
int?popular_id?=?0;?//?這個(gè)是聚類元素最多的那一類
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? {
if?(Mixtures[i].Total_Sample?>?Mixtures[popular_id].Total_Sample)
{
popular_id?=?i;
}
}
//?如果popular類還是小于Min_samples,則返回錯(cuò)誤
if?(Mixtures[popular_id].Total_Sample? exit(0);
//?為bad?cell創(chuàng)造一個(gè)新的中心
for?(int?k?=?0;?k? New_mean[k]?=?0;
//計(jì)算popular聚類的中心
for?(int?j?=?0;?j {
feat_id?=?Mixtures[popular_id].Sample_Index[j];?//?popular聚類的第j個(gè)元素索引
for?(int?k?=?0;?k New_mean[k]?=?New_mean[k]?+?1.0?/?(Mixtures[popular_id].Total_Sample)*Feature[feat_id]
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
????..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個(gè)文件信息
評(píng)論
共有 條評(píng)論