Если вы хотите собрать «да» и «нет» для одного пациента, они ответят, есть ли у них симптом или нет. И ведите учет по каждому заболеванию, вы можете l oop по словарю / симптому болезни (symptom_dict
) вот так.
>>> def interview_patient(patient):
... for disease in symptom_dict['possibles']:
... try:
... for symptom in symptom_dict[disease]:
... # answer will be either "yes" or "no".
... answer = ask(patient, disease, symptom)
... try:
... # The patient dict has keys for "yes" and "no".
... patient[disease][answer] += 1
... patient[disease]['total'] += 1
... except KeyError:
... # If the patient didn't have "yes" and "no" keys,
... # create them.
... patient[disease] = {'yes': 0, 'no': 0, 'total': 1}
... patient[disease][answer] += 1
... except KeyError as ke:
... print(f"There was an error accessing a symptom_dict key: {ke}")
... return patient
...
У вас может быть функция для создания пациента, у которого может быть заболевание и назначить случайное заболевание его свойству «правдоподобия».
>>> def get_patient():
... return { 'likelihood': random.choice(symptom_dict['possibles']) }
...
Чтобы смоделировать сценарий и провести тестирование, мы могли бы иметь простую функцию, которая отвечает на такие вопросы, как пациент:
>>> def ask(patient, disease ,symptom):
... if patient['likelihood'] == disease:
... answer = random.choices(['yes', 'no'], [25, 5])[0]
... else:
... answer = random.choices(['yes', 'no'], [5, 25])[0]
... print('have you experienced %-35s %s' % (symptom, answer))
... return answer
...
В функции ask()
ответы взвешиваются, поэтому, когда пациента спрашивают о симптомах, связанных с заболеванием, которое он, вероятно, имеет, он с большей вероятностью отвечает да на каждый симптом. Когда его спросят о симптомах заболевания, которого у него нет, он с большей вероятностью ответит «нет».
Я реорганизовал ваши данные о заболевании / симптомах в словарь для облегчения доступа и организации:
>>> symptom_dict = {'possibles': ['InfluenzaA', 'InfluenzaB', 'InfluenzaC', 'CommonCold', 'Pneumonia', 'StrepThroat', 'b', 'n', 'Croup', 'EnterovirusD68', 'h', 'Herpangina', 'PinkEye', 'Pertussis'], 'InfluenzaA': ['Cough', 'Runny noseStuffy nose', 'Sneezing', 'Sorethroat', 'Fever', 'Headache', 'Bodychills', 'Fatigue', 'Body aches'], 'CommonCold': ['Cough', 'Runny nose', 'Stuffy nose', 'Congestion', 'Sneezing', 'Sore throat', 'Fever', 'Headache', 'Malaise'], 'InfluenzaB': ['Cough', 'Stuffy nose', 'Sore throat', 'Fever', 'Headache', 'Body chills', 'Fatigue', 'Muscle aches', 'Nausea', 'Vomiting'], 'InfluenzaC': ['Cough', 'Rhinorrhea', 'Fever', 'Headache', 'Muscle pain'], 'Pneumonia': ['Cough', 'Chest pain', 'Fever', 'Fatigue', 'Loss of appetite', 'Body pain', 'Shortness of breath', 'Fast heartbeat'], 'StrepThroat': ['Fever', 'Headache', 'Throat pain', 'Loss of appetite', 'Nausea', 'Vomiting', 'White dots', 'Red dots', 'Inability or diffuculty swallowing'], 'Bronchiolitis': ['Cough', 'Runny nose', 'Stuffy nose', 'Fever', 'Shortness of breath', 'Wheezing', 'Ear pain', 'Loss of fluids'], 'Norovirus': ['Fever', 'Abdominal pain', 'Malaise', 'Muscle pain', 'Diarrhea', 'Nausea', 'Vomiting'], 'Croup': ['Cough', 'Runny nose', 'Stuffy nose', 'Shortness of breath', 'Wheezing', 'Sore throat', 'Fever', 'Throat pain', 'Fatigue'], 'EnterovirusD68': ['Cough', 'Runny nose', 'Stuffy nose', 'Sneezing', 'Wheezing', 'Fever', 'Body aches'], 'HandFootandMouthDisease': ['Sore throat', 'Fever', 'Headache', 'Fatigue', 'Rash', 'Drooling'], 'Herpangina': ['Sore throat', 'Fever', 'Headache', 'Fatigue', 'Loss of appetite', 'Inabilty or diffuculty swallowing', 'Mouth blisters or ulcers', 'Drooling', 'Vomiting'], 'PinkEye': ['Red eye', 'Eye discharge', 'Blurred vision', 'Light sensitivity'], 'Pertussis': ['Cough', 'Runny nose', 'Stuffy nose', 'Fever', 'Fatigue', 'Vomiting', 'Mucus in the throat']}
Проведя пробежку, мы получим вывод, подобный следующему:
>>> patient = get_patient()
>>>
>>> interview_patient(patient)
have you experienced Cough no
have you experienced Runny noseStuffy nose yes
have you experienced Sneezing yes
have you experienced Sorethroat yes
have you experienced Fever no
have you experienced Headache yes
have you experienced Bodychills yes
have you experienced Fatigue yes
have you experienced Body aches no
have you experienced Cough yes
<< list continues on and on >>
И после всех вопросов у нас есть история пациентов с подсчетами по каждой болезни. Основываясь на этих показателях, вы могли бы дать им оценку вероятности или что-то для каждой болезни:
>>> patient
{'likelihood': 'StrepThroat',
'InfluenzaA': {'yes': 4, 'no': 14, 'total': 18},
'InfluenzaB': {'yes': 4, 'no': 16, 'total': 20},
'InfluenzaC': {'yes': 1, 'no': 9, 'total': 10},
'CommonCold': {'yes': 2, 'no': 16, 'total': 18},
'Pneumonia': {'yes': 1, 'no': 15, 'total': 16},
'StrepThroat': {'yes': 17, 'no': 1, 'total': 18},
'Croup': {'yes': 5, 'no': 13, 'total': 18},
'EnterovirusD68': {'yes': 2, 'no': 12, 'total': 14},
'Herpangina': {'yes': 2, 'no': 16, 'total': 18},
'PinkEye': {'yes': 1, 'no': 7, 'total': 8},
'Pertussis': {'yes': 3, 'no': 11, 'total': 14}}
Приведите это воедино просто в качестве быстрого примера, это может быть то, что вы могли бы использовать.