Как представить несколько уровней комбинаций? - PullRequest
0 голосов
/ 14 января 2019

Книга Введение в вероятность Блицштейна и Хванга приводит пример комбинаций с использованием мороженого.

  • Первый уровень - конус: Вафля или Торт
  • Второй уровень - аромат: шоколад , ваниль или клубника

Основной пример: 2 * 3 = 6 отдельный выбор.

Я могу представить каждый уровень выбора отдельно:

from sympy.functions.combinatorial.numbers import nC
from sympy.utilities.iterables import combinations, combinations_with_replacement

cones = combinations('CW', 1)
list(cones)
>>> [('C',), ('W',)]

flavours = combinations('cvs', 1)
list(flavours)
>>> [('c',), ('v',), ('s',)]

# how to get a list representing all choices? (Cc, Cv, Cs, Wc, Wv, Ws)

# how to return a count of the choices, e.g. with nC()?

Мне было интересно, можно ли объединить уровни с sympy и вернуть список каждой комбинации и количество доступных комбинаций?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

То, что вы делаете, это набор умножения . например, {A, B} * {1,2} -> {{A, 1}, {A, 2}, {B, 1}, {B, 2}). В Python вы делаете это с itertools.product:

from itertools import product

allChoices = set(product(set('CW'), set('csv')))
allChoicesPretty = set(a+b for a, b in allChoices)
numberOfChoices = len(allChoices)

print(allChoices)
print(allChoicesPretty)
print(numberOfChoices)

Выход:

{('C', 'v'), ('W', 's'), ('W', 'c'), ('C', 'c'), ('C', 's'), ('W', 'v')}
{'Wv', 'Ws', 'Cs', 'Wc', 'Cc', 'Cv'}
6

На самом деле вам вообще не нужен sympy, более того, cartes на самом деле является псевдонимом iterable.product [1]

Комментарии

В set каждый элемент встречается только один раз, а в set порядок отсутствует. Если вам нужен один из них или оба, замените set на list и {} на []. Это может иметь значение, например, для вероятности, когда вы берете предмет из сумки и кладете его обратно. Но операции на множествах быстрее. Один и тот же способ получить несколько раз «одно и то же событие» при использовании наборов - добавить тег, например число, например, A, A, A -> A1, A2, A3. Это очень практично, если думать так, потому что обычно проще думать о событиях (или вычислять вероятности) с помощью тегов, а затем удалять теги (эквивалентно тому, чтобы сказать «порядок не имеет значения»), когда мы делаем вероятности.

Это также связано с тем, что в математике мы можем выразить (интерпретировать, построить) все в теории множеств [2], которая на самом деле нуждается в нескольких дедуктивных элементах теории доказательств [4]; это способ построить основы математики (ZFC: = Выбор Цермело Френкеля). Все математическое доказательство происходит внутри ZFC, но оно почти никогда не упоминается в доказательстве.

Существуют и другие способы интерпретации всей математики, такие как теория категорий [3], которая тесно связана с вычислением языков. Третье возможное основание, которое я знаю, - это теория гомотопического типа [5,6], с помощью которой на сегодняшний день мы можем делать меньше вещей, потому что поле очень новое, но то, что мы можем сделать, не является естественным и невероятным интересно концептуально.

[1] https://github.com/sympy/sympy/blob/da9fdef5e00f40dfd500bfa356c61ce6bad1b559/sympy/utilities/iterables.py#L6

[2] https://en.wikipedia.org/wiki/Set_theory

[3] https://en.wikipedia.org/wiki/Category_theory

[4] https://en.wikipedia.org/wiki/Proof_theory

[5] https://en.wikipedia.org/wiki/Homotopy_type_theory

[6] https://homotopytypetheory.org/book/

0 голосов
/ 25 января 2019

Что вам нужно, это cartes

from sympy.utilities.iterables import cartes

print list(cartes('CW', 'csv'))
# >>> [('C', 'c'), ('C', 's'), ('C', 'v'), ('W', 'c'), ('W', 's'), ('W', 'v')]

print [''.join(x) for x in list(cartes('CW', 'csv'))]
# >>> ['Cc', 'Cs', 'Cv', 'Wc', 'Ws', 'Wv']

print len(list(cartes('CW', 'csv')))
# >>> 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...