00001 #include "Analyzer.h"
00002 #include <log.h>
00003
00004 using namespace model;
00005
00009 Analyzer::Analyzer()
00010 {
00011 log::write("Analyzer Init");
00012 }
00013
00029 Analyzer::~Analyzer()
00030 {
00031 m_ExampleData = 0;
00032 m_mean = 0;
00033 m_AdjustedData = 0;
00034 m_Covariance = 0;
00035 m_EigenValues = 0;
00036 m_EigenVectors = 0;
00037 }
00038
00060 void Analyzer::mergeData(ReferenceModel refModel, vector<ExampleModel*> lmodels) {
00061 mergeData(refModel, lmodels,(int)lmodels.size());
00062 }
00063
00088 void Analyzer::mergeData(ReferenceModel refModel, vector<ExampleModel*> lmodels, int size)
00089 {
00090 log::write("Analyzer merge data");
00091 log::write("Number of models",size);
00092 m_refModel = refModel;
00093 for(int i=0;i<size;i++) {
00094 Matrix mv = lmodels[i]->getModelVertexs();
00095 if(i==0) {
00096 m_ExampleData = mv;
00097 } else {
00098 m_ExampleData = m_ExampleData | mv;
00099 }
00100 }
00101 N = m_ExampleData.Ncols();
00102 M = m_ExampleData.Nrows();
00103 log::write("N",N);
00104 log::write("M",M);
00105 log::write("Example Data",m_ExampleData);
00106 }
00107
00126 void Analyzer::setData(Matrix data)
00127 {
00128 m_ExampleData = data;
00129 }
00130
00131
00150 void Analyzer::mean()
00151 {
00152 log::write("Analyzer mean");
00153 m_mean = Matrix(M,1);
00154 for(int i=1;i <= M; i++)
00155 {
00156
00157
00158
00159 m_mean(i,1) = 1.0/N * m_ExampleData.Row(i).Sum();
00160 }
00161 log::write("Mean",m_mean);
00162 }
00163
00179 void Analyzer::adjust()
00180 {
00181 log::write("Analyzer adjust");
00182 Matrix h = Matrix(1,N);
00183 h = 1;
00184
00185
00186
00187
00188 m_AdjustedData = m_ExampleData - (m_mean * h);
00189 log::write("Adjusted Data",m_AdjustedData);
00190 }
00191
00207 void Analyzer::covariance()
00208 {
00209 log::write("Analyzer covariance");
00210 m_Covariance = m_AdjustedData/(N-1) * m_AdjustedData.t();
00211 log::write("Covariance",m_Covariance);
00212 }
00213
00229 void Analyzer::findComponents()
00230 {
00231 findComponents(JACOBI);
00232 }
00233
00252 void Analyzer::findComponents(e_PCAMode mode)
00253 {
00254 log::write("Analyzer find components");
00255 DiagonalMatrix dm(M);
00256 SymmetricMatrix test;
00257 test << m_Covariance;
00258
00259 switch (mode)
00260 {
00261 case JACOBI:
00262 log::write("Calculating with Jacobi");
00263 Jacobi(test, dm, m_EigenVectors);
00264 break;
00265 case HOUSEHOLDER:
00266 log::write("Calculating with Householder");
00267 EigenValues(test, dm, m_EigenVectors);
00268 break;
00269 case OTHER:
00270 log::write("Calculating with Jacobi (matched OTHER)");
00271 Jacobi(test, dm, m_EigenVectors);
00272 break;
00273 default:
00274 log::write("Calculating with Jacobi (matched default)");
00275 Jacobi(test, dm, m_EigenVectors);
00276 break;
00277 }
00278
00279
00280 m_EigenValues << dm;
00281
00282 log::write("Eigen Vectors",m_EigenVectors);
00283 log::write("Eigen Values",m_EigenValues);
00284 }
00285
00301 void Analyzer::computeEnergy()
00302 {
00303 log::write("Analyzer compute energy");
00304
00305
00306
00307 m_TotalEnergy = Matrix(M,1);
00308 m_EigenValues = m_EigenValues.Reverse();
00309 m_TotalEnergy(1,1) = m_EigenValues(1,1);
00310 for(int i=2;i<=M;i++)
00311 {
00312 m_TotalEnergy(i,1) = m_TotalEnergy(i-1,1) + m_EigenValues(i,i);
00313 }
00314 log::write("Total Energy",m_TotalEnergy);
00315 }
00316
00317
00333 void Analyzer::selectComponents()
00334 {
00335 log::write("Analyzer select Components");
00336 int index = 1;
00337 float percent = 0.0;
00338
00339 do
00340 {
00341 percent = ((m_TotalEnergy(1,m_TotalEnergy.Ncols()) - m_TotalEnergy(1,index)) * m_TotalEnergy(1,m_TotalEnergy.Ncols()))/100.0;
00342 log::write("Percent calc",percent);
00343 index++;
00344 }
00345 while(percent <= 90.0 && percent > 0.0);
00346
00347 m_Components = m_EigenVectors.Reverse().Columns(1,index-1).Reverse();
00348 log::write("Components",m_Components);
00349 }
00350
00351
00367 void Analyzer::transformation()
00368 {
00369 log::write("Analyzer Transformation Matrix");
00370
00371 m_Transformation = m_Components.t() * m_AdjustedData;
00372 log::write("Transformation",m_Transformation);
00373 }
00374
00393 ReferenceModel Analyzer::getModel() {
00394 Matrix h = Matrix(1,N);
00395 h = 1;
00396 m_refModel.updateVertices(m_Components*m_Transformation+(m_mean*h));
00397 return m_refModel;
00398 }
00399
00421 ReferenceModel Analyzer::getModel(Matrix input) {
00422 log::write("Analyzer::getModel\n");
00423 Matrix h = Matrix(1,N);
00424 h = 1;
00425 Matrix in = m_Components*input+(m_mean * h);
00426 log::write("Analyzer-in",in);
00427 m_refModel.updateVertices(in);
00428 log::write("Analyzer-refModel",m_refModel);
00429 return m_refModel;
00430 }
00431
00450 int Analyzer::getInputDimension() {
00451 return m_Components.Ncols();
00452 }
00453
00475 bool Analyzer::save(char* filename) {
00476 ofstream saveFile(filename);
00477 if(saveFile.is_open()) {
00478 saveFile << "Mean Dim\n";
00479 saveFile << m_mean.Nrows() << "," << m_mean.Ncols() << "\n";
00480 saveFile << m_mean << "\n";
00481 saveFile << "Components Dim\n";
00482 saveFile << m_Components.Nrows() << "," << m_Components.Ncols() << "\n";
00483 saveFile << m_Components << "\n";
00484 m_refModel.save(&saveFile);
00485 saveFile.close();
00486 return true;
00487 } else {
00488 return false;
00489 }
00490 }
00491
00513 bool Analyzer::load(char* filename) {
00514 m_mean.CleanUp();
00515 m_Components.CleanUp();
00516 m_refModel = model::ReferenceModel();
00517
00518 string line;
00519 vector<string> tokens;
00520 vector<string> coords;
00521
00522 ifstream loadFile(filename);
00523 if(loadFile.is_open()) {
00524 getline(loadFile,line);
00525 getline(loadFile,line);
00526 tokens.clear();
00527 Tokenize(line,tokens,",");
00528 m_mean = Matrix(convertTo<int>(tokens[0]),convertTo<int>(tokens[1]));
00529
00530 for(int i=0;i<m_mean.Nrows();i++) {
00531 getline(loadFile,line);
00532 tokens.clear();
00533 Tokenize(line,tokens," ");
00534 for(int n=0;n<m_mean.Ncols();n++) {
00535 m_mean(i+1,n+1) = convertTo<float>(tokens[n]);
00536 }
00537 }
00538
00539 getline(loadFile,line);
00540 getline(loadFile,line);
00541 getline(loadFile,line);
00542 tokens.clear();
00543 Tokenize(line,tokens,",");
00544 m_Components = Matrix(convertTo<int>(tokens[0]),convertTo<int>(tokens[1]));
00545
00546 for(int i=0;i<m_Components.Nrows();i++) {
00547 getline(loadFile,line);
00548 tokens.clear();
00549 Tokenize(line,tokens," ");
00550 for(int n=0;n<m_Components.Ncols();n++) {
00551 m_Components(i+1,n+1) = convertTo<float>(tokens[n]);
00552 }
00553 }
00554
00555 getline(loadFile,line);
00556 m_refModel.load(&loadFile);
00557 loadFile.close();
00558 return true;
00559 } else {
00560 return false;
00561 }
00562 }
00563
00564
00583 Analyzer::Analyzer(const Analyzer& other) {
00584 m_ExampleData = other.m_ExampleData;
00585 m_mean = other.m_mean;
00586 m_AdjustedData = other.m_AdjustedData;
00587 m_Covariance = other.m_Covariance;
00588 m_EigenValues = other.m_EigenValues;
00589 m_EigenVectors = other.m_EigenVectors;
00590 m_TotalEnergy = other.m_TotalEnergy;
00591 m_Components = other.m_Components;
00592 m_Transformation = other.m_Transformation;
00593 N = other.N;
00594 M = other.M;
00595 m_refModel = other.m_refModel;
00596 }
00597
00598
00620 Analyzer& Analyzer::operator=(const Analyzer& other)
00621 {
00622
00623 if ( this == &other )
00624 return *this;
00625
00626 m_ExampleData = other.m_ExampleData;
00627 m_mean = other.m_mean;
00628 m_AdjustedData = other.m_AdjustedData;
00629 m_Covariance = other.m_Covariance;
00630 m_EigenValues = other.m_EigenValues;
00631 m_EigenVectors = other.m_EigenVectors;
00632 m_TotalEnergy = other.m_TotalEnergy;
00633 m_Components = other.m_Components;
00634 m_Transformation = other.m_Transformation;
00635 N = other.N;
00636 M = other.M;
00637 m_refModel = other.m_refModel;
00638
00639 return *this;
00640 }
00641