Source code for pysensmcda.probabilistic.monte_carlo_weights

# Copyright (C) 2024 Jakub Więckowski

import numpy as np
from ..criteria import random_distribution as dist
from ..validator import Validator
from ..utils import memory_guard

[docs] @memory_guard def monte_carlo_weights(n: int, distribution: str = 'uniform', num_samples: int = 1000, params: dict = dict()) -> np.ndarray: """ Generate criteria weights probabilistically using Monte Carlo simulation. Parameters: ------------ n : int Number of weights to generate. distribution : str Probability distribution for weight modification. Options: 'chisquare', 'laplace', 'normal', 'random', 'triangular', 'uniform'. params : dict Parameters for the chosen distribution. Check NumPy documentation for details. num_samples : int, optional, default=1000 Number of samples to generate in the Monte Carlo simulation. Returns: --------- ndarray Array of modified criteria weights based on Monte Carlo simulation. Example: --------- >>> n = 3 >>> modified_weights = monte_carlo_weights(n, num_samples=1000, distribution='normal', params={'loc': 0.5, 'scale': 0.1}) >>> print(modified_weights) """ Validator.is_type_valid(n, (int, np.integer), 'n') Validator.is_type_valid(distribution, str, 'distribution') allowed_distributions = ['chisquare', 'laplace', 'normal', 'random', 'triangular', 'uniform'] Validator.is_in_list(distribution, allowed_distributions, 'distribution') Validator.is_type_valid(num_samples, (int, np.integer), 'num_samples') Validator.is_type_valid(params, dict, 'params') modified_weights = [] for _ in range(num_samples): try: method = getattr(dist, f'{distribution}_distribution') weights = method(**params, size=n) except Exception as err: raise ValueError(err) modified_weights.append(weights) return np.array(modified_weights)