Как получить равномерное распределение по взвешенной вероятности в Python в наборе данных? - PullRequest
2 голосов
/ 29 сентября 2019

Я уже видел этот вопрос , и я знаю numpy.random.choice, но мой вопрос немного отличается.

Учитывая, что у меня есть набор данных, как показано ниже:

dict ={"Number of polyps":[10,8,3,1,2,6,13],
        "Right ":[3,2,3,1,0,3,3],
        "Left":[2,2,4,15,6,7,1] }

dt = pd.DataFrame(dict)

Итак, это:

Number of polyps  Right   Left
            10       3     2
             8       2     2
             3       3     4
             1       1    15
             2       0     6
             6       3     7
            13       3     1

Мне нужно заполнить столбцы Right и Left на следующие требования

  1. Сумма Right и Left равно Number of polyps
  2. Значения Right и Left получены из взвешенной вероятности их текущего значения

Например,для данной строки, как показано ниже:

Number of polyps  Right   Left
            10       3     2

, поэтому для этой строки она может быть такой, как показано ниже. Здесь 0.6= 3/(3+2) и 0.4= 2/(3+2):

nr = np.random.choice(["Right","Left"],size=10, replace=True,p=[0.6,0.4])
rightCount = list.count('Right')
leftCount = list.count('Left')
print(rightCount)
print(leftCount)

После обновления этот ряд будет:

Number of polyps  Right   Left
            10       3     7

Проблема в том, что я должен сделать это для всехстроки в наборе данных, но я не уверен, как это сделать!

1 Ответ

5 голосов
/ 29 сентября 2019

Вы, по сути, рисуете из биномиального распределения . Он реализован в NumPy как numpy.random.binomial:

>>> dt["Right"] = np.random.binomial(dt["Number of polyps"], dt["Right"]/(dt["Right"]+dt["Left"]))
>>> dt["Left"] = dt["Number of polyps"] - dt["Right"]

Здесь для каждой строки мы выполняем dt["Number of polyps"] испытаний с бинарным выбором, причем каждое испытание выбирает Right с вероятностью dt["Right"]/(dt["Right"]+dt["Left"]) и Left в противном случае.

...