Last active
December 25, 2015 11:39
-
-
Save miguel-vila/6970719 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "heading", | |
"level": 1, | |
"metadata": {}, | |
"source": [ | |
"Assignment 2 - Machine Learning" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Miguel Vil\u00e1 Gonz\u00e1lez\n", | |
"\n", | |
"Juan Carlos Espinosa Moreno" | |
] | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 1, | |
"metadata": {}, | |
"source": [ | |
"1. Parametric classification" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(a) First we load the dataset and shuffle it to avoid creating a biased training set (for example all elements from the $2$ class are at the end of the file). After this we plot the dataset by class:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import math\n", | |
"import pylab as pl\n", | |
"import numpy as np\n", | |
"from random import shuffle\n", | |
"from itertools import product\n", | |
"\n", | |
"f = open('data.txt','r')\n", | |
"lines = f.readlines()\n", | |
"data_set = [ [ float(element.strip()) for element in line.split(',')] for line in lines ]\n", | |
"#Shuffle the dataset to avoid creating a biased training set\n", | |
"shuffle(data_set)\n", | |
"f.close()\n", | |
"\n", | |
"X = [ arr[0:2] for arr in data_set ]\n", | |
"Y = [ arr[2] for arr in data_set ]\n", | |
"\n", | |
"n = int(0.8*len(X))\n", | |
"\n", | |
"X_train, Y_train = X[0:n] , Y[0:n]\n", | |
"X_test, Y_test = X[n:], Y[n:]\n", | |
"\n", | |
"classes = xrange(len(set(Y))) #Counts the distinct number of classes\n", | |
"\n", | |
"def get_features_from_class(c,X,Y):\n", | |
" \"\"\"Extracts the features for elements with class 'c'\"\"\"\n", | |
" if len(X)!=len(Y):\n", | |
" raise Exception(\"'X' and 'Y' must have the same length\")\n", | |
" indices = [i for i in xrange(len(Y)) if Y[i]==c]\n", | |
" return [X[i] for i in indices]\n", | |
"\n", | |
"pl.clf()\n", | |
"def plot_class(X,class_symbol,c):\n", | |
" pl.plot([x[0] for x in X],[x[1] for x in X], class_symbol, label=(\"Class \"+str(c) if c!=len(classes) else \"Rejected\"))\n", | |
" \n", | |
"X_class0 = get_features_from_class(0,X,Y)\n", | |
"plot_class(X_class0, 'ro',0)\n", | |
"\n", | |
"X_class1 = get_features_from_class(1,X,Y)\n", | |
"plot_class(X_class1, 'go',1)\n", | |
"\n", | |
"X_class2 = get_features_from_class(2,X,Y)\n", | |
"plot_class(X_class2, 'bo',2)\n", | |
"pl.legend()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 64, | |
"text": [ | |
"<matplotlib.legend.Legend at 0xa7fa18c>" | |
] | |
}, | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\nEwRBWID/B2I2ypMUN6v6AAAAAElFTkSuQmCC\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0xa69b8ec>" | |
] | |
} | |
], | |
"prompt_number": 64 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Then we create an estimator for the whole training set and one for each class. We create a function that encodes the maximum-likelihood estimator given samples in an array $x$:\n", | |
"$$\n", | |
"f(x) = \\frac{1}{\\sqrt{(2\\pi)^k|\\Sigma |}}\\cdot exp\\left(-\\frac{1}{2}(x-\\mu)^t\\Sigma^{-1}(x-\\mu)\\right)\n", | |
"$$\n", | |
"Here $\\mu$ is the mean vector, $\\Sigma$ is the covariance matrix and $|\\Sigma |$ the determinant of the covariance (taken from [Wikipedia](http://en.wikipedia.org/wiki/Multivariate_normal_distribution#Estimation_of_parameters))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"class Multivariate_Normal_Estimator:\n", | |
" \n", | |
" def __init__(self, X):\n", | |
" self.k = X.shape[1]\n", | |
" mean = np.mean(X,0)\n", | |
" self.mean = mean.reshape((1,len(mean)))\n", | |
" self.cov = np.matrix(np.cov(X.T))\n", | |
" self.cov_inv = self.cov.I\n", | |
" self.det = np.linalg.det(self.cov)\n", | |
" self.normalizer = 1.0 / np.sqrt(np.power(2*np.pi,self.k)*self.det)\n", | |
" \n", | |
" def estimate(self,x):\n", | |
" if len(x)!=self.k:\n", | |
" raise Exception(\"Incompatible array: it must have length:\"+str(self.k))\n", | |
" diff = (x-self.mean)\n", | |
" return self.normalizer*math.pow(math.e, -0.5* (diff * self.cov_inv * diff.T))\n", | |
" \n", | |
" def __repr__(self):\n", | |
" return \"(1/sqrt(2*pi^\"+str(self.k)+\"*\"+str(self.det)+\"))*exp(-0.5*(x-\"+str(self.mean)+\")^t*\"+str(self.cov_inv)+\"*(x-\"+str(self.mean)+\"))\"\n", | |
"\n", | |
"class_estimators = []\n", | |
"#The classes are sorted thus the array index matches the class\n", | |
"\n", | |
"X_of_class = [np.array(get_features_from_class(i,X_train,Y_train)) for i in classes]\n", | |
"for i in classes:\n", | |
" X_i = X_of_class[i]\n", | |
" X_i_estimator = Multivariate_Normal_Estimator(X_i)\n", | |
" class_estimators.append(X_i_estimator)\n", | |
" print \"Discriminant function for class \"+str(i)+\": \"+str(X_i_estimator)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"Discriminant function for class 0: (1/sqrt(2*pi^2*0.688981859757))*exp(-0.5*(x-[[ 3.84079436 5.17519078]])^t*[[ 2.24660503 -0.66254263]\n", | |
" [-0.66254263 0.8414384 ]]*(x-[[ 3.84079436 5.17519078]]))\n", | |
"Discriminant function for class 1: (1/sqrt(2*pi^2*1.04509721656))*exp(-0.5*(x-[[ 9.16240144 5.9441285 ]])^t*[[ 1.02632396 0.80456602]\n", | |
" [ 0.80456602 1.56303013]]*(x-[[ 9.16240144 5.9441285 ]]))\n", | |
"Discriminant function for class 2: (1/sqrt(2*pi^2*1.68427807441))*exp(-0.5*(x-[[ 7.03967513 3.63726588]])^t*[[ 0.70491909 -0.02088859]\n", | |
" [-0.02088859 0.84288045]]*(x-[[ 7.03967513 3.63726588]]))\n" | |
] | |
} | |
], | |
"prompt_number": 65 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Using the estimator we can compute $P(X|C)$ for each class and thus we can express $P(X)$ using the total probability law:\n", | |
"\n", | |
"$$\\sum_{C_i} P(X|C_i)P(C_i)$$\n", | |
"\n", | |
"Finally we compute the probability for each class by simply counting the number of examples of that class in the training set:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def P_C(c):\n", | |
" return float(len(X_of_class[c]))/len(X_train)\n", | |
"\n", | |
"def P_X_giv_C(x,c):\n", | |
" estimator = class_estimators[c]\n", | |
" return estimator.estimate(x)\n", | |
"\n", | |
"def P_X(x):\n", | |
" return sum(P_C(c)*P_X_giv_C(x,c) for c in classes)\n", | |
"\n", | |
"for c in classes:\n", | |
" print P_X_giv_C(np.array([3.79421804 , 5.09090221]),c)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"0.191200680251\n", | |
"8.36332055196e-10\n", | |
"0.00111369347248\n" | |
] | |
} | |
], | |
"prompt_number": 66 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Finally we can compute the probability of each class using Bayes:\n", | |
"$$P(C|X)=\\frac{P(X|C)P(C)}{P(X)}$$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def P_C_giv_X(c,x):\n", | |
" return (P_X_giv_C(x,c)*P_C(c))/P_X(x)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 67 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(d) Using this function we can classify new data points by looking for the class that maximizes the conditional probability. Also we can classify taking into acount the risk of rejection $\\lambda$ by" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def classify(x):\n", | |
" return max(classes, key=(lambda c: P_C_giv_X(c,x)))\n", | |
"\n", | |
"#print P_C_giv_X(\n", | |
"\n", | |
"def classify_with_rejection(x,lamb):\n", | |
" c_max = classify(x)\n", | |
" if P_C_giv_X(c_max,x)>1-lamb:\n", | |
" return c_max\n", | |
" else:\n", | |
" return len(classes) #Reject class" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 68 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(e) Also we can plot the regions according to the classifier:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"x_sp = np.linspace(0.,15, num=75)\n", | |
"y_sp = np.linspace(0.,10, num=75)\n", | |
"\n", | |
"lamb = 0.05\n", | |
"points = [np.array(p) for p in product(x_sp,y_sp)]\n", | |
"\n", | |
"classification = [classify_with_rejection(p,lamb) for p in points]\n", | |
"\n", | |
"plot_class(get_features_from_class(0,points,classification), \"ro\", 0)\n", | |
"plot_class(get_features_from_class(1,points,classification), \"go\", 1)\n", | |
"plot_class(get_features_from_class(2,points,classification), \"bo\", 2)\n", | |
"rejected = get_features_from_class(3,points,classification)\n", | |
"plot_class(rejected, \"wo\", 3)\n", | |
"pl.legend()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 69, | |
"text": [ | |
"<matplotlib.legend.Legend at 0xa9b840c>" | |
] | |
}, | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\nCrJN7REAAAAASUVORK5CYII=\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0xaa6f58c>" | |
] | |
} | |
], | |
"prompt_number": 69 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(f) Finally we use the test set to evaluate the classifier. First we compute a confussion matrix using the classifier that doesn't reject:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"Y_classified=[classify(example) for example in X_test]\n", | |
"n = len(classes)\n", | |
"confussion_matrix = np.zeros((n,n))\n", | |
"for correct_class, classified_class in zip(Y_test,Y_classified):\n", | |
" confussion_matrix[correct_class][classified_class]+=1\n", | |
"print 'confussion matrix:\\n',confussion_matrix\n", | |
"overall_accuracy = round(100.0*sum(diag(confussion_matrix))/sum(confussion_matrix),2)\n", | |
"print 'overall accuracy:',overall_accuracy,'% (missclassified:',100.0-overall_accuracy,'%)'\n", | |
"for c in classes:\n", | |
" class_accuracy = round(100.0*confussion_matrix[c][c]/sum(confussion_matrix[c]),2)\n", | |
" print 'class ',c,' accuracy:',class_accuracy,'% (missclassified:',100.0-class_accuracy,'%)'" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"confussion matrix:\n", | |
"[[ 42. 0. 0.]\n", | |
" [ 0. 35. 0.]\n", | |
" [ 1. 0. 42.]]\n", | |
"overall accuracy: 99.17 % (missclassified: 0.83 %)\n", | |
"class 0 accuracy: 100.0 % (missclassified: 0.0 %)\n", | |
"class 1 accuracy: 100.0 % (missclassified: 0.0 %)\n", | |
"class 2 accuracy: 97.67 % (missclassified: 2.33 %)\n" | |
] | |
} | |
], | |
"prompt_number": 70 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"First we can see that the missclassificaton is very low. The class with more missclasifications was the $2$ class, possibly because its the class that overlaps the most with the other two classes. \n", | |
"\n", | |
"But by observing the regions graph we can note that points in the upper right corner (values with $x>12$ and $y>8$) are classified as being in the class $2$. But following the visual tendency in the input dataset the points in said region should be classified in the class $1$. As the test set doesn't contain any point in this region we can't observe these shortcomings of the classifier. The same observation can be applied to points in the upper left region which should be classified in the $0$ class but the classiffier recognizes as being in the $1$ class." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Also we compute another confussion matrix taking into account the possibility of rejection:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"lamb = 0.05\n", | |
"confussion_matrix_with_rejection = np.zeros((n,n+1))\n", | |
"Y_classified_with_rejection=[classify_with_rejection(example, lamb) for example in X_test]\n", | |
"for correct_class, classified_class in zip(Y_test,Y_classified_with_rejection):\n", | |
" confussion_matrix_with_rejection[correct_class][classified_class]+=1\n", | |
"print 'confussion matrix with rejection:\\n',confussion_matrix_with_rejection\n", | |
"rejected = confussion_matrix_with_rejection.T[len(classes)]\n", | |
"overall_accuracy = round(100.0*sum(diag(confussion_matrix_with_rejection))/(sum(confussion_matrix_with_rejection)-sum(rejected)),2)\n", | |
"print 'overall accuracy:',overall_accuracy,'% (missclassified:',100.0-overall_accuracy,'%)'\n", | |
"for c in classes:\n", | |
" class_accuracy = round(100.0*confussion_matrix_with_rejection[c][c]/sum(confussion_matrix_with_rejection[c][0:c+1]),2)\n", | |
" print 'class ',c,' accuracy (not counting rejected):',class_accuracy,'% (missclassified:',100.0-class_accuracy,'%)'\n", | |
" rejected_percentage =round(100.0*confussion_matrix_with_rejection[c][len(classes)]/sum(confussion_matrix_with_rejection[c]),2)\n", | |
" print 'Percentage of true class ',c,' rejected elements:',rejected_percentage,'%'" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"confussion matrix with rejection:\n", | |
"[[ 41. 0. 0. 1.]\n", | |
" [ 0. 24. 0. 11.]\n", | |
" [ 0. 0. 39. 4.]]\n", | |
"overall accuracy: 100.0 % (missclassified: 0.0 %)\n", | |
"class 0 accuracy (not counting rejected): 100.0 % (missclassified: 0.0 %)\n", | |
"Percentage of true class 0 rejected elements: 2.38 %\n", | |
"class 1 accuracy (not counting rejected): 100.0 % (missclassified: 0.0 %)\n", | |
"Percentage of true class 1 rejected elements: 31.43 %\n", | |
"class 2 accuracy (not counting rejected): 100.0 % (missclassified: 0.0 %)\n", | |
"Percentage of true class 2 rejected elements: 9.3 %\n" | |
] | |
} | |
], | |
"prompt_number": 71 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Classifying with rejection (using $\\lambda=0.05$) the accuracy (without counting rejected items) is still very high. But there is a high percentage of elements that are rejected for classification. Adding the posibility to reject increases accuracy with respect to the number of classified elements and produces a more confident classifier, but at the cost of not being able to classify some elements." | |
] | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": [ | |
"2. [Alp10] Excercise 1 (chapter 16)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"By the definition of conditional probability we have that $P(x_1|x_2)$ is equal to:\n", | |
"\n", | |
"$$\\frac{P(x_1,x_2)}{P(x_2)}$$\n", | |
"\n", | |
"By the total probability law:\n", | |
"\n", | |
"$$\\frac{\\sum_i P(x_1,x_2|C_i)P(C_i)}{\\sum_i P(x_2|C_i)P(C_i)}$$\n", | |
"\n", | |
"And by the conditional independence of $x_1$ and $x_2$ this is equal to:\n", | |
"\n", | |
"$$\\frac{\\sum_i P(x_1|C_i)P(x_2|C_i)P(C_i)}{\\sum_i P(x_2|C_i)P(C_i)}$$\n", | |
"\n", | |
"As $p(x_j | C_i) \\sim \\mathcal{N}( \\mu_{ij} , \\sigma^2_{ij})$ :\n", | |
"\n", | |
"$$\n", | |
"\\left(\\frac{1}{2\\pi}\\sum_i \\frac{P(C_i)}{\\sigma_{i1}\\sigma_{i2}} exp\\left(-\\frac{(x_1-\\mu_{i1})^2}{2\\sigma^2_{i1}}-\\frac{(x_2-\\mu_{i2})^2}{2\\sigma^2_{i2}}\\right)\\right)\\div\\left(\\frac{1}{\\sqrt{2\\pi}} \\sum_i \\frac{P(C_i)}{\\sigma_{i2}} exp\\left(-\\frac{(x_2-\\mu_{i2})^2}{2\\sigma^2_{i2}}\\right)\\right)\n", | |
"$$\n", | |
"\n", | |
"Finally we have:\n", | |
"\n", | |
"$$\n", | |
"P(x_1|x_2) = \\left(\\frac{\\sqrt{2\\pi}}{2\\pi}\\sum_i \\frac{P(C_i)}{\\sigma_{i1}\\sigma_{i2}} exp\\left(-\\frac{(x_1-\\mu_{i1})^2}{2\\sigma^2_{i1}}-\\frac{(x_2-\\mu_{i2})^2}{2\\sigma^2_{i2}}\\right)\\right)\\div\\left(\\sum_i \\frac{P(C_i)}{\\sigma_{i2}} exp\\left(-\\frac{(x_2-\\mu_{i2})^2}{2\\sigma^2_{i2}}\\right)\\right)\n", | |
"$$\n" | |
] | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": [ | |
"3. [DHS00] Computer exercise 9 (sect 2.11, page 81)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The bayesian network is shown below:" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"http://i.imgur.com/NNEDsTi.png\">" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(a) The first question is asking for the conditional probability $P(\\mbox{Salmon } | \\mbox{ Dark, Thin, North Atlantic, Summer})$. Using the software we computed a probability of 0.3182.\n", | |
"\n", | |
"(b) The second question is asking for the conditional probabilities $P(season\\mbox{ }| \\mbox{ Medium, Thin, North Atlantic})$ for each $season$ .The result was:\n", | |
"$$P(\\mbox{winter }| \\mbox{ Medium, Thin, North Atlantic})=0.2529$$\n", | |
"$$P(\\mbox{spring }| \\mbox{ Medium, Thin, North Atlantic})=0.2558$$\n", | |
"$$P(\\mbox{summer }| \\mbox{ Medium, Thin, North Atlantic})=0.2490$$\n", | |
"$$P(\\mbox{autumn }| \\mbox{ Medium, Thin, North Atlantic})=0.2412$$\n", | |
"\n", | |
"(c) The last question asked for the conditional probability $P(\\mbox{North Atlantic } | \\mbox{ Light, Wide, Autumn})$ which was equal to $0.5893$" | |
] | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": [ | |
"4. [Bis06] Exercise 8.11" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Consider the example of the car fuel system shown in Figure 8.21, and suppose that instead of observing the state of the fuel gauge $G$ directly, the gauge is seen by the driver $D$ who reports to us the reading on the gauge. This report is either that the gauge shows full $D = 1$ or that it shows empty $D = 0$. Our driver is a bit unreliable,\n", | |
"as expressed through the following probabilities:\n", | |
"\n", | |
"$p(D = 1|G = 1) = 0.9 $ \n", | |
"\n", | |
"$p(D = 0|G = 0) = 0.9 $\n", | |
"\n", | |
"Suppose that the driver tells us that the fuel gauge shows empty, in other words that we observe $D = 0$. Evaluate the probability that the tank is empty given only this observation. Similarly, evaluate the corresponding probability given also the observation that the battery is flat, and note that this second probability is lower.\n", | |
"Discuss the intuition behind this result, and relate the result to Figure 8.54.\n", | |
"\n", | |
"Solution:\n", | |
"\n", | |
"The first step is to see what is the figure 8.54:\n", | |
"\n", | |
"<img src=\"http://i.imgur.com/Oq9TAHv.png\">\n", | |
"\n", | |
"From the example in the book we have:\n", | |
"\n", | |
"''The variables are called $B$, representing the state of a battery that is either charged $(B = 1)$ or flat $(B = 0)$, $F$ representing the state of the fuel tank that is either full $(F = 1)$ or empty $(F = 0)$, and $G$, which is the state of an electric fuel gauge and which indicates either full $(G = 1)$ or empty $(G=0)$.\"" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"$p(B=1) = 0.9$\n", | |
"\n", | |
"$p(F=1) = 0.9$\n", | |
"\n", | |
"$p(G=0) = 0.315$\n", | |
"\n", | |
"$p(D=1|G=1) = 0.9$\n", | |
"\n", | |
"$p(D=0|G=0) = 0.9$\n", | |
"\n", | |
"$p(G=1 | B=1, F=1) = 0.84$\n", | |
"\n", | |
"$p(G=1 | B=1, F=0) = 0.2$\n", | |
"\n", | |
"$p(G=1 | B=0, F=1) = 0.2$\n", | |
"\n", | |
"$p(G=1 | B=0, F=0) = 0.1$\n", | |
"\n", | |
"* Evaluate $ P(F=0 | D=0). $\n", | |
"\n", | |
"$p(F=0|D=0) = \\dfrac{p(F=0,D=0)}{p(D=0)}$\n", | |
"\n", | |
"By the total probability theorem we have:\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"p(D=0) &= p(D=0|G=0)p(G=0) + p(D=0|G=1)p(G=1) \\\\\n", | |
"&= 0.9(0.315) + 0.1(0.685) = 0.352\n", | |
"\\end{align*}\n", | |
"$$\n", | |
"\n", | |
"Marginalizing we have:\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"p(F=0, D=0) &= \\displaystyle\\sum_{g=0}^1 \\displaystyle\\sum_{b=0}^1 p(F=0,D=0,G=g,B=b) \n", | |
"\\end{align*}\n", | |
"$$\n", | |
"\n", | |
"We are going to calculate one of these probabilities. The others where calculated in the same way.\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"&p(F=0,D=0,G=0,B=0) \\\\\n", | |
"&= p(F=0)p(B=0)p(D=0|G=0)p(G=0|B=0,F=0)\t\\\\\n", | |
"&= 0.1(0.1)(0.9)(0.9) = 0.0081.\n", | |
"\\end{align*}\n", | |
"$$\n", | |
"\n", | |
"After this operations we get:\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"p(F=0,D=0,G=0,B=1) &= 0.0648\t\\\\\n", | |
"p(F=0,D=0,G=1,B=0) &= 0.0001\t\\\\\n", | |
"p(F=0,D=0,G=1,B=1) &= 0.0018\t\\\\\n", | |
"\\end{align*}\n", | |
"$$\n", | |
"\n", | |
"Finally:\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"p(F=0|D=0) = \\dfrac{0.0081+0.0648+0.0001+0.0018}{0.352} = \\dfrac{0.0748}{0.352} = 0.2125\n", | |
"\\end{align*}\n", | |
"$$" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now we are interested in evaluating $p(F=0|D=0,B=0)$\n", | |
"\n", | |
"We will calculate this probability with the same methods that the last exercise.\n", | |
"\n", | |
"$$\n", | |
"p(F=0|D=0,B=0) = \\dfrac{p(F=0,D=0,B=0)}{p(D=0,B=0)}\n", | |
"$$\n", | |
"\n", | |
"$p(F=0,D=0,B=0) = p(F=0,D=0,B=0,G=0) + p(F=0,D=0,B=0,G=1)$\n", | |
"\n", | |
"$$\n", | |
"\\begin{align*}\n", | |
"p(F=0,D=0,B=0,G=0) = & p(F=0)p(B=0)p(D=0|G=0)p(G=0|F=0,B=0)\t\\\\\n", | |
"= & 0.1(0.1)(0.9)(0.9) = 0.0081.\n", | |
"\\end{align*}\n", | |
"$$\n", | |
"\n", | |
"Similarly we calculate\n", | |
"\n", | |
"$ p(F=0,D=0,B=0,G=1) = 0.0001 $" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now we have to calculate $p(D=0,B=0)$\n", | |
"\n", | |
"Marginalizing:\n", | |
"\n", | |
"$$p(D=0,B=0) = \\displaystyle\\sum_{f=0}^1\\displaystyle\\sum_{g=0}^1 p(D=0,B=0,F=f,G=g) $$\n", | |
"\n", | |
"We realize that sum of probabilities was calculated in the last exercise. We found this probability was $0.0748$.\n", | |
"\n", | |
"Finally we have:\n", | |
"\n", | |
"$ p(F=0|D=0,B=0) = \\dfrac{0.0082}{0.0748} = 0.1097 $" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We now see that this second probability is lower than the first one. Intuitively we hoped this second probability was lower because we realize that the probability of having one of these variables taking value 0 is very low, so we think that if we use more variables taking value of 0 as conditionals of that one we will reduce the probability of this event.\n", | |
"\n", | |
"In the other hand, the relation between this exercise and the graphic is because we can replace the names to the nodes and we have a diagram of our problem. If we replace $a$ by $B$, $b$ by $F$, $c$ by $G$ and $d$ by $D$ we can see the network that shows our problematic." | |
] | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": [ | |
"5. Belief propagation" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We define the following functions:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def pi(i):\n", | |
" if i==1:\n", | |
" return 0.5\n", | |
" else:\n", | |
" return ((i/(i+1.))+(1./(i+1.)))*pi(i-1)\n", | |
"\n", | |
"#We cache the function to avoid repeated computations: \n", | |
"cache = {}\n", | |
"def lamb(i,n,x):\n", | |
" key = str(i)+\" \"+str(n)+\" \"+str(x)\n", | |
" if not cache.has_key(key):\n", | |
" value = 0\n", | |
" if n == i+1:\n", | |
" value = (i+1.)/(i+2.) if x else 1./(i+2.)\n", | |
" else:\n", | |
" value = ((i+1.)/(i+2.))*lamb(i+1,n,x)+(1./(i+2.))*lamb(i+1,n,not(x))\n", | |
" cache[key] = value\n", | |
" return cache[key]" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 72 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We have that $\\mbox{pi}(x=0)\\mbox{ == pi}(x=1)$ because $p(x_{i+1}|x_i)=1-p(x_{i+1}|\\sim x_i)$ thus the function pi doesn't need to take an x parameter" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"$\\alpha=\\frac{p(x_0)}{p(x_0,x_n)}$.\n", | |
"\n", | |
"$p(x_0,x_n)$ by marginalization is equal to $p(x_0)\\cdot\\sum_{i=1}^{n}\\left(p(x_i|x_{i-1})+p(x_i|\\sim x_{i-1})\\right)$and as $p(x_{i+1}|x_i)=\\frac{i+1}{i+2}$ and $p(x_{i+1}|\\sim x_i )=\\frac{1}{i+2}$ each term of the sum is equal to $1$. As $p(x_0)=0.5$ we can conclude that $\\alpha=1$:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def alpha(i,n):\n", | |
" return 1." | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 77 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(1) For $n=10$ we have $p(x_{n/2} |x_0 = 1, x_n = 0)$, $p(x_{n/2} |x_0 = 0, x_n = 1)$ and $p(x_{n/2} |x_0 = 1, x_n = 1)$ are respectively equal to:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"print alpha(5,10)*pi(5)*lamb(5,10,False)\n", | |
"print alpha(5,10)*pi(5)*lamb(5,10,True)\n", | |
"print alpha(5,10)*pi(5)*lamb(5,10,True)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"0.181818181818\n", | |
"0.318181818182\n", | |
"0.318181818182\n" | |
] | |
} | |
], | |
"prompt_number": 78 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(2) For $n = 30$ we have that $p(x_{n/2} |x_0 = 1, x_n = 0)$, $p(x_{n/2} |x_0 = 0, x_n = 1)$ and $p(x_{n/2} |x_0 = 1, x_n = 1) $ are respectively equal to:\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"print alpha(15,30)*pi(15)*lamb(15,30,False)\n", | |
"print alpha(15,30)*pi(15)*lamb(15,30,True)\n", | |
"print alpha(15,30)*pi(15)*lamb(15,30,True)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"0.185483870968\n", | |
"0.314516129032\n", | |
"0.314516129032\n" | |
] | |
} | |
], | |
"prompt_number": 75 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"(3) For $n = 30$:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"plot_range = range(1,30)\n", | |
"plot_value = [alpha(i,30)*pi(i)*lamb(i,30,True) for i in plot_range]\n", | |
"pl.plot([0]+plot_range , [0.5]+plot_value, 'ro')" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 80, | |
"text": [ | |
"[<matplotlib.lines.Line2D at 0xb4db04c>]" | |
] | |
}, | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\nAABJRU5ErkJggg==\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0xae96a4c>" | |
] | |
} | |
], | |
"prompt_number": 80 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [] | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment