-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move add_parameter_noise to simulation package
- Loading branch information
1 parent
39cee78
commit 29b42ca
Showing
4 changed files
with
67 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
"""Simulation utilities.""" | ||
|
||
from __future__ import annotations | ||
|
||
from collections.abc import Iterable | ||
from typing import TYPE_CHECKING, Literal | ||
|
||
import numpy as np | ||
import pandas as pd | ||
|
||
if TYPE_CHECKING: | ||
from baybe.parameters import Parameter | ||
|
||
|
||
def add_parameter_noise( | ||
data: pd.DataFrame, | ||
parameters: Iterable[Parameter], | ||
noise_type: Literal["absolute", "relative_percent"] = "absolute", | ||
noise_level: float = 1.0, | ||
) -> None: | ||
"""Apply uniform noise to the parameter values of a recommendation frame. | ||
The noise can be additive or multiplicative. | ||
This can be used to simulate experimental noise or imperfect user input containing | ||
numerical parameter values that differ from the recommendations. Note that the | ||
dataframe is modified in-place, and that no new dataframe is returned. | ||
Args: | ||
data: Output of the ``recommend`` function of a ``Campaign`` object, see | ||
:func:`baybe.campaign.Campaign.recommend`. | ||
parameters: The parameters for which the values shall be corrupted. | ||
noise_type: Defines whether the noise should be additive or multiplicative. | ||
noise_level: Level/magnitude of the noise. Must be provided as numerical value | ||
for noise type ``absolute`` and as percentage for noise type | ||
``relative_percent``. | ||
Raises: | ||
ValueError: If ``noise_type`` is neither ``absolute`` nor | ||
``relative_percent``. | ||
""" | ||
# Validate input | ||
if noise_type not in ("relative_percent", "absolute"): | ||
raise ValueError( | ||
f"Parameter 'noise_type' was {noise_type} but must be either " | ||
"'absolute' or 'relative_percent'." | ||
) | ||
|
||
for param in (p for p in parameters if p.is_numeric): | ||
# Add selected noise type | ||
if noise_type == "relative_percent": | ||
data[param.name] *= np.random.uniform( | ||
1.0 - noise_level / 100.0, 1.0 + noise_level / 100.0, len(data) | ||
) | ||
elif noise_type == "absolute": | ||
data[param.name] += np.random.uniform(-noise_level, noise_level, len(data)) | ||
|
||
# Respect continuous intervals | ||
if param.is_continuous: | ||
data[param.name] = data[param.name].clip( | ||
param.bounds.lower, param.bounds.upper | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters