Comments (5)
Hi, the problem is that ELFI expects the outputs of these operations to be numpy
arrays of length batch_size
(even with batch_size=1
). Currently your distance function SSE
returns a numpy
scalar. So you can either vectorize it with elfi.tools.vectorize
, or as a quick solution to write e.g.
def SSE(x, y):
return np.atleast_1d(np.sum((x-y)**2))
However your simulator should also wrap the results in numpy arrays with length batch_size
(in this case it would be a 2D numpy
array), so that it would work with other batch sizes besides 1. You can either do that yourself or use the elfi.tools.vectorize
. This in turn then requires that your distance handles them correctly (assuming your observed data is also 2D array):
def SSE(x, y):
return np.sum((x-y)**2, axis=1)
We should think a way to detect these cases and report a better error message since these seem to be quite common.
from elfi.
Thanks for the quick response and suggested adjustment.
I made the adjustment to the distance function and continued on with the example. However, now the rejection sampler hangs and if I kill the process (ctrl-C) and plot the parameter space that's being explored then it looks like it's searching in the correct area but it seems to take a while to reach the result (roughly a,b = 1). I was curious about ways to speed this up?
# (as example above ...)
def SSE(x, y):
return np.atleast_1d(np.sum((x-y)**2))
rej = elfi.Rejection(d_lv, batch_size = 1, seed = seed)
result = rej.sample(1000, threshold = 30.0)
# kill the process after about a minute (ctrl-C)
# Plot the parameter space that's been explored
fig, ax = plt.subplots()
rej.plot_state(ax = ax)
ax.set_xlim([-11, 11])
ax.set_ylim([-11, 11])
plt.savefig("parameter_space.png")
plt.close()
Additionally, when outputting the result with rej.extract_result()
the threshold parameter seems to have been ignored (it was set to 30.0).
rej.extract_result()
Method: Rejection
Number of samples: 1000
Number of simulations: 21063
Threshold: 484
Sample means: a: -0.518, b: 2
from elfi.
There are several things you can try to speed things up, for example:
-
Is requesting
threshold=30
reasonable? ELFI will keep sampling until it finds 1000 samples below that threshold, which for a very small threshold may never happen. To be safe, you could initially request e.g.quantile=0.01
instead of the threshold. ELFI will then draw 1000 * 1 / 0.01 samples, return the best 1000 and report the resulting threshold value. That said, it seems ELFI ran only 21063 simulations in your case, so even this would apparently take several minutes. -
Enable parallelization. See the documentation.
-
Use a more advanced inference method, e.g. BOLFI.
-
This is probably the most effective way, but also the most difficult (and not always even possible): try to vectorize your simulator so that you could use and benefit from a larger
batch_size
.
Since you killed the process, what you get using extract_result
may not be what you want. I suspect there were not enough samples below the given threshold.
from elfi.
Thanks for those ideas.
I used a threshold of 30.0 because that is what is quoted as the first threshold in ABC-SMC in the paper by Toni et al., (2009) (assuming the first threshold of ABC-SMC would be a suitable threshold for ABC-rejection). They report ~26,000 data generation steps to find 1000 accepted samples (with ABC-SMC).
from elfi.
Also ABC-SMC speeds up the inference compared to Rejection ABC. You might be interested in the iterative advancing of the algorithm:
http://elfi.readthedocs.io/en/latest/usage/tutorial.html#iterative-advancing
Basically you set the objective and then you can advance the inference step by step and investigate the result at any point. Internally the sample
method runs the iterative advancing loop until the objective is reached.
from elfi.
Related Issues (20)
- threshold value returned when specifying 'n_sim' in Rejection sampler HOT 1
- Use Dask for parallel computing? HOT 5
- Can rejection sampling be done with no explicit passing of observed data to a simulator? HOT 2
- Regression adjustment returns point estimate in specific case HOT 3
- networkx 2 compatibility HOT 3
- stochastic_optimization call to differential_evolution broken in newer scipy HOT 1
- Implement initial standard BSL HOT 1
- Implement initial semiBSL method HOT 1
- Tightly pinned requirements are becoming out of date HOT 2
- elfi.examples docstrings are missing details HOT 1
- BOLFIRE target nodes
- Extend sample result summaries HOT 1
- Issue in trying to setup RandMaxVar in BOLFI HOT 4
- Require `plot_gp` inputs `const` and `bounds` to be given as dictionaries
- Random variation in default kernel parameters
- BOLFI posterior.py logging
- Processing failed simulations / samples HOT 2
- BOLFI fails if numpy version is >= 1.20 HOT 1
- Basic rejection method of inferring parameters of an SIR disease model HOT 4
- import elfi fails HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from elfi.