Fix predict_proba_spode

This commit is contained in:
2025-03-02 21:41:21 +01:00
parent 12e69a7f53
commit 11155463b9

View File

@@ -316,41 +316,43 @@ namespace platform {
// We multiply p(c) * p(x_sp| c) * p(x_i| c, x_sp). // We multiply p(c) * p(x_sp| c) * p(x_i| c, x_sp).
// Then normalize the distribution. // Then normalize the distribution.
// //
// std::vector<double> predict_proba_spode(const std::vector<int>& instance, int parent) std::vector<double> predict_proba_spode(const std::vector<int>& instance, int parent)
// { {
// // accumulates posterior probabilities for each class // accumulates posterior probabilities for each class
// auto probs = std::vector<double>(statesClass_); auto probs = std::vector<double>(statesClass_);
// auto spodeProbs = std::vector<double>(statesClass_); auto spodeProbs = std::vector<double>(statesClass_);
// // Initialize the probabilities with the feature|class probabilities // Initialize the probabilities with the feature|class probabilities x class priors
// int localOffset; int localOffset;
// int sp = instance[parent]; int sp = instance[parent];
// localOffset = (featureClassOffset_[parent] + sp) * statesClass_; localOffset = (featureClassOffset_[parent] + sp) * statesClass_;
// for (int c = 0; c < statesClass_; ++c) { for (int c = 0; c < statesClass_; ++c) {
// spodeProbs[c] = classFeatureProbs_[localOffset + c] * classPriors_[c]; spodeProbs[c] = classFeatureProbs_[localOffset + c] * classPriors_[c];
// } }
// int idx, base, sc, parent_offset; int idx, base, sc, parent_offset;
// sp = instance[parent]; sp = instance[parent];
// parent_offset = pairOffset_[featureClassOffset_[parent] + sp]; parent_offset = pairOffset_[featureClassOffset_[parent] + sp];
// for (int child = 0; child < parent; ++child) { for (int child = 0; child < nFeatures_; ++child) {
// sc = instance[child]; if (child == parent) {
// base = (parent_offset + featureClassOffset_[child] + sc) * statesClass_; continue;
// for (int c = 0; c < statesClass_; ++c) { }
// /* sc = instance[child];
// * The probability P(xc|xp,c) is stored in dataOpp_, and base = (parent_offset + featureClassOffset_[child] + sc) * statesClass_;
// * the probability P(xp|xc,c) is stored in data_ for (int c = 0; c < statesClass_; ++c) {
// */ /*
// idx = base + c; * The probability P(xc|xp,c) is stored in dataOpp_, and
// spodeProbs[c] *= data_[idx]; * the probability P(xp|xc,c) is stored in data_
// spodeProbs[c] *= dataOpp_[idx]; */
// } idx = base + c;
// } spodeProbs[c] *= child < parent ? dataOpp_[idx] : data_[idx];
// // Normalize the probabilities }
// normalize(spodeProbs); }
// return spodeProbs; // Normalize the probabilities
// } normalize(spodeProbs);
return spodeProbs;
}
int predict_spode(const std::vector<int>& instance, int parent) int predict_spode(const std::vector<int>& instance, int parent)
{ {
auto probs = predict_proba(instance, parent); auto probs = predict_proba_spode(instance, parent);
return (int)std::distance(probs.begin(), std::max_element(probs.begin(), probs.end())); return (int)std::distance(probs.begin(), std::max_element(probs.begin(), probs.end()));
} }
// ------------------------------------------------------- // -------------------------------------------------------
@@ -363,8 +365,7 @@ namespace platform {
// We multiply p(c) * p(x_i| c) * p(x_j| c, x_i) for all i, j. // We multiply p(c) * p(x_i| c) * p(x_j| c, x_i) for all i, j.
// Then normalize the distribution. // Then normalize the distribution.
// //
// if spode != -1, we only return the probabilities for that spode std::vector<double> predict_proba(const std::vector<int>& instance)
std::vector<double> predict_proba(const std::vector<int>& instance, int spode = -1)
{ {
// accumulates posterior probabilities for each class // accumulates posterior probabilities for each class
auto probs = std::vector<double>(statesClass_); auto probs = std::vector<double>(statesClass_);
@@ -403,11 +404,6 @@ namespace platform {
} }
} }
} }
if (spode != -1) {
// no need to use significance_models_ if we are predicting with a single spode
normalize(spodeProbs[spode]);
return spodeProbs[spode];
}
/* add all the probabilities for each class */ /* add all the probabilities for each class */
for (int c = 0; c < statesClass_; ++c) { for (int c = 0; c < statesClass_; ++c) {
for (int i = 0; i < nFeatures_; ++i) { for (int i = 0; i < nFeatures_; ++i) {