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).
// Then normalize the distribution.
//
// std::vector<double> predict_proba_spode(const std::vector<int>& instance, int parent)
// {
// // accumulates posterior probabilities for each class
// auto probs = std::vector<double>(statesClass_);
// auto spodeProbs = std::vector<double>(statesClass_);
// // Initialize the probabilities with the feature|class probabilities
// int localOffset;
// int sp = instance[parent];
// localOffset = (featureClassOffset_[parent] + sp) * statesClass_;
// for (int c = 0; c < statesClass_; ++c) {
// spodeProbs[c] = classFeatureProbs_[localOffset + c] * classPriors_[c];
// }
// int idx, base, sc, parent_offset;
// sp = instance[parent];
// parent_offset = pairOffset_[featureClassOffset_[parent] + sp];
// for (int child = 0; child < parent; ++child) {
// sc = instance[child];
// base = (parent_offset + featureClassOffset_[child] + sc) * statesClass_;
// for (int c = 0; c < statesClass_; ++c) {
// /*
// * The probability P(xc|xp,c) is stored in dataOpp_, and
// * the probability P(xp|xc,c) is stored in data_
// */
// idx = base + c;
// spodeProbs[c] *= data_[idx];
// spodeProbs[c] *= dataOpp_[idx];
// }
// }
// // Normalize the probabilities
// normalize(spodeProbs);
// return spodeProbs;
// }
std::vector<double> predict_proba_spode(const std::vector<int>& instance, int parent)
{
// accumulates posterior probabilities for each class
auto probs = std::vector<double>(statesClass_);
auto spodeProbs = std::vector<double>(statesClass_);
// Initialize the probabilities with the feature|class probabilities x class priors
int localOffset;
int sp = instance[parent];
localOffset = (featureClassOffset_[parent] + sp) * statesClass_;
for (int c = 0; c < statesClass_; ++c) {
spodeProbs[c] = classFeatureProbs_[localOffset + c] * classPriors_[c];
}
int idx, base, sc, parent_offset;
sp = instance[parent];
parent_offset = pairOffset_[featureClassOffset_[parent] + sp];
for (int child = 0; child < nFeatures_; ++child) {
if (child == parent) {
continue;
}
sc = instance[child];
base = (parent_offset + featureClassOffset_[child] + sc) * statesClass_;
for (int c = 0; c < statesClass_; ++c) {
/*
* The probability P(xc|xp,c) is stored in dataOpp_, and
* the probability P(xp|xc,c) is stored in data_
*/
idx = base + c;
spodeProbs[c] *= child < parent ? dataOpp_[idx] : data_[idx];
}
}
// Normalize the probabilities
normalize(spodeProbs);
return spodeProbs;
}
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()));
}
// -------------------------------------------------------
@@ -363,8 +365,7 @@ namespace platform {
// We multiply p(c) * p(x_i| c) * p(x_j| c, x_i) for all i, j.
// 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, int spode = -1)
std::vector<double> predict_proba(const std::vector<int>& instance)
{
// accumulates posterior probabilities for each class
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 */
for (int c = 0; c < statesClass_; ++c) {
for (int i = 0; i < nFeatures_; ++i) {