#include "StdAfx.h" #include #include "sMAPE.h" #include "RMSE.h" #include "BIC.h" #include "Math.h" #include Bic::Bic(algoritm versionBIC, int paramCount) { pc = paramCount; this->versionBIC = versionBIC; } Bic::~Bic() { } double Bic::getValue(vector original, vector model) { double valueBIC; switch (versionBIC) { case algoritm::Classic: valueBIC = classicBIC(original, model, pc); break; case algoritm::RMSE: valueBIC = rmseBIC(original, model, pc); break; case algoritm::sMAPE: valueBIC = smapeBIC(original, model, pc); break; } return valueBIC; } double Bic::getValue(int paramCount, vector original, vector model) { double valueBIC; switch (versionBIC) { case algoritm::Classic: valueBIC = classicBIC(original, model, paramCount); break; case algoritm::RMSE: valueBIC = rmseBIC(original, model, paramCount); break; case algoritm::sMAPE: valueBIC = smapeBIC(original, model, paramCount); break; } return valueBIC; } double Bic::classicBIC(vector original, vector model, int paramCount) { double valueBIC; double sumLik = 0; double logLik; int sampleSize = original.size(); for (int i = 0; i < sampleSize; i++) { sumLik += pow(original[i] - model[i], 2); } logLik = log(sumLik) * sampleSize; valueBIC = logLik + log((double)sampleSize) * paramCount; return valueBIC; } double Bic::rmseBIC(vector original, vector model, int paramCount) { double valueBIC; int sampleSize = original.size(); Estimation *RMSE = new Rmse(); double valueRMSE = RMSE->getValue(original, model); valueBIC = valueRMSE * pow((double)sampleSize, paramCount / (2 * sampleSize)); return valueBIC; } double Bic::smapeBIC(vector original, vector model, int paramCount) { double valueBIC; int sampleSize = original.size(); Estimation *sMAPE = new SMape(); double value_sMAPE = sMAPE->getValue(original, model); valueBIC = value_sMAPE * pow((double)sampleSize, paramCount / (2 * sampleSize)); return valueBIC; }