remove unneeded files
This commit is contained in:
@@ -1,114 +0,0 @@
|
|||||||
# Iterative Proposal Implementation
|
|
||||||
|
|
||||||
This implementation extends the existing local discretization framework with iterative convergence capabilities, following the analysis from `local_discretization_analysis.md`.
|
|
||||||
|
|
||||||
## Key Components
|
|
||||||
|
|
||||||
### 1. IterativeProposal Class
|
|
||||||
- **File**: `bayesnet/classifiers/IterativeProposal.h|cc`
|
|
||||||
- **Purpose**: Extends the base `Proposal` class with iterative convergence logic
|
|
||||||
- **Key Method**: `iterativeLocalDiscretization()` - performs iterative refinement until convergence
|
|
||||||
|
|
||||||
### 2. TANLdIterative Example
|
|
||||||
- **File**: `bayesnet/classifiers/TANLdIterative.h|cc`
|
|
||||||
- **Purpose**: Demonstrates how to adapt existing Ld classifiers to use iterative discretization
|
|
||||||
- **Pattern**: Inherits from both `TAN` and `IterativeProposal`
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
The implementation follows the established dual inheritance pattern:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
class TANLdIterative : public TAN, public IterativeProposal
|
|
||||||
```
|
|
||||||
|
|
||||||
This maintains the same interface as existing Ld classifiers while adding convergence capabilities.
|
|
||||||
|
|
||||||
## Convergence Algorithm
|
|
||||||
|
|
||||||
The iterative process works as follows:
|
|
||||||
|
|
||||||
1. **Initial Discretization**: Use class-only discretization (`fit_local_discretization()`)
|
|
||||||
2. **Iterative Refinement Loop**:
|
|
||||||
- Build model with current discretization (call parent `fit()`)
|
|
||||||
- Refine discretization using network structure (`localDiscretizationProposal()`)
|
|
||||||
- Compute convergence metric (likelihood or accuracy)
|
|
||||||
- Check for convergence based on tolerance
|
|
||||||
- Repeat until convergence or max iterations reached
|
|
||||||
|
|
||||||
## Configuration Parameters
|
|
||||||
|
|
||||||
- `max_iterations`: Maximum number of iterations (default: 10)
|
|
||||||
- `tolerance`: Convergence tolerance (default: 1e-6)
|
|
||||||
- `convergence_metric`: "likelihood" or "accuracy" (default: "likelihood")
|
|
||||||
- `verbose_convergence`: Enable verbose logging (default: false)
|
|
||||||
|
|
||||||
## Usage Example
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "bayesnet/classifiers/TANLdIterative.h"
|
|
||||||
|
|
||||||
// Create classifier
|
|
||||||
bayesnet::TANLdIterative classifier;
|
|
||||||
|
|
||||||
// Set convergence parameters
|
|
||||||
nlohmann::json hyperparams;
|
|
||||||
hyperparams["max_iterations"] = 5;
|
|
||||||
hyperparams["tolerance"] = 1e-4;
|
|
||||||
hyperparams["convergence_metric"] = "likelihood";
|
|
||||||
hyperparams["verbose_convergence"] = true;
|
|
||||||
|
|
||||||
classifier.setHyperparameters(hyperparams);
|
|
||||||
|
|
||||||
// Fit and use normally
|
|
||||||
classifier.fit(X, y, features, className, states, smoothing);
|
|
||||||
auto predictions = classifier.predict(X_test);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
Run the test with:
|
|
||||||
```bash
|
|
||||||
make -f Makefile.iterative test-iterative
|
|
||||||
```
|
|
||||||
|
|
||||||
## Integration with Existing Code
|
|
||||||
|
|
||||||
To convert existing Ld classifiers to use iterative discretization:
|
|
||||||
|
|
||||||
1. Change inheritance from `Proposal` to `IterativeProposal`
|
|
||||||
2. Replace the discretization logic in `fit()` method:
|
|
||||||
```cpp
|
|
||||||
// Old approach:
|
|
||||||
states = fit_local_discretization(y);
|
|
||||||
TAN::fit(dataset, features, className, states, smoothing);
|
|
||||||
states = localDiscretizationProposal(states, model);
|
|
||||||
|
|
||||||
// New approach:
|
|
||||||
states = iterativeLocalDiscretization(y, this, dataset, features, className, states_, smoothing);
|
|
||||||
TAN::fit(dataset, features, className, states, smoothing);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Benefits
|
|
||||||
|
|
||||||
1. **Convergence**: Iterative refinement until stable discretization
|
|
||||||
2. **Flexibility**: Configurable convergence criteria and limits
|
|
||||||
3. **Compatibility**: Maintains existing interface and patterns
|
|
||||||
4. **Monitoring**: Optional verbose logging for convergence tracking
|
|
||||||
5. **Extensibility**: Easy to add new convergence metrics or stopping criteria
|
|
||||||
|
|
||||||
## Performance Considerations
|
|
||||||
|
|
||||||
- Iterative approach will be slower than the original two-phase method
|
|
||||||
- Convergence monitoring adds computational overhead
|
|
||||||
- Consider setting appropriate `max_iterations` to prevent infinite loops
|
|
||||||
- The `tolerance` parameter should be tuned based on your specific use case
|
|
||||||
|
|
||||||
## Future Enhancements
|
|
||||||
|
|
||||||
Potential improvements:
|
|
||||||
1. Add more convergence metrics (e.g., AIC, BIC, cross-validation score)
|
|
||||||
2. Implement early stopping based on validation performance
|
|
||||||
3. Add support for different discretization schedules
|
|
||||||
4. Optimize likelihood computation for better performance
|
|
||||||
5. Add convergence visualization and reporting tools
|
|
@@ -1,20 +0,0 @@
|
|||||||
# Makefile for testing iterative proposal implementation
|
|
||||||
# Include this in the main Makefile or use directly
|
|
||||||
|
|
||||||
# Test iterative proposal
|
|
||||||
test-iterative: buildd
|
|
||||||
@echo "Building iterative proposal test..."
|
|
||||||
cd build_Debug && g++ -std=c++17 -I../bayesnet -I../config -I/usr/local/include \
|
|
||||||
../test_iterative_proposal.cpp \
|
|
||||||
-L. -lbayesnet \
|
|
||||||
-ltorch -ltorch_cpu \
|
|
||||||
-pthread \
|
|
||||||
-o test_iterative_proposal
|
|
||||||
@echo "Running iterative proposal test..."
|
|
||||||
cd build_Debug && ./test_iterative_proposal
|
|
||||||
|
|
||||||
# Clean test
|
|
||||||
clean-test:
|
|
||||||
rm -f build_Debug/test_iterative_proposal
|
|
||||||
|
|
||||||
.PHONY: test-iterative clean-test
|
|
@@ -1,66 +0,0 @@
|
|||||||
// ***************************************************************
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 Ricardo Montañana Gómez
|
|
||||||
// SPDX-FileType: SOURCE
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
// ***************************************************************
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <torch/torch.h>
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
#include "bayesnet/classifiers/TANLdIterative.h"
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
std::cout << "Testing Iterative Proposal Implementation" << std::endl;
|
|
||||||
|
|
||||||
// Create synthetic continuous data
|
|
||||||
torch::Tensor X = torch::rand({100, 3}); // 100 samples, 3 features
|
|
||||||
torch::Tensor y = torch::randint(0, 2, {100}); // Binary classification
|
|
||||||
|
|
||||||
// Create feature names
|
|
||||||
std::vector<std::string> features = {"feature1", "feature2", "feature3"};
|
|
||||||
std::string className = "class";
|
|
||||||
|
|
||||||
// Create initial states (will be updated by discretization)
|
|
||||||
std::map<std::string, std::vector<int>> states;
|
|
||||||
states[className] = {0, 1};
|
|
||||||
|
|
||||||
// Create classifier
|
|
||||||
bayesnet::TANLdIterative classifier;
|
|
||||||
|
|
||||||
// Set convergence hyperparameters
|
|
||||||
json hyperparams;
|
|
||||||
hyperparams["max_iterations"] = 5;
|
|
||||||
hyperparams["tolerance"] = 1e-4;
|
|
||||||
hyperparams["convergence_metric"] = "likelihood";
|
|
||||||
hyperparams["verbose_convergence"] = true;
|
|
||||||
|
|
||||||
classifier.setHyperparameters(hyperparams);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Fit the model
|
|
||||||
std::cout << "Fitting TANLdIterative classifier..." << std::endl;
|
|
||||||
classifier.fit(X, y, features, className, states, bayesnet::Smoothing_t::LAPLACE);
|
|
||||||
|
|
||||||
// Make predictions
|
|
||||||
torch::Tensor X_test = torch::rand({10, 3});
|
|
||||||
torch::Tensor predictions = classifier.predict(X_test);
|
|
||||||
torch::Tensor probabilities = classifier.predict_proba(X_test);
|
|
||||||
|
|
||||||
std::cout << "Predictions: " << predictions << std::endl;
|
|
||||||
std::cout << "Probabilities shape: " << probabilities.sizes() << std::endl;
|
|
||||||
|
|
||||||
// Generate graph
|
|
||||||
auto graph = classifier.graph();
|
|
||||||
std::cout << "Graph nodes: " << graph.size() << std::endl;
|
|
||||||
|
|
||||||
std::cout << "Test completed successfully!" << std::endl;
|
|
||||||
|
|
||||||
} catch (const std::exception& e) {
|
|
||||||
std::cerr << "Error: " << e.what() << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Reference in New Issue
Block a user