Создание диаграммы Венна с несколькими критериями - PullRequest
1 голос
/ 02 апреля 2020

Спасибо, что прочитали мой вопрос. Я полностью новичок для python, а английский sh не является моим основным языком. Пожалуйста, спросите, не понимаете ли вы мой английский sh. Спасибо за вашу помощь.

Вот вопрос. Я хочу создать диаграмму Венна, используя эти критерии:

  1. 10 * P (B) = P (A)
  2. P (C и notA) = 13 * P ( B а не C и не A)
  3. P (B и C и notA) = 5 * P (B и C и A)
  4. P (B и C) = 0,18
  5. P (B или C и notA) = 0,07
  6. P (не C) = 0,922 -> P (C) = 0,078
  7. P (B и A) = 0,01

Я пытался использовать 'random', но я думаю, что это довольно глупо. Это мой код, но если у вас есть лучшее решение, пожалуйста, скажите мне.

  • oa означает только A, то есть (A и notB, а не C)
  • abn c: означает A и B Нет C
import random
# a = lowgrade fever
# b = headace
# c = Muscle ache
def haha():
    oa = random.random()
    ob = random.random()
    oc = random.random()

    abnc = random.random()
    acnb = random.random()
    bcna = random.random()

    abc = random.random()

    a = oa + abnc + acnb + abc
    b = ob + abnc + bcna + abc
    c = oc + acnb + bcna + abc

    ab = abnc + abc
    ac = acnb + abc
    bc = bcna + abc

    # oa + ob + oc + abnc + acnb+ bcna + abc = 1

    if (10 * b == a):
        c1 = True
    if ((oc + bcna) == 13 * ob):
        c2 = True
    if ((ob + bcna + oc) == 5*abc):
        c3 = True
    if ((bcna + abc) == 0.018):
        c4 = True
    if(ob + bcna + oc == 0.07):
        c5 = True
    if(1 - oc + bcna + abc + acnb == 0.922):
        c6 = True
    if(abnc + abc == 0.01):
        c7 = True

    if (c1 and c2 and c3 and c4 and c5 and c6 and c7):
        allc = True

    if allc:
        print(oa)
        print(ob)
        print(oc)
        print(bcna)
        print(acnb)
        print(abnc)
        print(abc)

    return allc

haha()
while (allc == False):
    haha()

Спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Для удобства я буду использовать следующие сокращенные обозначения:

  • [1--] обозначает P (A),
  • [0--] обозначает P (не A),
  • [0-1] обозначает P (не A и C),
  • [110] обозначает P (A и B и не C),

et c. Используя эту нотацию, вашу формулировку проблемы можно переписать следующим образом:

1) 10*[-1-] = [1--]
2) [0-1] = 13*[010]
3) [011] = 5*[111]
4) [-11] = 0.18
5) [-1-] + [001] = 0.07
6) [--1] = 0.078
7) [11-] = 0.01

Давайте теперь попробуем решить ее вручную:

Rewrite 4)
  [011] + [111] = 0.18

Substitute 3 into 4)
  5*[111] + [111] = 0.18
  [111] = 0.03

Rewrite 7) and substitute [111]=0.03
  [110] + [111] = 0.01
  [110] = -0.02

Вероятность не может быть отрицательной, поэтому мы можем на этом остановиться. и сделайте вывод, что нет вероятностного c решения вашей проблемы.

Полученный результат также можно объяснить следующим образом:

  • P (AB C) ≤ P ( AB) = 0,01
  • P (~ AB C) = 5 * P (AB C) ≤ 0,05
  • Следовательно, P (B C) = P (AB C) + P (~ AB C) ≤ 0,01 + 0,05 = 0,06
  • Это противоречит условию 4.
0 голосов
/ 02 апреля 2020

Вы ищете 8 различных вероятностей. Где ~ A означает не A. Эти вероятности неизвестны для нашей задачи.

P( A &  B &  C) [1]
P( A &  B & ~C) [2]
P( A & ~B &  C) [3]
P( A & ~B & ~C) [4]
P(~A &  B &  C) [5]
P(~A & ~B &  C) [6]
P(~A & ~B & ~C) [7]
P(~A &  B & ~C) [8]

Первый шаг - записать ваши уравнения в переменных, написанных выше. Мы будем использовать [1] в качестве сокращения для P(A & B & C)

<=> 10P(B) - P(A)=0
<=> 10*([1] + [2] + [5] + [8]) - 1*(([1] + [2] + [3] + [4]) = 0
<=> 9*[1] + 9*[2] + -1*[3]-1*[4] + 10*[5] + 0*[6] + 0*[7] + 10*[8] = 0

Мы можем сделать это для всех 7 уравнений. В линейной алгебре это записывается как система Ax = b. Возможно, вы помните, что вам нужно 8 уравнений, если у вас есть 8 неизвестных переменных. Чтобы получить полное решение, вы должны найти дополнительное уравнение. (Подсказка: какова сумма всех вероятностей?)

Для решения упражнения в python можно использовать следующий код.

import numpy as np

A = np.array([
   [9, 9, -1, -1, 10, 0, 0, 10],  # 10P(B) = P(A)
   ...                            # Insert 7 more equations here
])

b = np.array([0, ....])           # Insert 7 more numbers here

x = np.linalg.solve(A,b)

print(x)
...