LAB PROGRAM 8
Construct aBayesian network considering medical data. Use this model to demonstrate the diagnosis
of heart patients using standard Heart Disease Data Set.
import bayespy as bp
import numpy as np
import csv
from colorama import init
from colorama import Fore, Back, Style
init()
# Define Parameter Enum values
#Age
ageEnum = {'SuperSeniorCitizen':0, 'SeniorCitizen':1, 'MiddleAged':2, 'Youth':3, 'Teen':4}
# Gender
genderEnum = {'Male':0, 'Female':1}
# FamilyHistory
familyHistoryEnum = {'Yes':0, 'No':1}
# Diet(Calorie Intake)
dietEnum = {'High':0, 'Medium':1, 'Low':2}
# LifeStyle
lifeStyleEnum = {'Athlete':0, 'Active':1, 'Moderate':2, 'Sedetary':3}
# Cholesterol
cholesterolEnum = {'High':0, 'BorderLine':1, 'Normal':2}
# HeartDisease
heartDiseaseEnum = {'Yes':0, 'No':1}
#heart_disease_data.csv
with open('heart_disease_data.csv') as csvfile:
lines = [Link](csvfile)
dataset = list(lines)
data = []
for x in dataset:
[Link]([ageEnum[x[0]],genderEnum[x[1]],familyHistoryEnum[x[2]],dietEnum[x[3]],lifeStyleEnu
m[x[4]],cholesterolEnum[x[5]],heartDiseaseEnum[x[6]]])
# Training data for machine learning todo: should import from csv
data = [Link](data)
N = len(data)
# Input data column assignment
p_age = [Link](1.0*[Link](5))
age = [Link](p_age, plates=(N,))
[Link](data[:,0])
p_gender = [Link](1.0*[Link](2))
gender = [Link](p_gender, plates=(N,))
[Link](data[:,1])
p_familyhistory = [Link](1.0*[Link](2))
familyhistory = [Link](p_familyhistory, plates=(N,))
[Link](data[:,2])
p_diet = [Link](1.0*[Link](3))
diet = [Link](p_diet, plates=(N,))
[Link](data[:,3])
p_lifestyle = [Link](1.0*[Link](4))
lifestyle = [Link](p_lifestyle, plates=(N,))
[Link](data[:,4])
p_cholesterol = [Link](1.0*[Link](3))
cholesterol = [Link](p_cholesterol, plates=(N,))
[Link](data[:,5])
# Prepare nodes and establish edges
# [Link](2) -> HeartDisease has 2 options Yes/No
# plates(5, 2, 2, 3, 4, 3) -> corresponds to options present for domain values
p_heartdisease = [Link]([Link](2), plates=(5, 2, 2, 3, 4, 3))
heartdisease = [Link]([age, gender, familyhistory, diet, lifestyle, cholesterol],
[Link], p_heartdisease)
[Link](data[:,6])
p_heartdisease.update()
# Sample Test with hardcoded values
#print("Sample Probability")
#print("Probability(HeartDisease|Age=SuperSeniorCitizen, Gender=Female, FamilyHistory=Yes,
DietIntake=Medium, LifeStyle=Sedetary, Cholesterol=High)")
#print([Link]([ageEnum['SuperSeniorCitizen'], genderEnum['Female'],
familyHistoryEnum['Yes'], dietEnum['Medium'], lifeStyleEnum['Sedetary'], cholesterolEnum['High']],
[Link], p_heartdisease).get_moments()[0][heartDiseaseEnum['Yes']])
# Interactive Test
m=0
while m == 0:
print("\n")
res = [Link]([int(input('Enter Age: ' + str(ageEnum))), int(input('Enter Gender: ' +
str(genderEnum))), int(input('Enter FamilyHistory: ' + str(familyHistoryEnum))), int(input('Enter
dietEnum: ' + str(dietEnum))), int(input('Enter LifeStyle: ' + str(lifeStyleEnum))), int(input('Enter
Cholesterol: ' + str(cholesterolEnum)))], [Link],
p_heartdisease).get_moments()[0][heartDiseaseEnum['Yes']]
print("Probability(HeartDisease) = " + str(res))
#print(Style.RESET_ALL)
m = int(input("Enter for Continue:0, Exit :1 "))
INPUT: heart_disease_data.csv
SuperSeniorCitize Mediu
n Male Yes m Sedetary High Yes
SuperSeniorCitize Mediu
n Female Yes m Sedetary High Yes
Moderat BorderLin
SeniorCitizen Male No High e e Yes
Mediu
Teen Male Yes m Sedetary Normal No
Youth Female Yes High Athlete Normal No
Mediu
MiddleAged Male Yes m Active High Yes
Moderat
Teen Male Yes High e High Yes
SuperSeniorCitize Mediu
n Male Yes m Sedetary High Yes
Youth Female Yes High Athlete Normal No
SeniorCitizen Female No High Athlete Normal Yes
Mediu Moderat
Teen Female No m e High Yes
Mediu
Teen Male Yes m Sedetary Normal No
MiddleAged Female No High Athlete High No
Mediu
MiddleAged Male Yes m Active High Yes
BorderLin
Youth Female Yes High Athlete e No
SuperSeniorCitize
n Male Yes High Athlete Normal Yes
Mediu Moderat BorderLin
SeniorCitizen Female No m e e Yes
Mediu BorderLin
Youth Female Yes m Athlete e No
Mediu
Teen Male Yes m Sedetary Normal No