Как я могу использовать распределение вероятностей в классе python? - PullRequest
0 голосов
/ 05 мая 2020

Допустим, у меня есть следующий класс:

class Vehicle:

    def __init__(self, pevtype):
        self.pevtype = pevtype

Как я могу написать функцию, которая использует распределение вероятностей, чтобы определить, является ли автомобиль электромобилем или PHEV?

Например , функция setVehicle () включит:

>>> v1.pevtype = 'EV'
>>> v2.pevtype = 'PHEV'

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете использовать random.choices из стандартной библиотеки.

import random
values = ['EV', 'PHEV']
for _ in range(10):
    result = random.choices(values, weights=(0.3, 0.7))
    print(result[0], end=' ')

Пример вывода: PHEV EV PHEV PHEV PHEV PHEV PHEV PHEV EV EV


Дополнительная информация: вы не ограничивается только двумя вариантами, и вы можете получить несколько результатов.

import random
values = ['A', 'B', 'C']
for _ in range(10):
    result = random.choices(values, weights=(1, 4, 10), k=2)
    print(result)

Пример вывода:

['B', 'C']
['B', 'C']
['C', 'C']
['C', 'C']
['C', 'B']
['C', 'B']
['B', 'C']
['C', 'C']
['C', 'C']
['B', 'C']

Это возможная реализация, включая код из вопроса. Здесь я предполагаю, что типы pev и их вероятность фиксированы в коде, поэтому я сделал их атрибутом класса Vehicle. При необходимости это можно изменить. Обратите внимание, что распределения являются относительными и не должны составлять в точности 1.0.

import random

class Vehicle:
    pev_types = {'EV': 0.3, 'PHEV': 0.7, 'X': 0.2}

    def __init__(self):
        self.pev_type = self._get_random_pev_type()

    def __str__(self):
        return f'Vehicle (pev type:{self.pev_type})'

    def _get_random_pev_type(self):
        return random.choices(list(self.pev_types), weights=self.pev_types.values())[0]

print(', '.join(str(Vehicle()) for _ in range(10)))

Пример вывода:

Vehicle (EV), Vehicle (EV), Vehicle (X), Vehicle (PHEV), Vehicle (PHEV), Vehicle (X), Vehicle (PHEV), Vehicle (PHEV), Vehicle (PHEV), Vehicle (PHEV)
0 голосов
/ 05 мая 2020

Вы можете использовать numpy.random.choice. Требуется список элементов, из которых вы хотите выбрать, и вы также можете передать ему вероятность, связанную с каждым элементом. В следующем примере я сохранил информацию в dict, где keys - это элементы, из которых вы хотите выбрать, а values - соответствующие вероятности:

import numpy as np


class Vehicle:
    def __init__(self, pevtypes):
        self.pevtype = np.random.choice(
            list(pevtypes), p=list(pevtypes.values())
        )

car_types = {'EV': 0.3, 'PHEV': 0.7}

# for a single car
car = Vehicle(car_types)

print(car.pevtype)

# for 2 or more cars e.g. like this
cars = [Vehicle(car_types) for _ in range(3)]
...