資源簡介
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?<“文件打開錯誤“?< 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數組的前Num_Mix個數據作為初始聚類
void?GMM::Random_Init()
{
for?(int?i?=?0;?i? {
for?(int?j?=?0;?j? {
Mixtures[i].Mean[j]?=?Feature[i][j];
}
}
}
//根據當前的中心,重新聚類
void?GMM::Recluster()
{
int?closest_mix;?//?最近的聚類種類從0?-?Num_Mix
?//首先清除每一類的聚類
for?(int?i?=?0;?i? {
Mixtures[i].Sample_Index.clear();?//?清楚每一個之前的聚類
Mixtures[i].Total_Sample?=?0;?//?清除每一類的樣本個數為0
}
//?再重新聚類,這一步驟和k-means相似
for?(int?i?=?0;?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? {
d?=?Distance(feature?i);?//?第feature條數據和第i個聚類之間的距離
if?(d? {
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? {
//?第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? {
if?(Mixtures[i].Total_Sample? {
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? {
if?(Mixtures[i].Total_Sample?>?Mixtures[popular_id].Total_Sample)
{
popular_id?=?i;
}
}
//?如果popular類還是小于Min_samples,則返回錯誤
if?(Mixtures[popular_id].Total_Sample? exit(0);
//?為bad?cell創造一個新的中心
for?(int?k?=?0;?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個文件信息
評論
共有 條評論