<p>如果您想收集一名患者的“是”和“否”,因为他们回答是否有症状。并对每种疾病进行计数,您可以像这样循环查看疾病/症状词典(<code>symptom_dict</code>)</p>
<pre><code>>>> 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
...
</code></pre>
<p>您可以使用一个函数来创建可能患有疾病的患者,并将随机疾病分配给他的“可能性”属性</p>
<pre><code>>>> def get_patient():
... return { 'likelihood': random.choice(symptom_dict['possibles']) }
...
</code></pre>
<p>为了对场景进行建模和测试,我们可以使用一个简单的函数来回答像患者这样的问题:</p>
<pre><code>>>> 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
...
</code></pre>
<p>在<code>ask()</code>函数中,答案是加权的,因此当患者被问及与他可能患有的疾病相关的症状时,他更有可能对每个症状回答是。当被问及一种他没有的疾病的症状时,他更可能回答“不”</p>
<p>我将您的疾病/症状数据重新组织到字典中,以便于访问和组织:</p>
<pre><code>>>> 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']}
</code></pre>
<p>运行后,我们得到如下输出:</p>
<pre><code>>>> 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 >>
</code></pre>
<p>在所有的问题之后,我们有一份每种疾病的记录。根据这些计数,你可能会给他们一些概率分数或每种疾病的分数:</p>
<pre><code>>>> 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}}
</code></pre>
<p>把它放在一起作为一个简单的例子,它可能是你可以使用的东西</p>