資源簡介
Em算法實現(xiàn)聚類(VC++實現(xiàn)),包含main函數(shù)和Em類的控制臺程序,帶有詳細注釋。解決高斯混合模型聚類問題。

代碼片段和文件信息
#include?“em.h“
#include?“memory.h“
#include?“stdlib.h“
#include?“stdio.h“
#include?“math.h“
#include?“time.h“
namespace?ker
{
????#define?PI?3.1415926
????
????//一個很小的數(shù),用來解決協(xié)方差矩陣行列式為0以及高斯密度分布函數(shù)為0的問題
????#define?CONST_E?0.000000000001
????
????cEm::cEm(int?nVec?int?nDim?int?nPat)
????{
????????_nVec?=?nVec;
????????_nDim?=?nDim;
????????_nPat?=?nPat;
????????//_pplfZ[i][j]表示第i個向量屬于第j類的概率初始化為0
????????_pplfZ?=?new?double?*[_nVec];
????????for?(int?i?=?0;?i?????????{
????????????_pplfZ[i]?=?new?double[_nPat];
????????????memset(_pplfZ[i]?0?sizeof(double)?*?_nPat);
????????}
????????
????????//_pplfU[i]表示第i類的均值向量,其初始化的值有可能導致陷入局部極值
????????//因此其初始化的值根據(jù)待分類數(shù)據(jù)來給出
????????_pplfU?=?new?double?*[_nPat];
????????for?(i?=?0;?i?????????{
????????????_pplfU[i]?=?new?double[_nDim];
????????????//for?(int?j?=?0;?j?????????}
????????
????????//_ppplfDelta[i]表示第i類的協(xié)方差矩陣并把協(xié)方差矩陣初始化成單位陣
????????_ppplfDelta?=?new?double?**[_nPat];
????????for?(i?=?0;?i?????????{
????????????_ppplfDelta[i]?=?new?double?*[_nDim];
????????????for?(int?j?=?0;?j?????????????{
????????????????_ppplfDelta[i][j]?=?new?double[_nDim];
????????????????memset(_ppplfDelta[i][j]?0?sizeof(double)?*?_nDim);
????????????????_ppplfDelta[i][j][j]?=?1;
????????????}
????????}
????????
????????//_plfPi[i]表示第i類的先驗概率初始化為1?/?_nPat
????????_plfPi?=?new?double?[_nPat];
????????for?(i?=?0;?i?????}
????cEm::~cEm()
????{
????????for?(int?i?=?0;?i?????????delete?[]_pplfZ;
????????for?(i?=?0;?i?????????delete?[]_pplfU;
????????
????????for?(i?=?0;?i?????????{
????????????for?(int?j?=?0;?j?????????????delete?[]_ppplfDelta[i];
????????}
????????delete?[]_ppplfDelta;
????????delete?[]_plfPi;
????}
????double?**cEm::Inverse(double?**pplfMatSrc)
????{
????????//復制原矩陣
????????double?**pplfMat?=?new?double?*[_nDim];
????????for?(int?i?=?0;?i?????????{
????????????pplfMat[i]?=?new?double?[_nDim];
????????????memcpy(pplfMat[i]?pplfMatSrc[i]?sizeof(double)?*?_nDim);
????????}
????????
????????//創(chuàng)建一個單位陣
????????double?**pplfI?=?new?double?*[_nDim];
????????for?(i?=?0;?i?????????{
????????????pplfI[i]?=?new?double?[_nDim];
????????????memset(pplfI[i]?0?sizeof(double)?*?_nDim);
????????????pplfI[i][i]?=?1;
????????}
????????
????????//Gaussian消元法求逆矩陣--正向消元
????????for?(i?=?0;?i?????????{
????????????double?lfTmp?=?pplfMat[i][i];
????????????for?(int?j?=?0;?j?????????????{
????????????????pplfMat[i][j]?/=?lfTmp;
????????????????pplfI[i][j]?/=?lfTmp;
????????????}
????????????
????????????for?(j?=?i?+?1;?j?????????????{
????????????????double?lfTmp?=?-pplfMat[j][i];
????????????????for?(int?k?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????35??2009-02-14?21:12??Em\data1.txt
?????文件????????110??2009-02-11?02:36??Em\data2.txt
?????文件?????258116??2009-02-13?23:04??Em\Debug\Em.exe
?????文件?????266204??2009-02-13?23:04??Em\Debug\Em.ilk
?????文件??????17727??2009-02-13?23:04??Em\Debug\em.obj
?????文件?????210440??2009-02-13?23:04??Em\Debug\Em.pch
?????文件?????467968??2009-02-13?23:04??Em\Debug\Em.pdb
?????文件???????7792??2009-02-13?23:04??Em\Debug\main.obj
?????文件??????41984??2009-02-15?16:25??Em\Debug\vc60.idb
?????文件??????53248??2009-02-13?23:04??Em\Debug\vc60.pdb
?????文件??????12161??2009-02-13?23:04??Em\em.cpp
?????文件???????4348??2009-02-13?23:02??Em\Em.dsp
?????文件????????510??2009-02-13?23:01??Em\Em.dsw
?????文件???????2410??2009-02-10?18:41??Em\em.h
?????文件??????58368??2009-02-15?16:41??Em\Em.ncb
?????文件??????53760??2009-02-15?16:41??Em\Em.opt
?????文件???????1314??2009-02-13?23:04??Em\Em.plg
?????文件???????1720??2009-02-13?23:04??Em\main.cpp
?????目錄??????????0??2009-02-15?15:22??Em\Debug
?????目錄??????????0??2009-02-15?16:41??Em
-----------?---------??----------?-----??----
??????????????1458215????????????????????20
評論
共有 條評論