Байесовский вывод

У меня есть инструмент, который либо пройдет, либо пропустит серию из трех тестов. Инструмент должен пройти все три теста, которые считаются успешными. Как я могу использовать байесовский вывод, чтобы посмотреть на вероятность прохождения каждого случая на основе доказательств? (на основе инструмента, передающего каждый прошлый тест по очереди).

Глядя на первый тест, я знаю это из исторических записей инструментальных тестов. Вы также можете видеть, что каждый тест имеет границу приема от -3% до + 3%: enter image description here

Мои предположения:

  • Вероятности зависят друг от друга - мы смотрим на один и тот же инструмент на все три теста

  • Из этих исторических данных я вижу, что вероятность прохождения теста A равна P (A) = 0,84, поэтому неудача равна P ('A) = 0,16

  • Не зная ничего о приборе, хорошим предположением было бы равноценность вероятности прохождения и провала первого теста. Гипотезы (H) заключаются в том, что инструмент прошел P (H) = 0,5; это также дает нам неудачную вероятность P ('H) = 0,5.

Из моего понимания мне нужно найти P (H), учитывая данные (D), в байесовских терминах - я бы тогда обновил P (H), учитывая результаты теста A -

**P(H|D) = P(H) P(D|H) / P(D)**   Where:

**P(D) = P(D|H)*P(H)  + P(D|’H) P(‘H)**

Вот где я заблудился, думаю, это правильно:

P(H)    = P('H) = 0.5  // prob of passing/failing test-A without any information  

P(D|H)  = 0.84          // prob of passing test-A from historical records

P('D|H) = 0.16         // prob of failing test-A from historical records

P(D) = P(D|H)*P(H) + P(D|’H) P(‘H) = 0.84*0.5 + 0.16*0.5
P(D) = 0.5

Давая байесовское значение: P (H | D) = P (H) P (D | H)/P (D) = 0,5 * 0,84/0,5, P (H | D) = 0,84, что является моим новым обновленным значением для P (H) в тесте-B?


Из интереса все три теста выглядят одинаково: enter image description here

Ответ 1

Итак, здесь нужно учесть пару вещей. сначала Вы правы, что априорные вероятности использования -.5 и .5 соответственно, потому что это то, как мы математически кодируем не зная, что происходит, но вы показываете три графика независимо друг от друга и записывая уравнения Байеса только с одной размерностью и нарушающие ваше предположение о зависимости. Также нет необходимости использовать ваш маргинальный P (D) в этой настройке, чтобы перейти к условным вероятностям, о которых вы спрашиваете.

То, чем вы на самом деле являетесь, является условной вероятностью того, что инструмент пройдет тест C, как он сделал на тесте A и /B > /p >

Если вы только сделали тест A, то Байес говорит:

P (C | A) = P (A | C) P (C)/P (A) или P (B | A) = P (A | B) P (B)/P (A)

Где A, B и C могут иметь значения pass или fail.

Если вы выполнили тесты A и B, то вы хотите узнать вероятность прохождения теста C, о котором говорит Байес:

P (C | A, B) = P (A, B | C) P (C)/P (A, B)

Что выглядит намного сложнее, но дело в том, что вам действительно не нужно делать байесовский вывод, чтобы получить условные вероятности, о которых вы просите:

Какова моя вероятность прохождения следующего теста, учитывая, что я уже прошел или не прошел этот тест?

У вас есть вся информация, необходимая для непосредственного вычисления. Как правило, байесовский вывод используется, когда у них нет такой роскоши.

Чтобы ответить на вопрос о том, как рассчитать вероятности прохождения будущего теста на основе того, прошел ли он уже один или несколько тестов, подумайте о том, какие значения вы хотите знать.

"Учитывая, что инструмент прошел (или не прошел) тест 1, какова вероятность того, что он пройдет тест 2 и проверит 3"

С вашими историческими данными вы можете напрямую ответить на этот вопрос.

В вашем вопросе говорится, что вы заботитесь о вероятности прохождения/сбоя, поэтому для каждого теста есть два возможных результата, означающих, что у вас действительно есть только 8 состояний для каждого набора тестов прибора

(Количество результатов TestA) * (Количество результатов TestB) * (Количество результатов TestC) = 2 * 2 * 2 = 8

Для вычисления вероятностей, которые вы хотите, рассмотрите 3D-матрицу, которую мы будем называть ProbabilityHistogram с ячейкой для каждого результата. Таким образом, матрица равна 2 * 2 * 2. Где матрица индексируется по тому, прошло или нет тест исторически. Мы собираемся использовать эту матрицу для построения гистограммы исторических данных о прохождении/сбое, а затем ссылаться на эту гистограмму для построения ваших вероятностей, представляющих интерес для кода ниже.

В нашем подходе количество раз, которое ранее тестировал любой инструмент, прошедший тест A, неудачный тест B и пройденный тест C, можно найти в ProbabilityHistogram [1,0,1], причем все три будут найдены в ProbabilityHistogram [ 1,1,1], сбой всех трех вероятностных гистограмм [0,0,0] и т.д.

Вот как вычислить нужные значения

Настройка необходимой гистограммы

  • Начнем с определения матрицы 2 * 2 * 2 для хранения данных гистограммы.
  • чтение ваших исторических данных
  • Для каждого исторического теста, который у вас есть в вашем наборе данных, обновите ProbabilityHistogram с помощью кода UpdateProbHisto ниже

Рассчитайте интересующие вероятности:

  • Вычислить условные вероятности после одного теста с использованием CProb_BCgA ниже
  • Вычислить условные вероятности после двух тестов с использованием CProb_CgAB ниже

Код: (Извините, что на С#, потому что у меня ограниченный опыт работы на Python, если у вас есть вопросы, просто оставляйте комментарий, и я объясню далее)

Настройка 3D-матрицы

//Define Probability Histogram
        double[, ,] ProbHisto = new double[2, 2, 2];// [A Test Outcome, B Test Outcome, C Test Outcome]

Обновить гистограмму

//Update Histogram based on historical data. 
        //pass in how the instrument did on each test as one dataset
        void updateProbHisto(bool APassed, bool BPassed, bool CPassed) {
            ProbHisto[Convert.ToInt16(APassed), Convert.ToInt16(BPassed), Convert.ToInt16(CPassed)]++;
        }

Вычислить вероятности после одного теста

//calculate the conditional probability that test B and test C will Pass given A test reult
        double[] CProb_BCgA(bool ATestResult) {
            //Calculate probability of test B and test C success looking only at tests that passed or failed the same way  this instrument did given the A test result
        double[] rvalue = {0.0,0.0};//P(B|A), P(C|A)
            double BPassesGivenA = ProbHisto[Convert.ToInt16(ATestResult),1,0] + ProbHisto[Convert.ToInt16(ATestResult),1,1];
            double CPassesGivenA = ProbHisto[Convert.ToInt16(ATestResult),1,1] + ProbHisto[Convert.ToInt16(ATestResult),0,1];
            rvalue[0] = BPassesGivenA /(BPassesGivenA+ProbHisto[Convert.ToInt16(ATestResult),0,0] + ProbHisto[Convert.ToInt16(ATestResult),0,1]); // BPasses over BPasses + BFailures
            rvalue[1] = CPassesGivenA /(CPassesGivenA+ProbHisto[Convert.ToInt16(ATestResult),0,0] + ProbHisto[Convert.ToInt16(ATestResult),1,0]);// CPasses over CPasses + CFailures
            return rvalue;
        }

Вычислить вероятности после двух тестов

//Calculate the conditional probability that test C will pass looking only at tests that passed or failed the same way this instrument did given the A and B test results
        double CProb_CgAB(bool ATestResult, bool BTestResult)
        {
            //Calculate probability of test C success given A and B test results
            double rvalue = 0.0;// P(C|A,B)
            double CPassesGivenAB = ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),1];
            rvalue= CPassesGivenAB /(CPassesGivenAB + ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),0]);// CPasses over CPasses + CFailures
            return rvalue;
        }

Коды условной вероятности устанавливаются в предположении, что вы выполняете тест A, а затем тестируете B, а затем проверяете C (BCgA = вероятность прохождения B и C, передавая данный результат теста A), но в результатах теста прямо нет sub для B или C ins протектора результата для A, который просто имеет в виду, какой индекс вы помещаете в данные тестового прохода/сбоя.

Ответ 2

Как говорят слова с запятой и канальная лента, я тоже не думаю, что вам нужно P (H) вообще ответить на вопрос. Чтобы ответить на то, что P (C | A), то есть вероятность прохождения теста C дана, чтобы вы проходили тест, все, что вам нужно, это P (A и C) и P (A), которые, как представляется, уже доступны вам. То же самое происходит с P (B | A).

Вот фрагмент питона, который показывает это в действии. Предположим, что структурный эксперимент представляет собой список тестов, где каждый тест представляет собой список из трех чисел, соответствующих результату (1 для прохода, 0 для отказа) теста A, теста B и теста C соответственно.

def prob_yx(y, x, exp):
    "P(y|x). Data is the past experimental runs"

    # P (X & Y)
    c_xy = filter(lambda _: _[x] & _[y], exp)
    # P (Y)
    c_x = filter(lambda _: _[x], exp)

    return len(c_xy) / float(len(c_x))


experiment = [
    [0, 0, 1],
    [1, 1, 1],
    [1, 0, 0],
    [1, 1, 1],
    [1, 1, 0]
]

A = 0
B = 1
C = 2

# B given A
print prob_yx(B, A, experiment)
# C given A
print prob_yx(C, A, experiment)
# C given B
print prob_yx(C, B, experiment)

Это дает

0.75
0.5
0.666666666667

Надеюсь, что это будет полезно.