# Python代写 | CMPSC 448: Machine Learning. Homework 7.

这个作业是用Python完成贝叶斯网络相关的程序

CMPSC 448: Machine Learning. Homework 7.

Due: April 27

1. Instructions

• You cannot look at anyone else’s code.

• Fill in and upload hw7.py to gradescope.

• All code (except import statements) in hw7.py should be inside functions (importing homework1.py

should not cause code to execute).

• Code must have comments and any constants should be stored in a variable defined near the top of

your file.

• Read the instructions below carefully

• For most of the questions, we will not provide testing code. It is your responsibility to test your own

functions and make sure they run without throwing exceptions.

• Another reason for you to develop testing code is a very similar assignment will be given as the

take-home final.

2. Bayesian Networks

2.1. Numeric Stability. In this assignment, to avoid rounding issues, you will need to use Fraction

datatypes in python. Here is an example of their usage:

1 from fractions import Fraction as frac

2 half = frac (1 ,2)

If you choose not to use fraction datatypes, you might get a correct answer marked as incorrect due to

rounding issues.

1

2

2.2. Bayesian Network Parameters. The parameters of a Bayesian network will be passed to your code

through a parameter bn. It will be a class and its usage is described as follows: suppose the Bayesian network

has directed edges (a, b),(a, c),(b, d),(c, d). The parameters of this network are the conditional probabilities

P(a), P(b|a), P(c|a), P(d|b, c). The corresponding bn variable will be defined something like this:

1 import numpy as np

2 from fractions import Fraction as frac

3

4 class BayesNet1 :

5 def __init__ ( self , seed , k =10) :

6 prng = np . random . RandomState ( seed )

7 prob_a = frac ( prng . randint (1 , 2** k) , 2** k) # P(a =1)

8 prob_b = {(1 ,) : frac ( prng . randint (1 , 2** k) , 2** k) , # P(b =1 | a =1)

9 (0 ,) : frac ( prng . randint (1 , 2** k) , 2** k) # P(b =1 | a =0)

10 }

11 prob_c = {(1 ,) : frac ( prng . randint (1 , 2** k) , 2** k) , # P(c =1 | a =1)

12 (0 ,) : frac ( prng . randint (1 , 2** k) , 2** k) # P(c =1 | a =0)

13 }

14 prob_d = {

15 (0 , 0) : : frac ( prng . randint (1 , 2** k) , 2** k) , # P(d =1 | b =0 , c =0)

16 (0 , 1) : : frac ( prng . randint (1 , 2** k) , 2** k) , # P(d =1 | b =0 , c =1)

17 (1 , 0) : : frac ( prng . randint (1 , 2** k) , 2** k) , # P(d =1 | b =1 , c =0)

18 (1 , 1) : : frac ( prng . randint (1 , 2** k) , 2** k) , # P(d =1 | b =1 , c =1)

19 }

20

21 def a( value ): # returns P (a= value )

22 if value == 1:

23 return prob_a

24 else :

25 return 1- prob_a

26

27 def b( value , a): # returns P( b= value | a )

28 tmp = prob_b [(a ,) ]

29 if value == 1:

30 return tmp

31 else :

32 return 1- tmp

33

34 def c( value , a): # returns P( c= value | a )

35 tmp = prob_c [(a ,) ]

36 if value == 1:

37 return tmp

38 else :

39 return 1- tmp

40

41 def d( value , b ,c ): # returns P(d= value | b , c)

42 tmp = prob_d [(b ,c )]

43 if value == 1:

44 return tmp

45 else :

46 return 1- tmp

47

48

49 # example usage

50 bn = BayesNet1 ()

51 # get parameter p (a =1)

52 bn .a( value =1) # must call with arg names , bn .a (1) is incorrect

53 bn .a( value =0) # get parameter p(a =0)

54

3

55 bn .d( value =0 , b =1 , c =0) # get parameter P(d =0 | b =1 , c =0)

56

57 bd .a( value =1 , d =2) # throws error because P(a|d ) is not a parameter

If a parameter is not needed for a particular problem, using it may throw an exception. For example, for

the Bayesian network in the code above, P(a, b) can be computed without using the parameter P(d | b, c).

That is, after you write P(a, b) in terms of the network parameters and simplify, you will notice that P(d|b, c)

is not used at all. Thus our implementation of bn might not define the function bn.d(value, b, c). This

is used to test that you simplified the expression correctly.

2.3. Types of Questions. There will be two types of questions:

(1) Probability calculations: given network parameters, compute probabilities such as P(A = 1 | B =

0, C = 1).

(2) D-separation. The questions might ask you if A is conditionally independent of D given E. You will

write a function that returns result, pathverdict where result is the answer (are they conditionally

independent?) and pathverdict looks like:

[

((’a’, ’b’, ’d’), False)

((’a’, ’e’, ’d’), False)

]

each element in the list is a tuple. The first part of the tuple describes the path (e.g., a,e,d is an

undirected path from a to d) and the second part of the tuple tells us if that path is blocked or

not. Make sure pathverdict contains all of the appropriate undirected paths. A path cannot repeat

nodes (so a e a e d is not a path). You have to hard-code the appropriate paths, and results. In

other words, for d-separations questions, your functions should look like:

def question0():

parthverdict = [

((’a’, ’b’, ’d’), False)

((’a’, ’e’, ’d’), False)

]

result = False

return result, pathverdict

In this case, this answer indicates that the first path is not blocked and the second path is not

blocked.

4

Figure 1. Bayesian Network 1

Question 1 (5 pts). Fill in the function def question1Part1() that tells us if, in Figure 1, A ⊥⊥ D | G, B?

Your function should return result, pathverdict (see instructions on the previous page), where result is

the True/False answer to the question, and pathverdict is the set of all paths between A and D and their

status (blocked or not). This question will have a test that you can see.

Question 2 (5 pts). Fill in the function def question1Part2() that tells us if, in Figure 1, A ⊥⊥ G | D, F?

Your function should return result, pathverdict (see instructions on the previous page), where result is

the True/False answer to the question, and pathverdict is the set of all paths between A and G and their

status (blocked or not).

Question 3 (5 pts). Fill in the function def question1Part3() that tells us if, in Figure 1, A ⊥⊥ G | F?

Your function should return result, pathverdict (see instructions on the previous page), where result is

the True/False answer to the question, and pathverdict is the set of all paths between A and G and their

status (blocked or not).

Question 4 (5 pts). Fill in the function def question1Part4() that tells us if, in Figure 1, A ⊥⊥ G | B?

Your function should return result, pathverdict (see instructions on the previous page), where result is

the True/False answer to the question, and pathverdict is the set of all paths between A and G and their

status (blocked or not).

5

Figure 2. Bayesian Network 2

Question 5 (5 pts). Fill in the function def question2Part1() that tells us if, in Figure 2, A ⊥⊥ D | G?

Your function should return result, pathverdict (see instructions), where result is the True/False answer

to the question, and pathverdict is the set of all paths between A and D and their status (blocked or not).

Question 6 (5 pts). Fill in the function def question2Part2() that tells us if, in Figure 2, A ⊥⊥ D | F?

Your function should return result, pathverdict (see instructions), where result is the True/False answer

to the question, and pathverdict is the set of all paths between A and D and their status (blocked or not).

Question 7 (5 pts). Fill in the function def question2Part3() that tells us if, in Figure 2, B ⊥⊥ G | E, D?

Your function should return result, pathverdict (see instructions), where result is the True/False answer

to the question, and pathverdict is the set of all paths between B and G and their status (blocked or not).

6

Figure 3. Bayesian Network 3

Question 8 (4 pts). This question uses the Bayesian Network in Figure 3.

Fill in the function def question3Part1(a,b,c,d, bn) that returns P(a, b, c, d) in this network. The

parameter bn gives you the network parameters (see instructions). For this question, we will give 2 test

cases. In 1 test case, bn will provide all of the network parameters and in 1 test case, bn will only provide

the parameters that are absolutely needed to compute this answer.

Question 9 (4 pts). This question uses the Bayesian Network in Figure 3.

Fill in the function def question3Part2(a,b,c, bn) that returns P(a, b, c) in this network. The parameter

bn gives you the network parameters (see instructions).

Question 10 (4 pts). This question uses the Bayesian Network in Figure 3.

Fill in the function def question3Part3(d, bn) that returns P(d) in this network. The parameter bn gives

you the network parameters (see instructions).

Question 11 (4 pts). This question uses the Bayesian Network in Figure 3.

Fill in the function def question3Part4(a,b,c, bn) that returns P(a, b|c) in this network. The parameter

bn gives you the network parameters (see instructions). For this question, we will give 2 test cases. In 1 test

case, bn will provide all of the network parameters and in 1 test case, bn will only provide the parameters

that are absolutely needed to compute this answer.

Question 12 (4 pts). This question uses the Bayesian Network in Figure 3.

Fill in the function def question3Part4(c, d, bn) that returns P(c|d) in this network. The parameter

bn gives you the network parameters (see instructions).

7

A

B C

D

E

Figure 4. Bayesian Network 4

Question 13 (4 pts). This question uses the Bayesian Network in Figure 4.

Fill in the function def question4Part1(b,c,d, bn) that returns P(b, c, d) in this network. The parameter

bn gives you the network parameters (see instructions).

Question 14 (4 pts). This question uses the Bayesian Network in Figure 4.

Fill in the function def question4Part2(c, d, bn) that returns P(d|c) in this network. The parameter

bn gives you the network parameters (see instructions). note that the variables given to your function are in

alphabetical order (c first then d) but the answer should return P(d|c)

Question 15 (4 pts). This question uses the Bayesian Network in Figure 4.

Fill in the function def question4Part3(d, e, bn) that returns P(d | e) in this network. The parameter

bn gives you the network parameters (see instructions).