2013-11-09 5 views
0

Я хочу создать образец из 3 вариантов из данного словаря. Длина словаря может быть переменной.Создал образец из взвешенного случайного выбора

Что я сделал в предыдущем коде, это создать словарь весовых значений, в данном случае 12 значений и ключей.

Невозможно получить образец из моего random.choice.

Использование Python 3

Мой словарь

dictionary = {'Three': 14.4, 'Five': 11.2, 'Two': 14.4, 'Thirteen': 3.3, 'One': 17.6, 'Seven': 3.3, 'Nine': 3.3, 'Ten': 3.3, 'Twelve': 3.3, 'Eight': 3.3, 'Four': 12.0, 'Six': 10.4} 

Я стараюсь, чтобы получить образец 3 формы случайного выбора словаря.

my_sample = random.sample(random.choice(dictionary), 3) 
print(my_sample) 

Но эта ошибка

Traceback (most recent call last): 
    File "c_weights.py", line 38, in <module> 
    my_sample = random.sample(random.choice(dictionary), 3) 
    File "/usr/lib64/python3.3/random.py", line 252, in choice 
    return seq[i] 
KeyError: 11 

Попытка получить

My_sample = ('One', 'Четыре', 'Двенадцать'), например.

Редактировать: Просто, чтобы быть ясным, к чему я работаю.

('One', 'Four','Twelve') 
('Two', 'One','Six') 
('Four', 'Two','Five') 
('One', 'Eight','Two') 
('Thirteen', 'Three','Six') 

Так уникальные наборы, построенные по взвешенной вероятности из в словаре (или кортеж, если это лучше)

+1

я не получаю взвешенную часть этого. Вы хотите, чтобы «Три» были частью образца гораздо чаще, чем «Тринадцать»? Ни 'random.sample', ни' random.choice' не сделают этого, но это то, что люди обычно после того, как говорят «взвешенный случайный выбор». – DSM

+0

Я не вижу логики вашей взвешенной случайности. Есть и другие способы сделать это. [Здесь] (http://stackoverflow.com/questions/19871608/generating-weighted-random-numbers) является одним из способов с numpy. Я лично использую [этот путь] (http://stackoverflow.com/a/14992686/377366). – KobeJohn

+0

@ DSM Да, я хочу, чтобы «Один» был вырван из sampl пропорционально больше, чем «Тринадцать» байтов, которые я предоставил. – sayth

ответ

1

Хорошо, это, вероятно, полно ошибок/статистической ошибки, но это отправная точка для вас, и у меня нет больше времени. Это также очень неэффективно! Это уже было сказано, я надеюсь, что это помогает:

import random 

d= {'Three': 14.4, 'Five': 11.2, 'Two': 14.4, 'Thirteen': 3.3, 'One': 17.6, 'Seven': 3.3, 'Nine': 3.3, 'Ten': 3.3, 'Twelve': 3.3, 'Eight': 3.3, 'Four': 12.0, 'Six': 10.4} 
total_weight = sum(d.values()) 
n_items = 3 
random_sample = list() 
d_mod = dict(d) 

for i in range(n_items): 
    random_cumulative_weight = random.uniform(0, total_weight) 
    this_sum = 0.0 
    for item, weight in d_mod.items(): 
     this_sum += weight 
     if this_sum >= random_cumulative_weight: 
      random_sample.append(item) 
      break 
    del(d_mod[item]) 
    total_weight -= this_sum 

random_sample 

дает [ «Семь», «Девять», «Два»] и т.д.

2

Вы не можете успешно применять random.choice() к словарю - это функция для последовательностей, не для отображений.

Try:

random.sample(dictionary, 3) 

Это возвращает список, содержащий 3 случайные ключи от Dict.

+0

Но будут ли они использовать весы, которые я включил в вытягивание образца? – sayth

+1

@sayth, конечно нет. См. Другие комментарии по вашему вопросу относительно подходов к этому. Но остается неясным, что вы хотите сделать.Образец размера * один * из взвешенной совокупности имеет смысл. Но вы пытаетесь «random.sample()' вообще подразумевать, что вам не нужны дубликаты, а затем ясно, как грязь, что вы хотите для выборки размером 3 из взвешенной совокупности. –

+0

Да Мне нужно, чтобы наборы были уникальными. Поскольку я хочу, чтобы несколько наборов возвратов из одного и того же образца были уникальными, но отражали взвешенную вероятность. – sayth

Смежные вопросы