ppforest2 v0.1.0
Projection Pursuit Decision Trees and Random Forests
Loading...
Searching...
No Matches
VIVisitor.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "utils/Types.hpp"
5
6#include <vector>
7
8namespace ppforest2 {
25 public:
27 std::vector<types::Feature> vi2_contributions;
28
30 std::vector<types::Feature> vi3_contributions;
31
33 types::FeatureVector const* scale = nullptr;
34
41 explicit VIVisitor(int n_vars, types::FeatureVector const* scale = nullptr)
42 : vi2_contributions(static_cast<std::size_t>(n_vars), 0.0f)
43 , vi3_contributions(static_cast<std::size_t>(n_vars), 0.0f)
44 , scale(scale) {}
45
51 void visit(TreeBranch const& node) override {
52 int const n_vars = static_cast<int>(vi2_contributions.size());
53 int const G_s = static_cast<int>(node.groups.size());
54 types::Feature const I_s = node.pp_index_value;
55
56 for (int j = 0; j < n_vars && j < node.projector.size(); ++j) {
57 types::Feature coeff = std::abs(node.projector(j));
58
59 if (scale != nullptr && j < scale->size()) {
60 coeff *= (*scale)(j);
61 }
62
63 if (G_s > 0) {
64 vi2_contributions[static_cast<std::size_t>(j)] +=
65 coeff / static_cast<types::Feature>(G_s); // <- not std::abs(coeff)
66 }
67
68 vi3_contributions[static_cast<std::size_t>(j)] += I_s * coeff;
69 }
70
71 node.lower->accept(*this);
72 node.upper->accept(*this);
73 }
74
81 void visit(TreeLeaf const&) override {}
82 };
83}
Internal split node in a projection pursuit tree.
Definition TreeBranch.hpp:15
TreeNode::Ptr upper
Child node for observations with projected value ≥ cutpoint.
Definition TreeBranch.hpp:26
std::set< types::GroupId > groups
Set of group labels reachable from this node.
Definition TreeBranch.hpp:29
types::Feature pp_index_value
Projection pursuit index value achieved at this split.
Definition TreeBranch.hpp:31
pp::Projector projector
Projection vector (p). Defines the linear combination of features.
Definition TreeBranch.hpp:20
TreeNode::Ptr lower
Child node for observations with projected value < cutpoint.
Definition TreeBranch.hpp:24
Leaf node in a projection pursuit tree.
Definition TreeLeaf.hpp:12
Visitor interface for tree node dispatch.
Definition TreeNode.hpp:31
types::FeatureVector const * scale
Optional per-variable σ vector (size p); scale[j] = σ_j.
Definition VIVisitor.hpp:33
std::vector< types::Feature > vi2_contributions
VI2 contributions per variable (size p).
Definition VIVisitor.hpp:27
std::vector< types::Feature > vi3_contributions
VI3 contributions per variable (size p).
Definition VIVisitor.hpp:30
void visit(TreeLeaf const &) override
Visit a leaf node; no contribution to VI.
Definition VIVisitor.hpp:81
void visit(TreeBranch const &node) override
Visit a split node; accumulate contributions and recurse.
Definition VIVisitor.hpp:51
VIVisitor(int n_vars, types::FeatureVector const *scale=nullptr)
Construct a visitor for a tree with n_vars variables.
Definition VIVisitor.hpp:41
Eigen::Matrix< Feature, Eigen::Dynamic, 1 > FeatureVector
Dynamic-size column vector of feature values.
Definition Types.hpp:36
float Feature
Scalar type for feature values.
Definition Types.hpp:24
Binarization strategies for multiclass-to-binary reduction.
Definition Benchmark.hpp:25