Improved Exploring Starts by Kernel Density Estimation-Based State-Space Coverage Acceleration in Reinforcement Learning.
Project description
DESSCA
Density Estimation-based State-Space Coverage Acceleration
DESSCA is a sampling algorithm whose strategy pursues optimal coverage of a given space. Originally, it had been proposed as an exploring starts strategy in reinforcement learning problems , i.e., with the intention of initializing the learning environment to a previously unvisited state for higher informational gain. Over the years, however, DESSCA showed its quality as a universal design of experiments tool, which has been utilized for maximized informational gain also when collecting data in resource-heavy investigations or for evaluating and certifying devices under test systematically.
Citing
An in-depth explanation of the principle, realization and improvement capabilities of DESSCA can be found in the article "Improved Exploring Starts by Kernel Density Estimation-Based State-Space Coverage Acceleration in Reinforcement Learning". Please cite it when using the provided code:
@misc{schenke2021improved,
title={Improved Exploring Starts by Kernel Density Estimation-Based State-Space Coverage Acceleration in Reinforcement Learning},
author={Maximilian Schenke and Oliver Wallscheid},
year={2021},
eprint={2105.08990},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Usage
This code snippet serves as a minimal usage example to DESSCA. Firstly, install DESSCA:
pip install dessca
Secondly, import the DesscaModel and create a corresponding object.
import numpy as np
from dessca import DesscaModel
my_dessca_instance0 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.5)
This model instance can be used on a two-dimensional state space. Now let's make use of its functionality by viewing the state-space coverage of a dataset. Here are some samples:
samples_2d = np.array([[-0.8, -0.8],
[ 0.8, -0.8],
[-0.8, 0.8],
[ 0.0, 0.0]])
my_dessca_instance0.update_coverage_pdf(data=np.transpose(samples_2d))
my_dessca_instance0.plot_scatter()
Output:
And a corresponding coverage heatmap
my_dessca_instance0.plot_heatmap()
Output:
The coverage probability density function (PDF) is updated with the given distribution. DESSCA can now suggest where to place the next sample.
next_sample_suggest = my_dessca_instance0.sample_optimally()
print(next_sample_suggest)
Output: [0.85517754 0.94340648] (Note: results are a little random in scenarios with very few samples)
As was to be expected, the suggestion is in the upper right corner of the state space. Update the coverage density and view the new distribution:
my_dessca_instance0.update_coverage_pdf(data=np.transpose([next_sample_suggest]))
my_dessca_instance0.plot_scatter()
Output:
Let's have a look at the density:
my_dessca_instance0.plot_heatmap()
Output:
More Features
The scatter plots can also be rendered in an online fashion (100 samples):
my_dessca_instance1 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.1,
render_online=True)
next_sample_suggest = my_dessca_instance1.update_and_sample()
for _ in range(100):
next_sample_suggest = my_dessca_instance1.update_and_sample(np.transpose([next_sample_suggest]))
Output:
Further, we can parameterize a memory buffer to only memorize a limited number of past samples:
my_dessca_instance2 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.1,
render_online=True,
buffer_size=25)
next_sample_suggest = my_dessca_instance2.update_and_sample()
for _ in range(100):
next_sample_suggest = my_dessca_instance2.update_and_sample(np.transpose([next_sample_suggest]))
Output:
See how forgetting past samples leads to a group of samples in a similar area? Lastly, we can also choose to use a specific reference coverage density:
def reference_coverage(X):
# for uniform distribution on a given shape the value range of the reference coverage is not important
x0 = X[0]
x1 = X[1]
return np.less(x0**2 + x1**2, 1).astype(float)
my_dessca_instance3 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.1,
render_online=True,
reference_pdf=reference_coverage)
next_sample_suggest = my_dessca_instance3.update_and_sample()
for _ in range(100):
next_sample_suggest = my_dessca_instance3.update_and_sample(np.transpose([next_sample_suggest]))
Output:
DESSCA can also be used for downsampling. Let's firstly find a large dataset that we would like to reduce in size:
x1_samples = np.random.triangular(-1, 0.75, 1, size=(1000, 1))
x2_samples = np.random.triangular(-1, -0.75, 1, size=(1000, 1))
samples_2d = np.append(x1_samples, x2_samples, axis=1)
my_dessca_instance4 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.5)
my_dessca_instance4.update_coverage_pdf(data=np.transpose(samples_2d))
my_dessca_instance4.plot_scatter()
Output:
Now, DESSCA can be used to reduce the set down to a specified number of remaining samples while trying to preserve the original distribution:
my_dessca_instance5 = DesscaModel(box_constraints=[[-1, 1],
[-1, 1]],
state_names=["x1", "x2"],
bandwidth=0.5)
my_dessca_instance5.downsample(data=np.transpose(samples_2d), target_size=100)
my_dessca_instance5.plot_scatter()
Output:
Comparing the edge distributions, it can be seen that they are still almost the same despite removing 90 % of the dataset's content.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dessca-0.1.2.tar.gz.
File metadata
- Download URL: dessca-0.1.2.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0cdba41188d7c45cdfa75f66d5f368e6b199ee92597433ee5972161c5b70bf78
|
|
| MD5 |
c598c8baea942920639e3412fccc61cf
|
|
| BLAKE2b-256 |
07309ee81ba08ed36f724823d74a00c0bb5ce5c7e31e97e47b4daf2128d100a5
|
File details
Details for the file dessca-0.1.2-py3-none-any.whl.
File metadata
- Download URL: dessca-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a0066ce89fc39a630bb6f043d46811297968d7c2e8988fb8332ecd56226344e
|
|
| MD5 |
a5181d78c6fa74302ccfd85e66c9fcbf
|
|
| BLAKE2b-256 |
10cb5fa523d3faba947109d1d67fb3267c90e26d96e599de640b2cf5bac1419e
|