misc
diversity(population)
¶
Calculates diversity of lineups
Parameters:
Name | Type | Description | Default |
---|---|---|---|
population |
ndarray |
the population |
required |
Returns:
Type | Description |
---|---|
ndarray |
np.ndarray: is square, shape len(population) x len(population) |
Source code in pangadfs/misc.py
def diversity(population: np.ndarray) -> np.ndarray:
"""Calculates diversity of lineups
Args:
population (np.ndarray): the population
Returns:
np.ndarray: is square, shape len(population) x len(population)
"""
uniques = np.unique(population)
a = (population[..., None] == uniques).sum(1)
return np.einsum('ij,kj->ik', a, a)
exposure(population=None)
¶
Returns dict of index: count of individuals
Parameters:
Name | Type | Description | Default |
---|---|---|---|
population |
ndarray |
the population |
None |
Returns:
Type | Description |
---|---|
Dict[int, int] |
Dict[int, int]: key is index, value is count of lineup |
Examples:
>>> fittest_population = population[np.where(fitness > np.percentile(fitness, 97))]
>>> exposure = population_exposure(fittest_population)
>>> top_exposure = np.argpartition(np.array(list(exposure.values())), -10)[-10:]
>>> print([round(i, 3) for i in sorted(top_exposure / len(fittest_population), reverse=True)])
Source code in pangadfs/misc.py
def exposure(population: np.ndarray = None) -> Dict[int, int]:
"""Returns dict of index: count of individuals
Args:
population (np.ndarray): the population
Returns:
Dict[int, int]: key is index, value is count of lineup
Examples:
>>> fittest_population = population[np.where(fitness > np.percentile(fitness, 97))]
>>> exposure = population_exposure(fittest_population)
>>> top_exposure = np.argpartition(np.array(list(exposure.values())), -10)[-10:]
>>> print([round(i, 3) for i in sorted(top_exposure / len(fittest_population), reverse=True)])
"""
flat = population.flatten
return dict(zip(flat, np.bincount(flat)[flat]))
multidimensional_shifting(elements, num_samples, sample_size, probs)
¶
Based on https://medium.com/ibm-watson/incredibly-fast-random-sampling-in-python-baf154bd836a
Parameters:
Name | Type | Description | Default |
---|---|---|---|
elements |
Iterable |
iterable to sample from, typically a dataframe index |
required |
num_samples |
int |
the number of rows (e.g. initial population size) |
required |
sample_size |
int |
the number of columns (e.g. team size) |
required |
probs |
Iterable |
is same size as elements |
required |
Returns:
Type | Description |
---|---|
ndarray |
ndarray: of shape (num_samples, sample_size) |
Source code in pangadfs/misc.py
def multidimensional_shifting(elements: Iterable,
num_samples: int,
sample_size: int,
probs: Iterable) -> np.ndarray:
"""Based on https://medium.com/ibm-watson/incredibly-fast-random-sampling-in-python-baf154bd836a
Args:
elements (iterable): iterable to sample from, typically a dataframe index
num_samples (int): the number of rows (e.g. initial population size)
sample_size (int): the number of columns (e.g. team size)
probs (iterable): is same size as elements
Returns:
ndarray: of shape (num_samples, sample_size)
"""
replicated_probabilities = np.tile(probs, (num_samples, 1))
random_shifts = np.random.random(replicated_probabilities.shape)
random_shifts /= random_shifts.sum(axis=1)[:, np.newaxis]
shifted_probabilities = random_shifts - replicated_probabilities
samples = np.argpartition(shifted_probabilities, sample_size, axis=1)[:, :sample_size]
return elements.to_numpy()[samples]
parents(population)
¶
Evenly splits population
Parameters:
Name | Type | Description | Default |
---|---|---|---|
population |
ndarray |
the population to crossover. Shape is n_individuals x n_chromosomes. |
required |
Returns:
Type | Description |
---|---|
Tuple[numpy.ndarray, numpy.ndarray] |
Tuple[np.ndarray, np.ndarray]: population split into two equal-size arrays |
Source code in pangadfs/misc.py
def parents(population: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
"""Evenly splits population
Args:
population (np.ndarray): the population to crossover. Shape is n_individuals x n_chromosomes.
Returns:
Tuple[np.ndarray, np.ndarray]: population split into two equal-size arrays
"""
fathers, mothers = np.array_split(population, 2)
size = min(len(fathers), len(mothers))
return fathers[:size], mothers[:size]