From 5fb813534135372742362359ab22a9262e3e44e4 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 3 Dec 2021 12:25:21 +0330 Subject: [PATCH 01/44] add metadata.yml --- .../metadata.yml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 notebooks/10_bayesian_networks_sampling/metadata.yml diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml new file mode 100644 index 00000000..7e232a94 --- /dev/null +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -0,0 +1,44 @@ +title: # shown on browser tab + +header: + title: # title of your notebook + description: # short description of your notebook + +authors: + label: + position: top + content: + # list of notebook authors + - name: # name of author + role: Author # change this if you want + contact: + # list of contact information + - link: https://github.com/AlirezaTheBruh + icon: fab fa-github + # optionally add other contact information like + # - link: # contact link + # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) + + - name: # name of author + role: Author # change this if you want + contact: + # list of contact information + - link: https://github.com/n3slami + icon: fab fa-github + # optionally add other contact information like + # - link: # contact link + # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) + + - name: # name of author + role: Author # change this if you want + contact: + # list of contact information + - link: https://github.com/anajibi + icon: fab fa-github + # optionally add other contact information like + # - link: # contact link + # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) +comments: + # enable comments for your post + label: false + kind: comments From 4b08a2c4d5809c019ebacb4249edfa4916781ca6 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 3 Dec 2021 12:25:32 +0330 Subject: [PATCH 02/44] add index.md template --- .../10_bayesian_networks_sampling/index.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 notebooks/10_bayesian_networks_sampling/index.md diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md new file mode 100644 index 00000000..badfb99d --- /dev/null +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -0,0 +1,192 @@ +
+
+
+
+
+
+
+
+
+

AI - Inference in Bayesian Networks: Sampling

+

Sharif University of Technology - Computer Engineering Department

+
+

Alireza Honarvar, Navid Eslami, Ali Najibi

+
+
+
+
+
+
+
+ +Table of Contents +============== +- [Introduction](#Introduction) +- [Intelligent agents](#Intelligent-agents) + - [Vacuum world agent example](#Vacuum-world-agent-example) +- [Rational agents and performance measure](#Rational-agents-and-performance-measure) + - [Rationality vs perfection](#Rationality-vs-perfection) + - [Autonomy](#Autonomy) +- [Task environment (PEAS)](#Task-environment-PEAS) + - [PEAS example](#PEAS-example) +- [Properties of task environments](#Properties-of-task-environments) + - [Types of environment](#Types-of-environment) + - [Types of environment example](#Types-of-environment-example) +- [Types of agents](#Types-of-agents) + - [Reflex agents](#Reflex-agents) + - [Goal-based agents](#Goal-based-agents) + - [Utility-based agents](#Utility-based-agents) + - [Learning agents](#Learning-agents) +- [Conclusion](#Conclusion) +- [References](#References) + +# Introduction +In this notebook, we will discuss the nature of intelligent agents. The concepts that are introduced here will give you some insight into agents and environments. You will also be introduced to a few of the most common agent architectures. + + +# Intelligent agents +An intelligent agent is anything that perceives its environment through sensors and acts upon that environment through its actuators. + We will use the term percept to refer to the agent's perceptual inputs at any given moment. +We can describe an agent's behavior by the agent function. +Agent function maps any given percept sequence to an action. But how does the agent know what sequence it must choose? we will try to answer this question using a simple example. + + + +##### Vacuum world agent example + +Imagine an environment that only has two rooms (room A & room B). Our agent is a vacuum cleaner. It can perceive whether the room it is currently in, is dirty or not. It can also move between the rooms and suck up dirt (the actuators of the agent). +Imagine that we only care about both rooms being clean, a simple way we can implement an agent that guarantees this is for our agent to constantly move between the rooms and suck up dirt in each one. Now imagine we also want to minimize the amount of energy the vacuum cleaner uses. In order to do that we can stop the agent for a limited amount of time if both rooms are clean. As you can see we implemented two completely different agents for these two problems and that's because we used two different performance measures. + + + +# Rational agents and performance measure +A rational agent chooses the set of action in order to maximize its performance. Agents use a performance measure to evaluate the desirability of any given sequence. In other words, an agent will choose the action (or a sequence of them) that maximize the expected value of its performance measure. + + + +#### Rationality vs perfection +Keep in mind that rationality is distinct from omniscience. An omniscient agent knows the actual outcome of its actions but in reality, an agent only knows the expected outcome of its action. For example, imagine you're trying to cross the street and no cars are on the street naturally, you will cross the street to reach your goal. Now imagine as you are passing the street a meteorite falls on you. Can anyone blame you for being irrational and not expecting a meteorite to flatten you? + +#### Autonomy +A rational agent should be autonomous meaning it mustn't only rely on the prior knowledge of its designer and must learn to compensate for partial or incorrect prior knowledge. In other words, rational agents should learn from experience. For example, in the vacuum world our agent could start to learn when the rooms usually get dirty based on its experience. + + +# Task environment (PEAS) +We have already talked about performance measure, task environment, actuators and sensors. We group all these under the heading of the Task environment and we abbreviate it as PEAS(Performance measure, Enviroment, Actuators, Sensors). When designing an agent our first step should be specifying the task environment. + + +#### PEAS example +Here are a few examples of specifying PEAS for different agents. + +| Agent | Performance Measure | Environment | Actuator | Sensor | +| ----------- | ----------- | ----------- | ----------- | ----------- | +| Hospital Management System | Patient’s health, Admission process, Payment | Hospital, Doctors, Patients | Prescription, Diagnosis, Scan report | Symptoms, Patient’s response | +| Automated Car Drive | Comfortable trip, Safety, Maximum Distance | Roads, Traffic, Vehicles | Steering wheel, Accelerator, Brake, Mirror | Camera, GPS, Odometer | +| Subject Tutoring | Maximize scores, Improvement is students | Classroom, Desk, Chair, Board, Staff, Students | Smart displays, Corrections | Eyes, Ears, Notebooks | + +# Properties of task environments + +#### Types of environment +We can categorize an environment in many ways, you will find some of the most important ones listed below. + +
    +
  • Fully observable or partially observable (Do the agent sensor's give access to the complete state of the environment at each time?)
  • +
      +
    • We say an environment is fully observable if an agent has access to the complete state of the environment at each time.
    • +
    • If an agent doesn't know the complete state of the environment we say the environment is partially observable.
    • +
    • In the most extreme case when an agent knows nothing about the state of the environment we say the environment is unobservable.
    • +
    • examples: In the vacuum world example our agent doesn't know if there is dirt in another room so this environment is partially observable for our agent. + A simple chess agent has complete access to the chessboard's information at any given time so this environment is fully observable for our agent.
    • +
    +
    + +
  • Single-agent or multi-agent (Are there more than one agent in the environment?)
  • +
      +
    • We say an environment is a multi-agent environment if there is more than one agent operating in it otherwise we say the environment is single agent.
    • +
    • In some cases, we can model our environment both as a single-agent and multi-agent environment. For example, imagine an automatic taxi agent. Should this agent treat the other cars as objects or as another agent? It's better to model our environment as a multi-agent environment if the behavior of the other entities can be modeled as an agent seeking to maximize its performance measure which is somehow affected by our agent.
    • +
    • a multi-agent environment could be competitive or cooperative or even a mix of both.
    • +
    • examples: Chess and automatic driving are multi-agent environments. Solving a crossword puzzle is a single-agent environment.
    • +
    +
    + +
  • Deterministic or stochastic (Is the next state completely determined by the current state and the executed action?)
  • +
      +
    • We say an environment is deterministic if the next state is completely determined by the current state and the agent action otherwise, it is stochastic.
    • +
    • examples: Chess is a deterministic environment. Automatic driving is stochastic because an agent can't predict everything(e.g traffic, accidents).
    • +
    +
    + +
  • Episodic or sequential (Is the agent's experience divided into atomic "episodes" where the choice of action in each episode depends only on the episode itself?)
  • +
      +
    • We say an environment is episodic if the agent's experience can be divided into atomic "episodes" in a way that the action taken in an episode is independent of the previous episodes actions.
    • +
    • We say an environment is sequential if the current decision could affect all future decisions.
    • +
    • examples: Chess and automatic driving are sequential. A part picking robot is episodic.
    • +
    +
    +
  • Static or dynamic (Is the environment unchanged while an agent is deliberating?)
  • +
      +
    • We say an environment is dynamic if it can change while the agent is deliberating.
    • +
    • There is a special case that the environment doesn't change but the performance score has a time penalty. We call these environments semi-dynamic.
    • +
    • examples: Automatic driving is dynamic. Chess without a clock is static.
    • +
    +
    +
  • Discrete or continuous (Are there a limited number of distinct, clearly defined states, percepts, and actions?)
  • +
      +
    • We say an environment's state is discrete if there are a finite number of distinct states otherwise we say the environment's state is continuous.
    • +
    • examples: Chess is discrete. Automatic driving is continuous.
    • +
    +
+ +#### Types of environment example +Here are a few examples of identifying an environment's different dimensions. + +| Environment| Fully observable? | Deterministic? | Episodic? | Static? | Discrete?|Single-agent?| +| ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | +| Solitaire | No | Yes | Yes | Yes | Yes | Yes | +| Backgammon | Yes | No | No | Yes | Yes | No | +| Taxi driving | No | No | No | No | No | No | +| Medical diagnosis | No | No | No | No | No | Yes | + + + +# Types of agents +In this section we will introduce three basic kinds of basic agent programs.(The agent program is simply a program which implements the agent function.) +
    +
  • Simple reflex agents
  • +
  • Goal-based agents
  • +
  • Utility-based agents
  • +
+ +## Reflex agents +This is the simplest kind of agents. They choose their next action only based on their current percept. In other words, they do not consider the future consequences of their actions and only consider how the world IS. +As an example look at this Pacman agent below, at each turn the agent looks at its surrounding and chooses the direction that has a point in it and stops when there are no points around it. + + + +## Goal-based agents +This kind of agent has a specific goal and it tries to reach that goal efficiently. They have a model of how the world evolves in response to actions, and they make decisions based on (hypothesized) consequences of actions to reach their goal state. Search and Planning are two subfields that are closely tied with these kinds of agents. In other words, these kinds of agents act on how the world WOULD BE. +as an example look at this Pacman agent below. The goal is to collect every point. + + + + +## Utility-based agents +This kind of agent like goal-based agents has a goal. But they also have a utility function. They seek to reach their goal in a way that maximizes the utility function. For example, think about an automated car agent. They are many ways for this agent to get from point A to point B. But some of them are quicker, safer, cheaper. The utility function allows the agent to compare different states with each other and ask the question how happy am I in this state. +In other words, this kind of agent acts on how the world will LIKELY be. + + +## Learning agents +This kind of agent usually has 4 parts. The most important two are "the learning element", which is responsible for making improvements, and the "performance element", which is responsible for selecting external actions. The learning element uses feedback from a "critic" on how the agent is doing and determines how the performance element, or "actor", should be modified to do better in the future. +The last part of these agents is the "problem generator" which is responsible for suggesting actions that will lead to new unexplored states. +These agents try to do their best by both exploring the environment and using the gathered information to decide rationally. One of the advantages of Learning agents is that they can be deployed in an environment that they don't have a lot of prior knowledge on. They will gain this knowledge over time by exploring that environment. + +# Conclusion +We discussed the concept of an intelligent agent and the difference between a rational agent and a perfect agent. +then we talked about specifying the task environment for an agent and how we can categorize some main concepts of an environment. We also talked about some agent architectures that are commonly used. + + +# References + ++ Russell, S. J., Norvig, P., & Davis, E. (2022). Artificial Intelligence: A modern approach. Pearson Educación. ++ UC Berkeley's introductory artificial intelligence course, CS 188 ++ https://www.geeksforgeeks.org/understanding-peas-in-artificial-intelligence/ \ No newline at end of file From 851b2475476edd8cfa99bc3d4abb0724ed6fe7ec Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 3 Dec 2021 13:23:28 +0330 Subject: [PATCH 03/44] add Introduction, Basic Idea, Samp from Given Dist --- .../10_bayesian_networks_sampling/index.md | 193 ++++-------------- 1 file changed, 40 insertions(+), 153 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index badfb99d..017c1de6 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -21,172 +21,59 @@ Table of Contents ============== + - [Introduction](#Introduction) -- [Intelligent agents](#Intelligent-agents) - - [Vacuum world agent example](#Vacuum-world-agent-example) -- [Rational agents and performance measure](#Rational-agents-and-performance-measure) - - [Rationality vs perfection](#Rationality-vs-perfection) - - [Autonomy](#Autonomy) -- [Task environment (PEAS)](#Task-environment-PEAS) - - [PEAS example](#PEAS-example) -- [Properties of task environments](#Properties-of-task-environments) - - [Types of environment](#Types-of-environment) - - [Types of environment example](#Types-of-environment-example) -- [Types of agents](#Types-of-agents) - - [Reflex agents](#Reflex-agents) - - [Goal-based agents](#Goal-based-agents) - - [Utility-based agents](#Utility-based-agents) - - [Learning agents](#Learning-agents) -- [Conclusion](#Conclusion) -- [References](#References) +- [Basic Idea](#Basic-Idea) +- [Prior Sampling](#Prior-Sampling) +- [Rejection Sampling](#Rejection-Sampling) +- [Likelihood Weighting](#Likelihood-Weighting) +- [Gibbs Sampling](#Gibbs-Sampling) # Introduction -In this notebook, we will discuss the nature of intelligent agents. The concepts that are introduced here will give you some insight into agents and environments. You will also be introduced to a few of the most common agent architectures. - - -# Intelligent agents -An intelligent agent is anything that perceives its environment through sensors and acts upon that environment through its actuators. - We will use the term percept to refer to the agent's perceptual inputs at any given moment. -We can describe an agent's behavior by the agent function. -Agent function maps any given percept sequence to an action. But how does the agent know what sequence it must choose? we will try to answer this question using a simple example. - - - -##### Vacuum world agent example - -Imagine an environment that only has two rooms (room A & room B). Our agent is a vacuum cleaner. It can perceive whether the room it is currently in, is dirty or not. It can also move between the rooms and suck up dirt (the actuators of the agent). -Imagine that we only care about both rooms being clean, a simple way we can implement an agent that guarantees this is for our agent to constantly move between the rooms and suck up dirt in each one. Now imagine we also want to minimize the amount of energy the vacuum cleaner uses. In order to do that we can stop the agent for a limited amount of time if both rooms are clean. As you can see we implemented two completely different agents for these two problems and that's because we used two different performance measures. - - - -# Rational agents and performance measure -A rational agent chooses the set of action in order to maximize its performance. Agents use a performance measure to evaluate the desirability of any given sequence. In other words, an agent will choose the action (or a sequence of them) that maximize the expected value of its performance measure. - - - -#### Rationality vs perfection -Keep in mind that rationality is distinct from omniscience. An omniscient agent knows the actual outcome of its actions but in reality, an agent only knows the expected outcome of its action. For example, imagine you're trying to cross the street and no cars are on the street naturally, you will cross the street to reach your goal. Now imagine as you are passing the street a meteorite falls on you. Can anyone blame you for being irrational and not expecting a meteorite to flatten you? - -#### Autonomy -A rational agent should be autonomous meaning it mustn't only rely on the prior knowledge of its designer and must learn to compensate for partial or incorrect prior knowledge. In other words, rational agents should learn from experience. For example, in the vacuum world our agent could start to learn when the rooms usually get dirty based on its experience. - - -# Task environment (PEAS) -We have already talked about performance measure, task environment, actuators and sensors. We group all these under the heading of the Task environment and we abbreviate it as PEAS(Performance measure, Enviroment, Actuators, Sensors). When designing an agent our first step should be specifying the task environment. - - -#### PEAS example -Here are a few examples of specifying PEAS for different agents. - -| Agent | Performance Measure | Environment | Actuator | Sensor | -| ----------- | ----------- | ----------- | ----------- | ----------- | -| Hospital Management System | Patient’s health, Admission process, Payment | Hospital, Doctors, Patients | Prescription, Diagnosis, Scan report | Symptoms, Patient’s response | -| Automated Car Drive | Comfortable trip, Safety, Maximum Distance | Roads, Traffic, Vehicles | Steering wheel, Accelerator, Brake, Mirror | Camera, GPS, Odometer | -| Subject Tutoring | Maximize scores, Improvement is students | Classroom, Desk, Chair, Board, Staff, Students | Smart displays, Corrections | Eyes, Ears, Notebooks | - -# Properties of task environments - -#### Types of environment -We can categorize an environment in many ways, you will find some of the most important ones listed below. - -
    -
  • Fully observable or partially observable (Do the agent sensor's give access to the complete state of the environment at each time?)
  • -
      -
    • We say an environment is fully observable if an agent has access to the complete state of the environment at each time.
    • -
    • If an agent doesn't know the complete state of the environment we say the environment is partially observable.
    • -
    • In the most extreme case when an agent knows nothing about the state of the environment we say the environment is unobservable.
    • -
    • examples: In the vacuum world example our agent doesn't know if there is dirt in another room so this environment is partially observable for our agent. - A simple chess agent has complete access to the chessboard's information at any given time so this environment is fully observable for our agent.
    • -
    -
    - -
  • Single-agent or multi-agent (Are there more than one agent in the environment?)
  • -
      -
    • We say an environment is a multi-agent environment if there is more than one agent operating in it otherwise we say the environment is single agent.
    • -
    • In some cases, we can model our environment both as a single-agent and multi-agent environment. For example, imagine an automatic taxi agent. Should this agent treat the other cars as objects or as another agent? It's better to model our environment as a multi-agent environment if the behavior of the other entities can be modeled as an agent seeking to maximize its performance measure which is somehow affected by our agent.
    • -
    • a multi-agent environment could be competitive or cooperative or even a mix of both.
    • -
    • examples: Chess and automatic driving are multi-agent environments. Solving a crossword puzzle is a single-agent environment.
    • -
    -
    - -
  • Deterministic or stochastic (Is the next state completely determined by the current state and the executed action?)
  • -
      -
    • We say an environment is deterministic if the next state is completely determined by the current state and the agent action otherwise, it is stochastic.
    • -
    • examples: Chess is a deterministic environment. Automatic driving is stochastic because an agent can't predict everything(e.g traffic, accidents).
    • -
    -
    - -
  • Episodic or sequential (Is the agent's experience divided into atomic "episodes" where the choice of action in each episode depends only on the episode itself?)
  • -
      -
    • We say an environment is episodic if the agent's experience can be divided into atomic "episodes" in a way that the action taken in an episode is independent of the previous episodes actions.
    • -
    • We say an environment is sequential if the current decision could affect all future decisions.
    • -
    • examples: Chess and automatic driving are sequential. A part picking robot is episodic.
    • -
    -
    -
  • Static or dynamic (Is the environment unchanged while an agent is deliberating?)
  • -
      -
    • We say an environment is dynamic if it can change while the agent is deliberating.
    • -
    • There is a special case that the environment doesn't change but the performance score has a time penalty. We call these environments semi-dynamic.
    • -
    • examples: Automatic driving is dynamic. Chess without a clock is static.
    • -
    -
    -
  • Discrete or continuous (Are there a limited number of distinct, clearly defined states, percepts, and actions?)
  • -
      -
    • We say an environment's state is discrete if there are a finite number of distinct states otherwise we say the environment's state is continuous.
    • -
    • examples: Chess is discrete. Automatic driving is continuous.
    • -
    -
- -#### Types of environment example -Here are a few examples of identifying an environment's different dimensions. - -| Environment| Fully observable? | Deterministic? | Episodic? | Static? | Discrete?|Single-agent?| -| ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | -| Solitaire | No | Yes | Yes | Yes | Yes | Yes | -| Backgammon | Yes | No | No | Yes | Yes | No | -| Taxi driving | No | No | No | No | No | No | -| Medical diagnosis | No | No | No | No | No | Yes | - - -# Types of agents -In this section we will introduce three basic kinds of basic agent programs.(The agent program is simply a program which implements the agent function.) -
    -
  • Simple reflex agents
  • -
  • Goal-based agents
  • -
  • Utility-based agents
  • -
+In the past lecture note, it was shown that Inference +in Bayesian Networks, in general, is an intractable +problem. The natural approach now would be to try +and approximate the posterior probability. There are +several approximation methods for this problem, of +which we will discuss the ones based on randomized +sampling. -## Reflex agents -This is the simplest kind of agents. They choose their next action only based on their current percept. In other words, they do not consider the future consequences of their actions and only consider how the world IS. -As an example look at this Pacman agent below, at each turn the agent looks at its surrounding and chooses the direction that has a point in it and stops when there are no points around it. +# Basic Idea - +To compute an approximate posterior probability, one +approach is to simulate the Bayes' Net's joint +distribution. This can be achieved by drawing many samples +from the joint distribution. Using these samples, we can +approximate the probability of certain events. -## Goal-based agents -This kind of agent has a specific goal and it tries to reach that goal efficiently. They have a model of how the world evolves in response to actions, and they make decisions based on (hypothesized) consequences of actions to reach their goal state. Search and Planning are two subfields that are closely tied with these kinds of agents. In other words, these kinds of agents act on how the world WOULD BE. -as an example look at this Pacman agent below. The goal is to collect every point. +Sampling has two main advantages: - +- Learning: By getting samples from an unknown +distribution, we can learn the associated probabilities. +- Performance: Getting a sample is much faster than +computing the right answer. +The primitive element in any sampling algorithm is the +generation of samples from a known +probability distribution. So the step-by-step algorithm is +described in the following section. -## Utility-based agents -This kind of agent like goal-based agents has a goal. But they also have a utility function. They seek to reach their goal in a way that maximizes the utility function. For example, think about an automated car agent. They are many ways for this agent to get from point A to point B. But some of them are quicker, safer, cheaper. The utility function allows the agent to compare different states with each other and ask the question how happy am I in this state. -In other words, this kind of agent acts on how the world will LIKELY be. +# Sampling from Given Distribution +
+| C | P(C) | +|:-----: |:----: | +| red | 0.6 | +| green | 0.1 | +| blue | 0.3 | -## Learning agents -This kind of agent usually has 4 parts. The most important two are "the learning element", which is responsible for making improvements, and the "performance element", which is responsible for selecting external actions. The learning element uses feedback from a "critic" on how the agent is doing and determines how the performance element, or "actor", should be modified to do better in the future. -The last part of these agents is the "problem generator" which is responsible for suggesting actions that will lead to new unexplored states. -These agents try to do their best by both exploring the environment and using the gathered information to decide rationally. One of the advantages of Learning agents is that they can be deployed in an environment that they don't have a lot of prior knowledge on. They will gain this knowledge over time by exploring that environment. +
-# Conclusion -We discussed the concept of an intelligent agent and the difference between a rational agent and a perfect agent. -then we talked about specifying the task environment for an agent and how we can categorize some main concepts of an environment. We also talked about some agent architectures that are commonly used. +# Prior Sampling +# Rejection Sampling -# References +# Likelihood Weighting -+ Russell, S. J., Norvig, P., & Davis, E. (2022). Artificial Intelligence: A modern approach. Pearson Educación. -+ UC Berkeley's introductory artificial intelligence course, CS 188 -+ https://www.geeksforgeeks.org/understanding-peas-in-artificial-intelligence/ \ No newline at end of file +# Gibbs Sampling From 2bea5f2e7510536c2d7193195a441ccfbd993062 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 5 Dec 2021 16:27:14 +0330 Subject: [PATCH 04/44] Add Gibbs Sampling, Finish Sampling from Dist --- .../Images/Unit_Length_Segment_Partition.png | Bin 0 -> 10873 bytes .../10_bayesian_networks_sampling/index.md | 52 +++++++++++------- 2 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 notebooks/10_bayesian_networks_sampling/Images/Unit_Length_Segment_Partition.png diff --git a/notebooks/10_bayesian_networks_sampling/Images/Unit_Length_Segment_Partition.png b/notebooks/10_bayesian_networks_sampling/Images/Unit_Length_Segment_Partition.png new file mode 100644 index 0000000000000000000000000000000000000000..b72f92279c26b31a86495d1533ce97d5ac84371a GIT binary patch literal 10873 zcmeHsXIPWXvvdy|eKBoIm{3B8Gc2#AQF(vjXlx)eb`KOwCCjI@GZMkIEai%Dpd8pVQ4s=^i}^wBu^5SY-Kmt!63hw z&OD#dG(Q!d`(^8+*h?X}hv>3~!9m$DCTf3s=;=O7XMzt&|Ig*7Uxz90 z-W~7xzt0roG7DQfQI6;~d+Ov-`|2IYHiC~3wgZZa{+fg{~p_b79nd>xEP zitp`w%{UY_s_o|`PEx$h;235Q!y<@D!gw3EwOIR$bBpu|FF3@={iuJWvjRWf6D-=_b@#Es79EzBd|K}vnxFTw-Mo^2 zBxqUYa8C{%NO_6c^Uf}xW}?*KXRd>yb^&(UxmvN#&S6{>XK(_!<=uGgs{0$FS{A`= z5hu4ZRdgPrGFzj2FK-^@&Bc1e3SI?q>_ zWVK9bpB_E{MT%AQX3abg5z~3E=L&XtYFclpCD0W6uB^qtNX=}r(5vtWW$^2ys?O!O z@7a|7szBG{smJb+`5XRhgFg`o6IC`lmAGogKb5^>=lB-xyv3nF{Rq9ag(!Mk=pNHs1=8m)uJ+9JD`s2}J%RTaoc)cP!QC_A5y?ydu@K1Cm5VqzJgK$MR_H&)1zAM4 z+xJxsRW29`8Iuerh<(G!9>LG?@LgHU^s2=y{e4DGcs=caX$w} zSE;z31t0p>b)z`q^9UYVX!c28>tpgX-t-KvEZ@{NSE)v6w&Up+bAz$66gS>G$%;w^ zL*B)wd8$Pf=3q(qe@>AGbs?2qwxYK$w=Od=HH!>Xml@5hv`>-UOTA1Y!^b-7xfiiE z!HG8k&t0x4pPCR=Dj|QY>-WuS2=!elMLZfL8D>Aa6pMcu6((ELWlE5L`G?S={1+Ms zwI>t4$9tExs6KNMd$yKd~GF zjU4urn!YZv2x*CEGskXJH_ls7HgiW(yZNZsz2TkjUf@McqR^B#;w|U%?g)UDUr|eQyDy}Hl5>@8=>++51o1t z)2fnoOrPZJt3N4Zv?%`NclVTN_e@frxM=SMut}GrfX!H6RYeGHZwG-{*qb9DZgvj9 zW(@*~h`Tw!;5G;>ojJl1g%)L4udZXDLs^J2JmOX5RCSO>SfLa=oDkX`YC3Qa8@Qka zgSZ&Jh?@`qV28lM=-ljV(HJ2&QHBd#A>jG^H3tLT1q;?jltEurgHGDs2|>pL;el|1 zW!+FN+zev)bRtd`NFgm5x!)mxU!n|FSgeB(2ZyVxE5sEFv3IiM;1U!RnJiK5Y9xh(6IYIym=H!OLkzAZ`3v+Xxzd9szzn9)1e}9_|Y$3%HP+y^|db@IJ~8W{Kc%KwDlA&b=U{ zfpSCG>dT;jNn?P36J_9o^8G(lgTGM)p%=t+UkOQSD2g(0Lpc9>qhSlfA^};V3@RwJ zv)f+;9ROb&3p;lN7avrBPf$RBmzR&5n@8Zc>0aRJA)J0wfg8fb3E}>Ya_&(f#dEzC z5GYG4U=qKp@E73`$^vWkm*N)$z;b{WVdrZI5P6{pU^pRZCj<;@@1$dIZ!5}hE|l(E z*2U7J6ZtIy6i^s|!~J|U{=OciV3xoA`fYjIqAo~ubQeoX2nPR62nObYu(%KejQfoQ zw}PQ95kT(wJ$nCmkNO`X1Hr>9$j6K10wa0MpJ_)@eU2lPZ#xoLPiXYs$B{~H z;K{YQ+l?JnVJ0=_t6+1fV|Ys3pp(j7@aalK7n;oc>_hg;I7~n73){OB9=p1?Bhcr1R_vtWbgJDP4lAf^-6dpud{Ed z-)hlO&Ge#QE^2iTEz!#^(n~rHjHszCZg^WrW+mX!a>Vg1>UecSwo*?@OsilAi5mV?_@t6cq%J&958UA6zeO~PkqCvZCP{*LZy3nQ~_1qZx_8fzl|p|`J4)S*u6M z<##EXvgm@+XOrrZyU`^EQCGsDpT8Z?B=1RjgS(#|(%EX7!gNnk`?N!Lc%WX5ZPrs( zmNppaarUY=7tO`R#lXOTr3&PM=&5~8D9?_2WT--8-UT(EQy|BmQcw8zJ*G*!%jGPZ`&T>6@3_G0TuM(JIHp4De& z^M}i(Jsq8$OwR@~(YZ)!?e33sf>$Nd@K&X85olIh-dnqCKW_QYG%`NOM%1{fn(P{gOjcG|Q@ z?Ds-eR7a0vO*k`id#pMWMcGM$znD8>Fc>r%5=$YWo+oVB)Ag30ainOsQ}I@VEAAB) z;STTEY%b5K(atg=-8;Ttd!jrPtPnESU={ZF(g;G(l9GN>$=C4li%Uy)c6QoZTcwO} z7yR*5mk1v02OVxDWfj^|l=;*gar)Z)tP8Aj*LT#{K^NiXXA@CHE#bRs2i9cgWh}Pu zdMXn|J*zVExTZR?4JcR>9~n9G;|CoX{&o8L`uaG2`&#d#^89=-)$RA5)h0tK*Bndv z2FEKtBQ?D+{;@}Fr5R!Z&iQDGt;&`&o_VKU@%72hA+K@SitOyg-gIRyE-pes!T@3- zA|h$&#=N{d*GX?m!W-S6P%U#jR2H~c|GLQG9Tq&h%zXFvDxw%>z6WRBwv&79i?wSh zadC0EI&4ID1sr~S_G=L?DJhW;zt=J4(A^9gkIql0kCS~fY3Fg+9VSfZq9@mGmXK!K z^OZKs7EIU^dnoZ3MmBdeq_hiI(+AU8@Qr0siG%4VlDeNtw6&Y+NxPQ6j07+ziAt(OPEF}m zhhM)uU$yG^WYE{2NV&KZsKcWwKJm6~PAeNYv48*cW@E#FfPmm(CT=%gB%=rAM2=ac z=7h(*xG!sA6#pm6)}25a!j2^bp3)VHXVP9CDXhEQ37)MDIUe(-V|z6UnMsQ|14}J4 z&A???z$?E?c&By6UFN|})9{v;-{!UwMSI@hRF&NJ^^tnsQM}XpP;s0%De+-Qe2t## zv9+DotH-4uDf?3Lb8IHu@?I0C40cznvxXbzRbtdDy<^`M;h^8=QYzU{mC-yQPO-95 zJTl49>x*Ovcmb)(x3orZ8%)-EgC8c|jk$i~Mtgg^i1*>n^IMGF?V$0|C8EPCRfa19 z-k!T%2sYkTwjbU{l63*Z)K{N*lw>%bPMAwQ$B84+ry|61ow4-R)}`K|(o`p#$Qg10 zg)ktS<8eBFQj1|}f7nhW4y73qodH=(V!od4I*_+QAm`nhuPjp}eH-wYwoRcmFf?R8 zQFG9rtu6oZuA-7sNZ5Ikt-{%nk(8`2FsbhRY1-Re`hAj_p1yu)=v_?m&-wZFiBCtz zO>GZD@NaBT3%lgKdq-)g;TtdHY<+fm@~(g))*(#VAMe3~2dH(eF-0K+y{?>`oVj^Q zYHDhBc6LNWgj8}?LBZbU=5UE6QQ|aS_iDa=k$KNFhrx*))wP;y$vV6wISW5lx-1{+ ze|UmQhM3m4&E@cxE<0SZA(FCslPBSQ@_9ONd%iu!-=!Z`lv-WO^TOwpewn zt@f#lk7JIht|!W8)gcXyavrosnx&oEC>tBcqshjjqoYSg42g)sE#sS##CYv~mS%ml z;^C91=>Oh*dz!R0)U<7JYU>OA?un7JXUljcruq?w+}P#Rs;ZIZ=4Lh@=F#JCMPJ^I zOlQ1UVvbJG7-mFF`;S0^IyKKax?d(>ANtsDV zND|$3tk}m&`16CFhwoioc-u)UZaJ7KzN^#pAmBqs;HOU$W7XzOACskHh^-Cf3$Jv7D<1^VH^k2H^f7Q;KRaRCeY|4Oc?tYm` z8|~=dsq7LdE-tQmD zZcb!*{bHZNi!j1u2Aza!yN27k-^!ZjX?Sh3_xCoQBbv9rv^rt7si+fOqg2^NkB+K> zpqsIw(m^*DTbt-qZt~7g98e8lj;x6YCVqwmJtL$Zobs)hna3V@`RMCMr>D>L1p!gE zKszfApHM-TOFn-50|-v%6m~|PfYx@6?d>f~uj1$AWpgp|gg$Y#cB@0uSBa2PSurs& zXGf^wr7+&EQ{=I8Z*6}*ux@Us6#FInDP{Ktzige=;I|u#F5aCaJnhoYP^;h(|1P?P zL=}apwoH=L%oO$|h8VD?R_sXE4mYIX`t*xz^ znwrA59I8}FGNAWIY;0^E>`rc&b%oT^bpEy$_Q2QJl9y(PTALrn9vvbGfy?_5C0|jiN!otE#L58}z45sVWP6A%c*zV4)4 zD!Dtq;)JbUJyGOfxv&oDmNn_UpYZOyJyK9m@bM9gls2hACsdy|Ph(?aXJ_7RVF?cp zpdce}6#hK>EfUaG^`bR4G(_KB3M8PEl9G~P(A3b-fWhdYGh-iM{)?scxL_QPbQM!<`;Ju-?haUP@49+`i#n@=jP_-=jWG2@_hUD zjg(ofKUwnl-BmLk9kM%jzRhgDBE5(dZY1y!`wXuIm#{ zmGK#icc4g>Sf1c-G!nuC^Gi$CFj)OYEgMO&69yA=R+N*QTT)&w=Du}bwJ(m(4*&Xf znA5UNQ%eg6kiv^t0pYw{T$S$IOsaim-n#=?nyI&`m%c?Z2TH+YWdqB1XQrp4^~g-; zU45uS*MO=4*el9L$;ru?n3w>cJqlS<_CH%G=_S80T>S#6(xHa4Z|@v$+l-6h@T^4h_-U?ZT2R8}T{Ya427H_kbg#l#D{ z0*vrG)Jv^z*hxuA%SHjy%sB`ECD;o#{K9SFy0FGJK;^x?y%D=)4Sh2+-}MPmlRHK} zsEtXlZB=t~hHYtQ7nge?Zk+TosXgtnyzE?DMUD1L!+r*Hn{Giwv@RHou+QnDe6xogNL@0dOxT#@aaOc*oBB!}lYJRkvr)T(WuBS!GO6gi+Nwl=I>q|>iG&CKv zgUkUuJUsWAnF|d{o^>Fhd^%!Db=CuH;^N}M!qs-8<=zK#?_Ll(pBH>DY5EfJe9uny zt;-JAOpxPd+s;1o6-5iyJh9AsSiAL=g8Dk8ETVfNw|T9}LYoZBtjQatY4~jQQK-d+ zKmtZa#-!7;8`qsr4tI?q`~E~?kA3hqfLi(M*Nv^MX$OH&3UHOjuC=V}6{xgswhl14 zL}6DnV0bStFUkq34PBw7a=TF=upd9Bi!?d|s##W6R+8YfoSdalj@sK|UIK7&?Ww6L zAYdDVh=Bj&Dn5MpvFY~g*)tilvZ4hc0fDh9XXR=WU0nnas%Ufp`?^8UQ(sgTPDRQz^71ke!$6fME3=HH^ zU7xI*Y-&o+9i*)(-K7=t`id-3R#Lis8YASflLZt+y1L}5eMft%%YB*Zl#oR?$1IXy z85S}&GW;;P$fzhDL@OEc?X#ingvmW&EfnSR>Z&R^S=sSVp6>=()$uqY6iTJbUa(bh z+;mObu4>aw(rKR7rrsb<<7kRC7%nps@DLqXwku!Ud>s&ZK!@i{pZ z6c!Gr6*sNU(6SGOpkD&1`16Y3`N{mR^SDIMs!lZYD(JD;5h|1aUarhNZ0&-}l;~@K zYbSRB7le(%Ez(bn4G{s#;?K~_53i3L96@FQC|OE?<*!cTJkv+N^d|$*ZFu+JlxT$( z-**=6xPc^GCZ)YEp?1#jp0Vh(CbuDK{edmTu5$5NS?ghVh2o(;b*KsW6)kXS&~278 zT4A4=);~X|+1yOwk4KQ9Zh42A5xiQD)C_nP#~YSOus#Q&nYFT8LAD(&)~sZXS(A<5 zJVN-BeO~U*v%Xi0?4Ju^SGZETs~jqOEtxmAc(D%^*6e=dazxI4FJ2HcKWZNl=VIN{ z9YBmHw%ajDp5I6q zDJe;Pee0Q%Sh%@g#qVW(Cl+E&;inIfy~S^Ik3P*Heb`m+?St&bcr;$a26qjUmVxG0 z`1bdQd|EiG!ZbGY0k;K(gzQI~%YR|oBU2oN2B(fs9rxBQ4aB9~8=<-((09e;^&^id z`!(38*w|AYi8%KJ@kvH{KjH>%uBn4Vu@U9IvTE13%a`fIX_m)&CEeSuirQ+08@ZAX ze~y7HJQ=%ECq8kHTHqOQ)XIvWSkQOXD@51$j63h6(^B9ucS<^53~$Q|Hf7AVktz8F z(mOqc0w!M%Ia;kKL!n;gKB5*9prfXl2F~MRCBF80qErQscuGGQL8o@4Kw3 ztQUJnypQe<6}EhL!rNMgH)mwU2&Xj_H}?fPo28M5UoW4cO3}yOICjGUCEOqVAQ=%c zRqDw2=)M%6(5v8E!mI0IW@+QMi+7$r2#0#S`mqgrsXzdnxE2bTvP+R|ZxgRyw+@_! zx$LD{-y)MKa*!It8MAfwJX`Y@c@KmmvDDWSQs(D!jOwayGBd;`7Gol%Hys=a&S}^z zQ|*kMSnezCpakGPD(oQ;pfy*c&;Akcf4hJpGf4wTe~aN$&oi7`XXN*Pm@~_sQxs*@ KWD2AnKm9LQQv%-r literal 0 HcmV?d00001 diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 017c1de6..af45d2c4 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -22,12 +22,14 @@ Table of Contents ============== -- [Introduction](#Introduction) -- [Basic Idea](#Basic-Idea) -- [Prior Sampling](#Prior-Sampling) -- [Rejection Sampling](#Rejection-Sampling) -- [Likelihood Weighting](#Likelihood-Weighting) -- [Gibbs Sampling](#Gibbs-Sampling) +- [Table of Contents](#table-of-contents) +- [Introduction](#introduction) +- [Basic Idea](#basic-idea) +- [Sampling from Given Distribution](#sampling-from-given-distribution) +- [Prior Sampling](#prior-sampling) +- [Rejection Sampling](#rejection-sampling) +- [Likelihood Weighting](#likelihood-weighting) +- [Gibbs Sampling](#gibbs-sampling) # Introduction @@ -41,35 +43,35 @@ sampling. # Basic Idea -To compute an approximate posterior probability, one -approach is to simulate the Bayes' Net's joint -distribution. This can be achieved by drawing many samples -from the joint distribution. Using these samples, we can -approximate the probability of certain events. +To compute an approximate posterior probability, one approach is to simulate the Bayes' Net's joint distribution. This can be achieved by drawing many samples from the joint distribution. Using these samples, we can approximate the probability of certain events. Sampling has two main advantages: -- Learning: By getting samples from an unknown -distribution, we can learn the associated probabilities. -- Performance: Getting a sample is much faster than -computing the right answer. +- Learning: By getting samples from an unknown distribution, we can learn the associated probabilities. +- Performance: Getting a sample is much faster than computing the right answer. -The primitive element in any sampling algorithm is the -generation of samples from a known -probability distribution. So the step-by-step algorithm is -described in the following section. +The primitive element in any sampling algorithm is the generation of samples from a known probability distribution. So the step-by-step algorithm is described in the following section. # Sampling from Given Distribution +Consider the example of picking random colored cubes from a large bag of them. The probrability distribution of the colors of these cubes is given in the table below. In this setting, sampling is analogous to picking a random cube from said bag so that the probabilities are taken into account.
| C | P(C) | |:-----: |:----: | -| red | 0.6 | -| green | 0.1 | +| green | 0.6 | +| red | 0.1 | | blue | 0.3 |
+In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed and determine the sample based on that. As shown in the figure below, the unit length segment is partitioned into parts named $l_i$, each having length equal to $p_i$. These $p_i$s represent the probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, we have indexed the values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. + +![Partition of the Unit Length Segment](Images/Unit_Length_Segment_Partition.png "Partition of the Unit Length Segment") + +We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_i$. Since we chose the seed from a uniform distribution, it can be shown that the probability of the sample being equal to $c_i$ is $Pr(C=c_i)$. + +Thus, using uniform distributions in this manner, we can generate samples from a given distribution having the same corresponding probabilities. + # Prior Sampling # Rejection Sampling @@ -77,3 +79,11 @@ described in the following section. # Likelihood Weighting # Gibbs Sampling +The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is special case of the Metropolis-Hastings algorithm. + +Suppose we want to draw a sample $X = (x_1, ..., x_n)$ from the distribution $Pr(X_{Query} | X_{Evidence} = Observations)$, where $X_{Query}$ and $X_{Evidence}$ are the query and evidence variables, respectively. The algorithm operates as follows: + +- Start from an arbitrary sample $X^{(1)} = (x_1^{(1)}, ..., x_n^{(1)})$, satisfying the $X_{Evidence} = Observations$ equality. +- Assume the last sample generated was $X^{(t)}$. We want to calculate the next sample, namely, $X^{(t+1)}$. Sample one **non-evidence variable** $x_i^{(t+1)}$ at a time, conditioned on all the others being $x_j^{(t+1)} = x_j^{(t)}$. In other words, we sample $x_i^{(t+1)}$ from $Pr(x_i | x_1^{(t)}, ..., x_{i-1}^{(t)}, x_{i+1}^{(t)}, ..., x_n^{(t)})$. + +It can be shown that as $t$ becomes larger, $X^{(t)}$ approximates the distribution of $Pr(X_{Query} | X_{Evidence} = Observations)$. \ No newline at end of file From d195851b56533f5657a3e72168989433704a9ffd Mon Sep 17 00:00:00 2001 From: Alireza Date: Sun, 5 Dec 2021 16:40:54 +0330 Subject: [PATCH 05/44] finish introduction --- notebooks/10_bayesian_networks_sampling/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index af45d2c4..dd9d787f 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -39,7 +39,11 @@ problem. The natural approach now would be to try and approximate the posterior probability. There are several approximation methods for this problem, of which we will discuss the ones based on randomized -sampling. +sampling. The rest of the note is layed out as follows: +- We give intuition about the basic idea behind sampling. +- We describe the building block of every sampling algorithm, namely, sampling from a given distribution. +- We explain four standard methods of sampling in Bayes' Nets. + # Basic Idea From 98d2319701183c4f577638b5f4f67148b47ea7a9 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sun, 5 Dec 2021 18:03:13 +0330 Subject: [PATCH 06/44] Do Prior Sampling --- .../10_bayesian_networks_sampling/index.md | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index dd9d787f..4285f690 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -68,7 +68,12 @@ Consider the example of picking random colored cubes from a large bag of them. T -In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed and determine the sample based on that. As shown in the figure below, the unit length segment is partitioned into parts named $l_i$, each having length equal to $p_i$. These $p_i$s represent the probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, we have indexed the values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. +In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed +and determine the sample based on that. As shown in the figure below, the unit length segment is +partitioned into parts named $l_i$, each having length equal to $p_i$. These $p_i$s represent the +probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, we have indexed the +values that the random variable $C$ can take and defined the probabilities based on them. Here, we have +$c_1 = green$, $c_2 = red$ and $c_3 = blue$. ![Partition of the Unit Length Segment](Images/Unit_Length_Segment_Partition.png "Partition of the Unit Length Segment") @@ -77,9 +82,46 @@ We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_ Thus, using uniform distributions in this manner, we can generate samples from a given distribution having the same corresponding probabilities. # Prior Sampling +Now we're ready to tackle the sampling problem! Suppose we want to sample from the joint distribution +of the Bayes' Net, $Pr(x_1,...,x_n)$. + +Consider the following process: + +1.  For i = 1 to n + +2.   Sample $x_i$ from $Pr(x_i | parents(x_i))$ + +3.  Return $(x_1,...,x_n)$ + +This process generates a sample $X=(x_1,...,x_n)$ with the following probability: +$$ +S_{PS}(x_1,...,x_n) = \prod_{i=1}^{n}Pr(x_i|parents(x_i)) = Pr(x_1,...,x_n), +$$ +which is the Bayes' Net's joint probability. + +Now we need to prove that the samples are realizations of I.I.D (Independent, Identically Distributed) random variables. +1. Since we choose a new random number for every sample, thus samples are independent from each other. +2. It has been also shown that they are identically distributed because of the formula above. + +Suppose we have drawn $N$ samples from the joint distribution. Let the number of samples of an event be +$N_{PS}(x_1,...,x_n)$. + +So based on the law of large numbers, we have: +$$ +lim_{N\to\infty}\hat{Pr}(x_1,...,x_n) = lim_{N\to\infty} \frac{N_{PS}(x_1,...,x_n)}{N} +$$ +$$ += S_{PS}(x_1,...,x_n) = Pr(x_1,...,x_n), +$$ + +hence, the sampling procedure is consistent with the joint distribution. + +It is apparent that this algorithm is faster than its exact counter-parts. Since we have the joint distribution, we can calculate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. # Rejection Sampling + + # Likelihood Weighting # Gibbs Sampling From 8cb79231358930c68b5ca4852dbb7c87504ec216 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Thu, 16 Dec 2021 21:48:35 +0330 Subject: [PATCH 07/44] Write Gibbs, Conclusion and Refs --- .../10_bayesian_networks_sampling/index.md | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 4285f690..429294d1 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -30,6 +30,8 @@ Table of Contents - [Rejection Sampling](#rejection-sampling) - [Likelihood Weighting](#likelihood-weighting) - [Gibbs Sampling](#gibbs-sampling) +- [Conclusion](#conclusion) +- [References and Further Reading](#references-and-further-reading) # Introduction @@ -40,9 +42,9 @@ and approximate the posterior probability. There are several approximation methods for this problem, of which we will discuss the ones based on randomized sampling. The rest of the note is layed out as follows: -- We give intuition about the basic idea behind sampling. +- We give intuition about the basic idea behind sampling, and why it is an attractive solution concept. - We describe the building block of every sampling algorithm, namely, sampling from a given distribution. -- We explain four standard methods of sampling in Bayes' Nets. +- We explain four standard methods of sampling in Bayes' Nets, stating their pros and cons. # Basic Idea @@ -116,7 +118,7 @@ $$ hence, the sampling procedure is consistent with the joint distribution. -It is apparent that this algorithm is faster than its exact counter-parts. Since we have the joint distribution, we can calculate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. +It is apparent that this algorithm is faster than its exact counter-parts. Since we can sample the joint distribution, we can approximate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. # Rejection Sampling @@ -125,11 +127,50 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since # Likelihood Weighting # Gibbs Sampling -The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is special case of the Metropolis-Hastings algorithm. +The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm. Suppose we want to draw a sample $X = (x_1, ..., x_n)$ from the distribution $Pr(X_{Query} | X_{Evidence} = Observations)$, where $X_{Query}$ and $X_{Evidence}$ are the query and evidence variables, respectively. The algorithm operates as follows: -- Start from an arbitrary sample $X^{(1)} = (x_1^{(1)}, ..., x_n^{(1)})$, satisfying the $X_{Evidence} = Observations$ equality. -- Assume the last sample generated was $X^{(t)}$. We want to calculate the next sample, namely, $X^{(t+1)}$. Sample one **non-evidence variable** $x_i^{(t+1)}$ at a time, conditioned on all the others being $x_j^{(t+1)} = x_j^{(t)}$. In other words, we sample $x_i^{(t+1)}$ from $Pr(x_i | x_1^{(t)}, ..., x_{i-1}^{(t)}, x_{i+1}^{(t)}, ..., x_n^{(t)})$. +1. Start from an arbitrary sample $X^{(1)} = (x_1^{(1)}, ..., x_n^{(1)})$, satisfying the $X_{Evidence} = Observations$ equality. +2. Assume that the last sample generated in out sample chain was $X^{(t)}$. We want to calculate the next sample, namely, $X^{(t+1)}$. Sample one **non-evidence variable** $x_i^{(t+1)}$ at a time, conditioned on all the others being $x_j^{(t+1)} = x_j^{(t)}$. In other words, we sample $x_i^{(t+1)}$ from $Pr(x_i | x_1^{(t)}, ..., x_{i-1}^{(t)}, x_{i+1}^{(t)}, ..., x_n^{(t)})$. -It can be shown that as $t$ becomes larger, $X^{(t)}$ approximates the distribution of $Pr(X_{Query} | X_{Evidence} = Observations)$. \ No newline at end of file +The main idea of Gibbs sampling is the second step of the algorithm. It turns out that the specified probability can be calculated easily, since we have + +$$ +Pr(x_i | x_1^{(t)}, ..., x_{i-1}^{(t)}, x_{i+1}^{(t)}, ..., x_n^{(t)}) +$$ + +$$ + = \frac{Pr(x_i|parents(x_i^{(t)})) \times \prod_{j \neq i}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))}{\sum_x Pr(x_1^{(t)}, ..., x_{i-1}^{(t)}, x, x_{i+1}^{(t)}, ..., x_n^{(t)})} +$$ + +$$ + = \frac{Pr(x_i|parents(x_i^{(t)})) \times \prod_{j \neq i}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))}{\sum_x [Pr(x_i=x|parents(x_i^{(t)})) \times \prod_{j \neq i}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))]} +$$ + +$$ + = \frac{Pr(x_i|parents(x_i^{(t)})) \times \prod_{x_j \in children(x_i)}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))}{\sum_x [Pr(x_i=x|parents(x_i^{(t)})) \times \prod_{x_j \in children(x_i)}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))]}. +$$ + +Here, $parents'$ represents the values of the parents of the variables in $X^{(t)}$, replacing $x_i^{(t)}$ with the current relevant value of $x_i$. For example, this relevant value in the numerator is $x_i$ itself, while the value in denominator is the $x$ in the summation. As it is shown in the equation, the clauses corresponding to CPTs not including $x_i$ all cancel out. + +This cancellation will only leave the CPTs mentioning $x_i$, namely, the CPT of $x_i$ itself and the CPTs of its children. These CPTs are often referred to as the **Markov blanket** of $x_i$. + +Since the denominator is only a normalization factor, we can simply calculate the numerator by using a join operation on the Markov blanket of $x_i$! Note that the CPTs of the children of $x_i$ are all fully conditioned except for $x_i$, which we are calculating the distribution for. This means that the size of the pruned CPTs are small. (equal to $|D_i|$) As was shown in the equations, to calculate the probabilities, we only need to multiply the corresponding entries. This means that the join process of the CPTs won't introduce a large CPT and can be done efficiently. For an example of this process, refer to [the 67th slide here](http://ce.sharif.edu/courses/99-00/1/ce417-2/resources/root/Slides/PDF/Session%2013_14.pdf). + +It can be shown that as $t$ approaches infinity, $X^{(t)}$ approximates the distribution of $Pr(X_{Query} | X_{Evidence} = Observations)$. The proof is based on the fact that Gibbs sampling is actually simulating a Markov chain, therefore coverging to the steady state of the chain. However, it must be proven that the steady state probability distribution of this Markov chain is actually the same as the probability distribution $Pr(X_{Query} | X_{Evidence} = Observations)$. For a detailed proof, please refer to [this lecture note](https://ocw.mit.edu/courses/economics/14-384-time-series-analysis-fall-2013/lecture-notes/MIT14_384F13_lec26.pdf). + +This updating procedure takes into account both upstream and downstream evidences in the Bayes' net, since each update conditions on every variable. This property fixes the problem of Likelihood Weighting, i.e., only conditioning on upstream variables. Thus, Gibbs sampling has better sampling efficiency (sum of the weights of the samples is larger, therefore generating more effective samples), creating more useful data to be used in approximation. + +In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent the desired distribution. Furthermore, they may not be independent of the other samples $X'$ generated with the Gibbs method, because of the arbitrary choice of $X^{(1)}$. This begining of the chain is referred to as the **burn-in period**, and the samples generated here are generally not used as the desired $X$. So, $X$ is usually selected from the $X^{(t)}$ outside this period. However, this creates a time overhead, since the burn-in period could be somewhat large. + +In a more general sense, Gibbs Sampling and Metropolis-Hastings are classified as *Markov Chain Monte Carlo* algorithms. Monte Carlo algorithms are basically the same as sampling. For more information, please refer to this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf). + +# Conclusion +In this lecture note, we studied (randomized) approximation algorithms for inference in Bayes' nets. The main idea behind these methods was sampling, which enables fast approximation of event distributions. After describing the building block of sampling algorithms, four prominent methods of this type were studied, namely, Prior sampling, Rejection sampling, Likelihood Weighting and Gibbs sampling. The pros and cons of these methods were discussed, giving a somewhat complete picture as to what method performs the best in certain situations. + +# References and Further Reading +- Artificial Intelligence, Sharif University of Technology, CE417-1, By Dr. Rohban. (Specifically, this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)) +- Artificial Intelligence: A Mordern Approach (3rd Ed.), By Stuart Russel & Peter Norvig. +- Time Series Analysis, Massachusetts Institute of Technology, By Prof. Mikusheva. (Specifically, this [lecture note on Gibbs Sampling](https://ocw.mit.edu/courses/economics/14-384-time-series-analysis-fall-2013/lecture-notes/MIT14_384F13_lec26.pdf)) +- Statistics, University of Minnesota, 8931m By Prof. Geyer. (Specifically, this [lecture note on MCMCs](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)) \ No newline at end of file From 58a31b633eba710287bc9e682e986cf989179af4 Mon Sep 17 00:00:00 2001 From: Ali Najibi Date: Thu, 16 Dec 2021 22:38:16 +0330 Subject: [PATCH 08/44] finished Likelihood and Rejection --- .../10_bayesian_networks_sampling/index.md | 67 +++++++++++++++++-- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 429294d1..f4ae0403 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -30,8 +30,6 @@ Table of Contents - [Rejection Sampling](#rejection-sampling) - [Likelihood Weighting](#likelihood-weighting) - [Gibbs Sampling](#gibbs-sampling) -- [Conclusion](#conclusion) -- [References and Further Reading](#references-and-further-reading) # Introduction @@ -42,9 +40,9 @@ and approximate the posterior probability. There are several approximation methods for this problem, of which we will discuss the ones based on randomized sampling. The rest of the note is layed out as follows: -- We give intuition about the basic idea behind sampling, and why it is an attractive solution concept. +- We give intuition about the basic idea behind sampling. - We describe the building block of every sampling algorithm, namely, sampling from a given distribution. -- We explain four standard methods of sampling in Bayes' Nets, stating their pros and cons. +- We explain four standard methods of sampling in Bayes' Nets. # Basic Idea @@ -118,14 +116,73 @@ $$ hence, the sampling procedure is consistent with the joint distribution. -It is apparent that this algorithm is faster than its exact counter-parts. Since we can sample the joint distribution, we can approximate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. +It is apparent that this algorithm is faster than its exact counter-parts. Since we have the joint distribution, we can calculate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. # Rejection Sampling +One minor problem with Prior Sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. +A simple idea is to reject incosistent samples whilst samling, to achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. +Consider the following process: + +1.  For i = 1 to n + +2.   Sample $x_i$ from $Pr(x_i | parents(x_i))$ + +3.   if $x_i$ not consistent with evidence: + +4.   return (no sample is generated in this cycle) + +5.  Return $(x_1,...,x_n)$ + +It is also consistent for conditional probabilities. # Likelihood Weighting +If we look closer to the problem with Prior Sampling, which lead us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. + +As previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of weight of consistent samples with query divided by sum of weight of all samples to calculate $P(Query|Evidence)$. + +1.  w = 1.0 + +2.  For i = 1 to n + +3.   if $X_i$ is an evidence variable + +4.   $X_i$ = observation $x_i$ for $X_i$ + +5.   Set w = w * $P(x_i|parents(x_i))$ + +6.   else + +7.   Sample $x_i$ from $Pr(x_i | parents(x_i))$ + +8.  Return $(x_1,...,x_n)$, w + +To prove consistency: + +For each Sample with Query $Q_1, ..., Q_n$ and evidence $E_1, ..., E_n$ we have: + +This process generates a sample $X=(q_1,...,q_n,e_1,...,e_n)$ with the following probability: +$$ +S_{WS}(q_1,...,q_n,e_1,...,e_n) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) +$$ + +And the weight for each sample is: + +$$ +w(q_1,...,q_n,e_1,...,e_n) = \prod_{i=1}^{n}Pr(e_i|parents(E_i)) +$$ + +Together, weighted sampling distribution is consistent: + +$$ +S_{WS}(q_1,...,q_n,e_1,...,e_n) * w(q_1,...,q_n,e_1,...,e_n) +$$ +$$ +=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) = P(q_1,...,q_n,e_1,...,e_n) +$$ + # Gibbs Sampling The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm. From ca5727f844363f35d72c76f2afe8acde21eeae8a Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 17 Dec 2021 12:20:37 +0330 Subject: [PATCH 09/44] Change Accidental P to Pr --- notebooks/10_bayesian_networks_sampling/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index f4ae0403..ff83748e 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -60,7 +60,7 @@ The primitive element in any sampling algorithm is the generation of samples fro Consider the example of picking random colored cubes from a large bag of them. The probrability distribution of the colors of these cubes is given in the table below. In this setting, sampling is analogous to picking a random cube from said bag so that the probabilities are taken into account.
-| C | P(C) | +| C | Pr(C) | |:-----: |:----: | | green | 0.6 | | red | 0.1 | @@ -230,4 +230,4 @@ In this lecture note, we studied (randomized) approximation algorithms for infer - Artificial Intelligence, Sharif University of Technology, CE417-1, By Dr. Rohban. (Specifically, this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)) - Artificial Intelligence: A Mordern Approach (3rd Ed.), By Stuart Russel & Peter Norvig. - Time Series Analysis, Massachusetts Institute of Technology, By Prof. Mikusheva. (Specifically, this [lecture note on Gibbs Sampling](https://ocw.mit.edu/courses/economics/14-384-time-series-analysis-fall-2013/lecture-notes/MIT14_384F13_lec26.pdf)) -- Statistics, University of Minnesota, 8931m By Prof. Geyer. (Specifically, this [lecture note on MCMCs](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)) \ No newline at end of file +- Statistics, University of Minnesota, 8931m By Prof. Geyer. (Specifically, this [lecture note on MCMCs](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)) From 6085657c823912d5860d2763699d0c4bf97156ee Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 17 Dec 2021 12:22:45 +0330 Subject: [PATCH 10/44] Change More Accidental Ps --- notebooks/10_bayesian_networks_sampling/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index ff83748e..64881101 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -151,7 +151,7 @@ As previous method, we start with topological sorted nodes, and a weight variabl 4.   $X_i$ = observation $x_i$ for $X_i$ -5.   Set w = w * $P(x_i|parents(x_i))$ +5.   Set w = w * $Pr(x_i|parents(x_i))$ 6.   else @@ -180,7 +180,7 @@ $$ S_{WS}(q_1,...,q_n,e_1,...,e_n) * w(q_1,...,q_n,e_1,...,e_n) $$ $$ -=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) = P(q_1,...,q_n,e_1,...,e_n) +=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) = Pr(q_1,...,q_n,e_1,...,e_n) $$ # Gibbs Sampling From e59d6f68dedf9286b97d89c26a6bf1461ba96628 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 17 Dec 2021 12:28:52 +0330 Subject: [PATCH 11/44] Update metadata.yml --- notebooks/10_bayesian_networks_sampling/metadata.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml index 7e232a94..7de24ff1 100644 --- a/notebooks/10_bayesian_networks_sampling/metadata.yml +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -16,8 +16,8 @@ authors: - link: https://github.com/AlirezaTheBruh icon: fab fa-github # optionally add other contact information like - # - link: # contact link - # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) + - link: https://t.me/FekKonamAlirezaBezarCheckKonam # contact link + icon: fab fa-telegram # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) - name: # name of author role: Author # change this if you want @@ -26,8 +26,8 @@ authors: - link: https://github.com/n3slami icon: fab fa-github # optionally add other contact information like - # - link: # contact link - # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) + - link: https://t.me/NavidEsl # contact link + icon: fab fa-telegram # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) - name: # name of author role: Author # change this if you want @@ -36,8 +36,8 @@ authors: - link: https://github.com/anajibi icon: fab fa-github # optionally add other contact information like - # - link: # contact link - # icon: # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) + - link: https://t.me/alinjibi # contact link + icon: fab fa-telegram # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) comments: # enable comments for your post label: false From 9858d8f0249e947aebe54ac7d75e0acc62da6add Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 24 Dec 2021 17:37:29 +0330 Subject: [PATCH 12/44] Removed Table of Contents from Itself --- notebooks/10_bayesian_networks_sampling/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 64881101..4c293a79 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -22,7 +22,6 @@ Table of Contents ============== -- [Table of Contents](#table-of-contents) - [Introduction](#introduction) - [Basic Idea](#basic-idea) - [Sampling from Given Distribution](#sampling-from-given-distribution) From d45ee0e5d20959e511b2b7d346807e5fb33bd939 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 21:59:48 +0330 Subject: [PATCH 13/44] Add 'Sampling in Bayes' Nets' Bullet --- .../10_bayesian_networks_sampling/index.md | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 4c293a79..42bbe186 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -25,10 +25,11 @@ Table of Contents - [Introduction](#introduction) - [Basic Idea](#basic-idea) - [Sampling from Given Distribution](#sampling-from-given-distribution) -- [Prior Sampling](#prior-sampling) -- [Rejection Sampling](#rejection-sampling) -- [Likelihood Weighting](#likelihood-weighting) -- [Gibbs Sampling](#gibbs-sampling) +- [Sampling in Bayes' Nets](#sampling-in-bayes-nets) + - [Prior Sampling](#prior-sampling) + - [Rejection Sampling](#rejection-sampling) + - [Likelihood Weighting](#likelihood-weighting) + - [Gibbs Sampling](#gibbs-sampling) # Introduction @@ -80,7 +81,11 @@ We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_ Thus, using uniform distributions in this manner, we can generate samples from a given distribution having the same corresponding probabilities. -# Prior Sampling +# Sampling in Bayes' Nets + +We now explain the four standard methods of sampling in Bayes' Nets, namely, Prior Sampling, Rejection Sampling, Likelihood Weighting, & Gibbs Sampling. + +## Prior Sampling Now we're ready to tackle the sampling problem! Suppose we want to sample from the joint distribution of the Bayes' Net, $Pr(x_1,...,x_n)$. @@ -117,7 +122,7 @@ hence, the sampling procedure is consistent with the joint distribution. It is apparent that this algorithm is faster than its exact counter-parts. Since we have the joint distribution, we can calculate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. -# Rejection Sampling +## Rejection Sampling One minor problem with Prior Sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. A simple idea is to reject incosistent samples whilst samling, to achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. @@ -136,7 +141,7 @@ Consider the following process: It is also consistent for conditional probabilities. -# Likelihood Weighting +## Likelihood Weighting If we look closer to the problem with Prior Sampling, which lead us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. @@ -182,7 +187,7 @@ $$ =\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) = Pr(q_1,...,q_n,e_1,...,e_n) $$ -# Gibbs Sampling +## Gibbs Sampling The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm. Suppose we want to draw a sample $X = (x_1, ..., x_n)$ from the distribution $Pr(X_{Query} | X_{Evidence} = Observations)$, where $X_{Query}$ and $X_{Evidence}$ are the query and evidence variables, respectively. The algorithm operates as follows: From fa6e761befc96aef374cd4ac45038273530b5f20 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:02:21 +0330 Subject: [PATCH 14/44] Line 36: past -> previous --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 42bbe186..6198aed7 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -33,7 +33,7 @@ Table of Contents # Introduction -In the past lecture note, it was shown that Inference +In the previous lecture note, it was shown that Inference in Bayesian Networks, in general, is an intractable problem. The natural approach now would be to try and approximate the posterior probability. There are From 34144e068ae03e426a5a26df4f3c2d7c6eee5050 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:19:59 +0330 Subject: [PATCH 15/44] Add Conclusion & References to the table of contents. --- notebooks/10_bayesian_networks_sampling/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 42bbe186..cccd18cf 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -30,6 +30,8 @@ Table of Contents - [Rejection Sampling](#rejection-sampling) - [Likelihood Weighting](#likelihood-weighting) - [Gibbs Sampling](#gibbs-sampling) +- [Conclusion](#conclusion) +- [References and Further Reading](#references-and-further-reading) # Introduction @@ -70,7 +72,7 @@ Consider the example of picking random colored cubes from a large bag of them. T In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed and determine the sample based on that. As shown in the figure below, the unit length segment is -partitioned into parts named $l_i$, each having length equal to $p_i$. These $p_i$s represent the +partitioned into parts named $l_i$, each having length equal to $p_i$. These $p_i$ s represent the probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, we have indexed the values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. From 30c9c1316874c80ca755e0633abd5c3f7e66002e Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:24:30 +0330 Subject: [PATCH 16/44] CPT Abbreviation --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index e1b8d5e3..72998355 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -215,7 +215,7 @@ $$ = \frac{Pr(x_i|parents(x_i^{(t)})) \times \prod_{x_j \in children(x_i)}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))}{\sum_x [Pr(x_i=x|parents(x_i^{(t)})) \times \prod_{x_j \in children(x_i)}^n Pr(x_j^{(t)} | parents'(x_j^{(t)}))]}. $$ -Here, $parents'$ represents the values of the parents of the variables in $X^{(t)}$, replacing $x_i^{(t)}$ with the current relevant value of $x_i$. For example, this relevant value in the numerator is $x_i$ itself, while the value in denominator is the $x$ in the summation. As it is shown in the equation, the clauses corresponding to CPTs not including $x_i$ all cancel out. +Here, $parents'$ represents the values of the parents of the variables in $X^{(t)}$, replacing $x_i^{(t)}$ with the current relevant value of $x_i$. For example, this relevant value in the numerator is $x_i$ itself, while the value in denominator is the $x$ in the summation. As it is shown in the equation, the clauses corresponding to Conditional Probability Tables (CPTs) not including $x_i$ all cancel out. This cancellation will only leave the CPTs mentioning $x_i$, namely, the CPT of $x_i$ itself and the CPTs of its children. These CPTs are often referred to as the **Markov blanket** of $x_i$. From 8cf9f55cb222d027aa4f137f2b89cef17600ecae Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:29:23 +0330 Subject: [PATCH 17/44] Provide a Hyperlink for "Metropolis-Hastings" Algorithm --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 72998355..145c36d2 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -190,7 +190,7 @@ $$ $$ ## Gibbs Sampling -The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm. +The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm (See Page 62 of this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)). Suppose we want to draw a sample $X = (x_1, ..., x_n)$ from the distribution $Pr(X_{Query} | X_{Evidence} = Observations)$, where $X_{Query}$ and $X_{Evidence}$ are the query and evidence variables, respectively. The algorithm operates as follows: From db96ff5eaa41070b28f453dc5c2a4133967abe81 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:34:00 +0330 Subject: [PATCH 18/44] Fix Sum of ... Grammar Error --- notebooks/10_bayesian_networks_sampling/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 145c36d2..4c3cf3aa 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -147,7 +147,7 @@ It is also consistent for conditional probabilities. If we look closer to the problem with Prior Sampling, which lead us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. -As previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of weight of consistent samples with query divided by sum of weight of all samples to calculate $P(Query|Evidence)$. +As previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of consistent samples' weights with query divided by sum of all samples' weights to calculate $P(Query|Evidence)$. 1.  w = 1.0 @@ -223,7 +223,7 @@ Since the denominator is only a normalization factor, we can simply calculate th It can be shown that as $t$ approaches infinity, $X^{(t)}$ approximates the distribution of $Pr(X_{Query} | X_{Evidence} = Observations)$. The proof is based on the fact that Gibbs sampling is actually simulating a Markov chain, therefore coverging to the steady state of the chain. However, it must be proven that the steady state probability distribution of this Markov chain is actually the same as the probability distribution $Pr(X_{Query} | X_{Evidence} = Observations)$. For a detailed proof, please refer to [this lecture note](https://ocw.mit.edu/courses/economics/14-384-time-series-analysis-fall-2013/lecture-notes/MIT14_384F13_lec26.pdf). -This updating procedure takes into account both upstream and downstream evidences in the Bayes' net, since each update conditions on every variable. This property fixes the problem of Likelihood Weighting, i.e., only conditioning on upstream variables. Thus, Gibbs sampling has better sampling efficiency (sum of the weights of the samples is larger, therefore generating more effective samples), creating more useful data to be used in approximation. +This updating procedure takes into account both upstream and downstream evidences in the Bayes' net, since each update conditions on every variable. This property fixes the problem of Likelihood Weighting, i.e., only conditioning on upstream variables. Thus, Gibbs sampling has better sampling efficiency (sum of the samples' weights is larger, therefore generating more effective samples), creating more useful data to be used in approximation. In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent the desired distribution. Furthermore, they may not be independent of the other samples $X'$ generated with the Gibbs method, because of the arbitrary choice of $X^{(1)}$. This begining of the chain is referred to as the **burn-in period**, and the samples generated here are generally not used as the desired $X$. So, $X$ is usually selected from the $X^{(t)}$ outside this period. However, this creates a time overhead, since the burn-in period could be somewhat large. From ff535a251a70269dd77d36a18f1c3f72c7951aa2 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:36:04 +0330 Subject: [PATCH 19/44] As -> Same as --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 4c3cf3aa..2c9080c0 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -147,7 +147,7 @@ It is also consistent for conditional probabilities. If we look closer to the problem with Prior Sampling, which lead us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. -As previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of consistent samples' weights with query divided by sum of all samples' weights to calculate $P(Query|Evidence)$. +Same as the previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of consistent samples' weights with query divided by sum of all samples' weights to calculate $P(Query|Evidence)$. 1.  w = 1.0 From 02bf779071ff806e16fede58ae151f85ab191604 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:37:44 +0330 Subject: [PATCH 20/44] lead -> led --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 2c9080c0..51d1f350 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -145,7 +145,7 @@ It is also consistent for conditional probabilities. ## Likelihood Weighting -If we look closer to the problem with Prior Sampling, which lead us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. +If we look closer to the problem with Prior Sampling, which led us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. Same as the previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of consistent samples' weights with query divided by sum of all samples' weights to calculate $P(Query|Evidence)$. From ca658dbf496aabe59f756be758be6327f2ee964e Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:38:51 +0330 Subject: [PATCH 21/44] Samling -> Sampling --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 51d1f350..a519e3fd 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -127,7 +127,7 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since ## Rejection Sampling One minor problem with Prior Sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. -A simple idea is to reject incosistent samples whilst samling, to achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. +A simple idea is to reject incosistent samples whilst sampling, to achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. Consider the following process: From 90bcceffbc497e0934abee2d12a714698ad56516 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 22:41:49 +0330 Subject: [PATCH 22/44] Law of Large Numbers Hyperlink --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index a519e3fd..2a414cef 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -112,7 +112,7 @@ Now we need to prove that the samples are realizations of I.I.D (Independent, Id Suppose we have drawn $N$ samples from the joint distribution. Let the number of samples of an event be $N_{PS}(x_1,...,x_n)$. -So based on the law of large numbers, we have: +So based on [the law of large numbers](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwiJsZWq0__0AhU6iv0HHagPClYQFnoECAcQAQ&url=https%3A%2F%2Fwww.lakeheadu.ca%2Fsites%2Fdefault%2Ffiles%2Fuploads%2F77%2Fimages%2FSedor%2520Kelly.pdf&usg=AOvVaw1xaHZqZNyROrouGHyLduDl), we have: $$ lim_{N\to\infty}\hat{Pr}(x_1,...,x_n) = lim_{N\to\infty} \frac{N_{PS}(x_1,...,x_n)}{N} $$ From 57ba61d6dbb9e21235d042900a133d56ded3b978 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 23:11:52 +0330 Subject: [PATCH 23/44] Fix English --- .../10_bayesian_networks_sampling/index.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 2a414cef..6b74d928 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -126,8 +126,8 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since ## Rejection Sampling -One minor problem with Prior Sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. -A simple idea is to reject incosistent samples whilst sampling, to achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. +One minor problem with prior sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. +A simple idea is to reject incosistent samples whilst sampling; To achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. Consider the following process: @@ -137,17 +137,17 @@ Consider the following process: 3.   if $x_i$ not consistent with evidence: -4.   return (no sample is generated in this cycle) +4.   Return (no sample is generated in this cycle) 5.  Return $(x_1,...,x_n)$ -It is also consistent for conditional probabilities. +It is also consistent with conditional probabilities. ## Likelihood Weighting -If we look closer to the problem with Prior Sampling, which led us to Rejection Sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating sampling process many times to achieve the desired sample size. This problem brings us to Likelihood Weighting. The idea is to fix the evidence variables and sample the rest, But it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. +If we look closer to the problem with prior sampling, which led us to rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest, but it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. -Same as the previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (if not evidence) and for evidence variables, we just assign evidence value to it and multiply weight by $P(x_i|parents(x_i))$. At the end, we need to calculate sum of consistent samples' weights with query divided by sum of all samples' weights to calculate $P(Query|Evidence)$. +Same as the previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (non-evidence) and for evidence variables, we just assign the evidence value to it and multiply weight by $P(x_i|parents(x_i))$. In the end, we need to calculate the sum of consistent samples' weights with query divided by the sum of all samples' weights to calculate $P(Query|Evidence)$. 1.  w = 1.0 @@ -167,26 +167,26 @@ Same as the previous method, we start with topological sorted nodes, and a weigh To prove consistency: -For each Sample with Query $Q_1, ..., Q_n$ and evidence $E_1, ..., E_n$ we have: +For each sample with query $Q_1, ..., Q_n$ and evidence $E_1, ..., E_m$ we have: -This process generates a sample $X=(q_1,...,q_n,e_1,...,e_n)$ with the following probability: +This process generates a sample $X=(q_1,...,q_n,e_1,...,e_m)$ with the following probability: $$ -S_{WS}(q_1,...,q_n,e_1,...,e_n) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) +S_{WS}(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) $$ And the weight for each sample is: $$ -w(q_1,...,q_n,e_1,...,e_n) = \prod_{i=1}^{n}Pr(e_i|parents(E_i)) +w(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{m}Pr(e_i|parents(E_i)) $$ Together, weighted sampling distribution is consistent: $$ -S_{WS}(q_1,...,q_n,e_1,...,e_n) * w(q_1,...,q_n,e_1,...,e_n) +S_{WS}(q_1,...,q_n,e_1,...,e_m) * w(q_1,...,q_n,e_1,...,e_m) $$ $$ -=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) = Pr(q_1,...,q_n,e_1,...,e_n) +=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{m}Pr(e_i|parents(E_i)) = Pr(q_1,...,q_n,e_1,...,e_m) $$ ## Gibbs Sampling From 20028077e7374ee7cfd0e974fb3f0623eeb71031 Mon Sep 17 00:00:00 2001 From: Alireza Date: Sat, 25 Dec 2021 23:14:11 +0330 Subject: [PATCH 24/44] Revert 3 Paragraphs --- notebooks/10_bayesian_networks_sampling/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 6b74d928..ca6dcfb2 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -42,9 +42,9 @@ and approximate the posterior probability. There are several approximation methods for this problem, of which we will discuss the ones based on randomized sampling. The rest of the note is layed out as follows: -- We give intuition about the basic idea behind sampling. +- We give intuition about the basic idea behind sampling, and why it is an attractive solution concept. - We describe the building block of every sampling algorithm, namely, sampling from a given distribution. -- We explain four standard methods of sampling in Bayes' Nets. +- We explain four standard methods of sampling in Bayes' Nets, stating their pros and cons. # Basic Idea @@ -122,7 +122,7 @@ $$ hence, the sampling procedure is consistent with the joint distribution. -It is apparent that this algorithm is faster than its exact counter-parts. Since we have the joint distribution, we can calculate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. +It is apparent that this algorithm is faster than its exact counter-parts. Since we can sample the joint distribution, we can approximate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. ## Rejection Sampling From 81f8f60d27fc6e77f37fbc11657463448070d87d Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Mon, 27 Dec 2021 07:31:16 +0330 Subject: [PATCH 25/44] Add Examples to Gibbs and Likelihood, Fix Others --- .../10_bayesian_networks_sampling/index.md | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index ca6dcfb2..a12ab4dc 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -22,6 +22,7 @@ Table of Contents ============== +- [Table of Contents](#table-of-contents) - [Introduction](#introduction) - [Basic Idea](#basic-idea) - [Sampling from Given Distribution](#sampling-from-given-distribution) @@ -145,9 +146,9 @@ It is also consistent with conditional probabilities. ## Likelihood Weighting -If we look closer to the problem with prior sampling, which led us to rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest, but it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. +If we take a close look at the problem with prior sampling, which led us to the rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest, but it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. -Same as the previous method, we start with topological sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (non-evidence) and for evidence variables, we just assign the evidence value to it and multiply weight by $P(x_i|parents(x_i))$. In the end, we need to calculate the sum of consistent samples' weights with query divided by the sum of all samples' weights to calculate $P(Query|Evidence)$. +Same as the previous method, we start with topologically sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (non-evidence) and for evidence variables, we just assign the evidence value to it and multiply the weight by $P(x_i|parents(x_i))$. In the end, we need to calculate the sum of consistent samples' weights with query divided by the sum of all samples' weights to calculate $P(Query|Evidence)$. 1.  w = 1.0 @@ -161,34 +162,40 @@ Same as the previous method, we start with topological sorted nodes, and a weigh 6.   else -7.   Sample $x_i$ from $Pr(x_i | parents(x_i))$ +7.    Sample $x_i$ from $Pr(x_i | parents(x_i))$ 8.  Return $(x_1,...,x_n)$, w -To prove consistency: - -For each sample with query $Q_1, ..., Q_n$ and evidence $E_1, ..., E_m$ we have: - -This process generates a sample $X=(q_1,...,q_n,e_1,...,e_m)$ with the following probability: +The consistency of the algorithm is proven as follows. +For each sample with query variables $Q_1, ..., Q_n$ and evidence $E_1, ..., E_m$, +the process generates a sample $X=(q_1,...,q_n,e_1,...,e_m)$ with the following probability: $$ -S_{WS}(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)) +S_{WS}(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)). $$ -And the weight for each sample is: +Furthermore, the weight for each sample is: $$ -w(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{m}Pr(e_i|parents(E_i)) +w(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{m}Pr(e_i|parents(E_i)). $$ -Together, weighted sampling distribution is consistent: +Together, the weighted sampling distribution is consistent: $$ S_{WS}(q_1,...,q_n,e_1,...,e_m) * w(q_1,...,q_n,e_1,...,e_m) $$ $$ -=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{m}Pr(e_i|parents(E_i)) = Pr(q_1,...,q_n,e_1,...,e_m) +=\prod_{i=1}^{n}Pr(q_i|parents(Q_i)) \prod_{i=1}^{m}Pr(e_i|parents(E_i)) = Pr(q_1,...,q_n,e_1,...,e_m). $$ +Take the following Bayes' net as an example. +![Likelihood Weighting Bayes' Net Example](Images/Likelihood_Example_BN.png "Example Bayes' Net") +Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. + +Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. The, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. + +By repeating this procedure and calculating a weigth for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. + ## Gibbs Sampling The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm (See Page 62 of this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)). @@ -227,6 +234,22 @@ This updating procedure takes into account both upstream and downstream evidence In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent the desired distribution. Furthermore, they may not be independent of the other samples $X'$ generated with the Gibbs method, because of the arbitrary choice of $X^{(1)}$. This begining of the chain is referred to as the **burn-in period**, and the samples generated here are generally not used as the desired $X$. So, $X$ is usually selected from the $X^{(t)}$ outside this period. However, this creates a time overhead, since the burn-in period could be somewhat large. +Take the following Bayes' net as an example. +![Gibbs Sampling Bayes' Net Example](Images/Gibbs_Example_BN.png "Example Bayes' Net") +Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown, in green, variables set to false in red and variables selected for resampling in yellow. +![Gibbs Sampling Procedure](Images/Gibbs_Example_Procedure.png "Example Gibbs Sampling Procedure") +As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: +$$ +Pr(+b|+a, +e, +c, -d) +$$ +$$ + = \frac{Pr(+b | +a)Pr(-d | +b, +c)}{Pr(+b | +a)Pr(-d | +b, +c) + Pr(-b | +a)Pr(-d | -b, +c)} +$$ +$$ += \frac{0.8 \times 0.5}{0.8 \times 0.5 + 0.2 \times 0.9} = \frac{0.4}{0.58} \approx 0.689. +$$ +As it is shown, we only need to consider the terms in $B$'s Markov blanket. This is why the numerator is these terms for $+b$, while the denominator is the sum of these terms for $+b$ and $-b$. (Basically, the normalizing factor) Thus, based on the calculations, we can see that $B$ is resampled from the distribution $Pr(B | +a, +e, +c, -d)$, where $Pr(+b | +a, +e, +c, -d) \approx 0.689$. By repeating this procedure for other non-evidence variables for a number of iterations, namely, the burn-in value, we will eventually reach a sample from the distribution of the original Bayes' net. Finally, we repeat this sampling procedure to procure a healthy number of samples, and approximate the probability of the query by counting the number of consistent samples and dividing by the total number of samples. + In a more general sense, Gibbs Sampling and Metropolis-Hastings are classified as *Markov Chain Monte Carlo* algorithms. Monte Carlo algorithms are basically the same as sampling. For more information, please refer to this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf). # Conclusion From 0b78f50877b1a89cf416af4b9a18c0d484cb74c3 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Mon, 27 Dec 2021 07:41:32 +0330 Subject: [PATCH 26/44] Fix Some Problems with the Writing --- .../10_bayesian_networks_sampling/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index a12ab4dc..138fdd8b 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -127,8 +127,8 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since ## Rejection Sampling -One minor problem with prior sampling is that we keep samples which are not consistent with evidence and since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. -A simple idea is to reject incosistent samples whilst sampling; To achieve this goal, whenever an incosistent sample observed, we will ignore (reject) that sample. +The problem with prior sampling is that we keep samples which are not consistent with the evidence. Since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. +A simple idea is to reject incosistent samples whilst sampling. To achieve this goal, as soon as an incosistency in the sample is observed, we will ignore (reject) that sample. Consider the following process: @@ -142,15 +142,15 @@ Consider the following process: 5.  Return $(x_1,...,x_n)$ -It is also consistent with conditional probabilities. +This algorithm is also consistent with the conditional probabilities. ## Likelihood Weighting -If we take a close look at the problem with prior sampling, which led us to the rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest, but it will cause inconsistency with the distribution. The solution is to use a weight variable indicating the probability of evidences given their parents. +If we take a close look at the problem with prior sampling, which led us to the rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest. However, this might cause an inconsistency with the distribution. The solution is to use a weight variable indicating the probability of the evidence given their parents. -Same as the previous method, we start with topologically sorted nodes, and a weight variable equal to 1. At each step, we sample a variable (non-evidence) and for evidence variables, we just assign the evidence value to it and multiply the weight by $P(x_i|parents(x_i))$. In the end, we need to calculate the sum of consistent samples' weights with query divided by the sum of all samples' weights to calculate $P(Query|Evidence)$. +The algorithm is as follows. We start with topologically sorted nodes, and a weight variable $w$ equal to 1. At each step, we sample non-evidence variables and for evidence variables, we just assign the evidence value to it and multiply $w$ by $P(x_i|parents(x_i))$. In the end, we need to calculate the sum of consistent samples' weights with query divided by the sum of all samples' weights to calculate $P(Query|Evidence)$. -1.  w = 1.0 +1.  $w$ = 1.0 2.  For i = 1 to n @@ -158,16 +158,16 @@ Same as the previous method, we start with topologically sorted nodes, and a wei 4.   $X_i$ = observation $x_i$ for $X_i$ -5.   Set w = w * $Pr(x_i|parents(x_i))$ +5.   Set $w$ = $w$ * $Pr(x_i|parents(x_i))$ 6.   else 7.    Sample $x_i$ from $Pr(x_i | parents(x_i))$ -8.  Return $(x_1,...,x_n)$, w +8.  Return $(x_1,...,x_n), w$ The consistency of the algorithm is proven as follows. -For each sample with query variables $Q_1, ..., Q_n$ and evidence $E_1, ..., E_m$, +For each sample with query or hidden variables $Q_1, ..., Q_n$ and evidence $E_1, ..., E_m$, the process generates a sample $X=(q_1,...,q_n,e_1,...,e_m)$ with the following probability: $$ S_{WS}(q_1,...,q_n,e_1,...,e_m) = \prod_{i=1}^{n}Pr(q_i|parents(Q_i)). From e4937b1f3be2982c238d1b9892add49a546075d0 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Mon, 27 Dec 2021 07:43:04 +0330 Subject: [PATCH 27/44] Added Images --- .../Images/Gibbs_Example_BN.png | Bin 0 -> 44045 bytes .../Images/Gibbs_Example_Procedure.png | Bin 0 -> 120088 bytes .../Images/Likelihood_Example_BN.png | Bin 0 -> 35982 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 notebooks/10_bayesian_networks_sampling/Images/Gibbs_Example_BN.png create mode 100644 notebooks/10_bayesian_networks_sampling/Images/Gibbs_Example_Procedure.png create mode 100644 notebooks/10_bayesian_networks_sampling/Images/Likelihood_Example_BN.png diff --git a/notebooks/10_bayesian_networks_sampling/Images/Gibbs_Example_BN.png b/notebooks/10_bayesian_networks_sampling/Images/Gibbs_Example_BN.png new file mode 100644 index 0000000000000000000000000000000000000000..e42b3044e5630ea00cdd9c6175b131c2187c10cd GIT binary patch literal 44045 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 z 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 6w56AXNvmI;-w$#+8{RCMvAz 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 literal 0 HcmV?d00001 diff --git a/notebooks/10_bayesian_networks_sampling/Images/Likelihood_Example_BN.png b/notebooks/10_bayesian_networks_sampling/Images/Likelihood_Example_BN.png new file mode 100644 index 0000000000000000000000000000000000000000..818c48b77fe8314175b90d4812ba970a2c01ae5d GIT binary patch literal 35982 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%0A1d_d$%i!<+_65 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 Date: Mon, 27 Dec 2021 14:55:31 +0330 Subject: [PATCH 28/44] Fix Image Spacing Issue --- notebooks/10_bayesian_networks_sampling/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 138fdd8b..c5bb10cb 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -189,7 +189,9 @@ $$ $$ Take the following Bayes' net as an example. + ![Likelihood Weighting Bayes' Net Example](Images/Likelihood_Example_BN.png "Example Bayes' Net") + Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. The, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. @@ -235,9 +237,13 @@ This updating procedure takes into account both upstream and downstream evidence In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent the desired distribution. Furthermore, they may not be independent of the other samples $X'$ generated with the Gibbs method, because of the arbitrary choice of $X^{(1)}$. This begining of the chain is referred to as the **burn-in period**, and the samples generated here are generally not used as the desired $X$. So, $X$ is usually selected from the $X^{(t)}$ outside this period. However, this creates a time overhead, since the burn-in period could be somewhat large. Take the following Bayes' net as an example. + ![Gibbs Sampling Bayes' Net Example](Images/Gibbs_Example_BN.png "Example Bayes' Net") + Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown, in green, variables set to false in red and variables selected for resampling in yellow. + ![Gibbs Sampling Procedure](Images/Gibbs_Example_Procedure.png "Example Gibbs Sampling Procedure") + As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: $$ Pr(+b|+a, +e, +c, -d) From c72ed2dd8ff68e133427b46aa4af073a5fd035c4 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 18:10:06 +0330 Subject: [PATCH 29/44] Test HTML Tag --- notebooks/10_bayesian_networks_sampling/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index c5bb10cb..f96c5ca2 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -192,8 +192,14 @@ Take the following Bayes' net as an example. ![Likelihood Weighting Bayes' Net Example](Images/Likelihood_Example_BN.png "Example Bayes' Net") + + + Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. + + + Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. The, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. By repeating this procedure and calculating a weigth for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. From d5584dd67d54299d19576160b744f564ca87688d Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 18:15:19 +0330 Subject: [PATCH 30/44] add to notebooks --- notebooks/index.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/notebooks/index.yml b/notebooks/index.yml index 1b2133c0..d0e08d48 100644 --- a/notebooks/index.yml +++ b/notebooks/index.yml @@ -30,6 +30,10 @@ notebooks: kind: S2021, LN, Notebook metadata: notebooks/9_bayesian_networks/metadata.yml text: Baysian Networks - Part 3 + - notebook: notebooks/10_bayesian_networks_sampling/index.md + kind: S2021, LN, Notebook + metadata: notebooks/10_bayesian_networks_sampling/metadata.yml + text: Baysian Networks - Sampling - notebook: notebooks/11_temporal_probability_models/index1.ipynb kind: S2021, LN, Notebook metadata: notebooks/11_temporal_probability_models/metadata.yml From 8350aaffa7c0ee8a8a43bf8de45462b61c3b74d0 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 18:28:29 +0330 Subject: [PATCH 31/44] fix index.yml --- notebooks/index.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/index.yml b/notebooks/index.yml index d0e08d48..358ec64a 100644 --- a/notebooks/index.yml +++ b/notebooks/index.yml @@ -30,7 +30,7 @@ notebooks: kind: S2021, LN, Notebook metadata: notebooks/9_bayesian_networks/metadata.yml text: Baysian Networks - Part 3 - - notebook: notebooks/10_bayesian_networks_sampling/index.md + - md: notebooks/10_bayesian_networks_sampling/index.md kind: S2021, LN, Notebook metadata: notebooks/10_bayesian_networks_sampling/metadata.yml text: Baysian Networks - Sampling From 02dddea94bf29e7734a5d298bef907d822829efe Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 18:43:17 +0330 Subject: [PATCH 32/44] Remove Table of Contents --- notebooks/10_bayesian_networks_sampling/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index f96c5ca2..0c9e6b1b 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -22,7 +22,6 @@ Table of Contents ============== -- [Table of Contents](#table-of-contents) - [Introduction](#introduction) - [Basic Idea](#basic-idea) - [Sampling from Given Distribution](#sampling-from-given-distribution) From 0b2f046a75415a5f1f493131e38fe7ccb6f23953 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 18:45:53 +0330 Subject: [PATCH 33/44] Revert HTML Tag Test --- notebooks/10_bayesian_networks_sampling/index.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 0c9e6b1b..6bf304f5 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -191,14 +191,8 @@ Take the following Bayes' net as an example. ![Likelihood Weighting Bayes' Net Example](Images/Likelihood_Example_BN.png "Example Bayes' Net") - - - Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. - - - Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. The, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. By repeating this procedure and calculating a weigth for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. From b0e2aa5219a55dcb6ec221f224cb6ea1f07cc2c3 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 19:13:52 +0330 Subject: [PATCH 34/44] Change Picture Name --- ...lihood_Example_BN.png => General_Example_BN.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename notebooks/10_bayesian_networks_sampling/Images/{Likelihood_Example_BN.png => General_Example_BN.png} (100%) diff --git a/notebooks/10_bayesian_networks_sampling/Images/Likelihood_Example_BN.png b/notebooks/10_bayesian_networks_sampling/Images/General_Example_BN.png similarity index 100% rename from notebooks/10_bayesian_networks_sampling/Images/Likelihood_Example_BN.png rename to notebooks/10_bayesian_networks_sampling/Images/General_Example_BN.png From bfeacd0ecd463640638db21a792ed0f375079b7f Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 19:14:05 +0330 Subject: [PATCH 35/44] Add Prior, Rejection Sampling Examples --- .../10_bayesian_networks_sampling/index.md | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 6bf304f5..115908ca 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -120,10 +120,20 @@ $$ = S_{PS}(x_1,...,x_n) = Pr(x_1,...,x_n), $$ -hence, the sampling procedure is consistent with the joint distribution. +Hence, the sampling procedure is consistent with the joint distribution. It is apparent that this algorithm is faster than its exact counter-parts. Since we can sample the joint distribution, we can approximate the probability of any event. However, in the case of conditional probabilities, it's more efficient not to consider samples inconsistent with the evidence. This brings us to the idea of rejection sampling. +Take the following Bayes' net as an example. + +![Prior Sampling Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") + +Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. + +Based on the sampling algorithm proposed above, we start with the topological sorted variables. At the first step, we sample $A$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. Suppose the result of this sampling is $-c$. We continue our sampling algorithm with $B$. Suppose that after this sampling, the result is $-b$. The last variable to sample is $D$ with the result of $+d$. We return the resulting sample $(+a,-c,-b,+d)$. + +After the sampling algorithm has finished, to determine $Pr(query|evidence)$, first, we need to filter out samples inconsistent with our evidence list. We will set the count of samples in this list as our denominator, and the count of samples in this list consistent with our query as our numerator. + ## Rejection Sampling The problem with prior sampling is that we keep samples which are not consistent with the evidence. Since the evidence might be unlikely, the number of unused samples (samples which will be discarded due to inconsistency with the evidence) will eventually be great. @@ -143,6 +153,19 @@ Consider the following process: This algorithm is also consistent with the conditional probabilities. +Take the following Bayes' net as an example. + +![Rejection Sampling Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") + +Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. + +Based on the sampling algorithm proposed above, we start with the topological sorted variables. At the first step, we sample $A$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. Suppose that after sampling $C$, the result is $+c$. Since $-c$ is one of our evidences, we should reject this sample; which is achieved by returning None and adding no sample to our sample list. + +Otherwise, in case of $-c$ for the sampling result of C, we continue our sampling algorithm with $B$. Suppose that after sampling $B$, the result is $-b$. The last variable to sample is $D$ and since it is an evidence variable, we should repeat the same procedure we performed for $C$. If the result of sampling $D$ is $-d$, we reject this sample and return None; Otherwise, we return the resulting sample $(+a,-c,-b,+d)$. + +After the sampling algorithm has finished, to determine $Pr(query|evidence)$, we only need to count samples which are consistent with the query to form our numerator and the count of all samples we returned (which are not None), as our denominator. Notice that we didn't have to filter samples to make them consistent with the evidence list, since we rejected inconsistent samples. + + ## Likelihood Weighting If we take a close look at the problem with prior sampling, which led us to the rejection sampling method, we see that if the evidence is unlikely, many samples will be rejected, thus we end up repeating the sampling process many times to achieve the desired sample size. This problem brings us to likelihood weighting. The idea is to fix the evidence variables and sample the rest. However, this might cause an inconsistency with the distribution. The solution is to use a weight variable indicating the probability of the evidence given their parents. @@ -189,11 +212,11 @@ $$ Take the following Bayes' net as an example. -![Likelihood Weighting Bayes' Net Example](Images/Likelihood_Example_BN.png "Example Bayes' Net") +![Likelihood Weighting Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. -Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. The, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. +Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. Then, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. By repeating this procedure and calculating a weigth for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. From 1de8917517e7f13f8a6744f9526a6216d72a6009 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 31 Dec 2021 19:16:25 +0330 Subject: [PATCH 36/44] Add ./ to Images --- notebooks/10_bayesian_networks_sampling/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 115908ca..f39eda2b 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -77,7 +77,7 @@ probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. -![Partition of the Unit Length Segment](Images/Unit_Length_Segment_Partition.png "Partition of the Unit Length Segment") +![Partition of the Unit Length Segment](./Images/Unit_Length_Segment_Partition.png "Partition of the Unit Length Segment") We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_i$. Since we chose the seed from a uniform distribution, it can be shown that the probability of the sample being equal to $c_i$ is $Pr(C=c_i)$. @@ -126,7 +126,7 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since Take the following Bayes' net as an example. -![Prior Sampling Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") +![Prior Sampling Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -155,7 +155,7 @@ This algorithm is also consistent with the conditional probabilities. Take the following Bayes' net as an example. -![Rejection Sampling Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") +![Rejection Sampling Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -212,7 +212,7 @@ $$ Take the following Bayes' net as an example. -![Likelihood Weighting Bayes' Net Example](Images/General_Example_BN.png "Example Bayes' Net") +![Likelihood Weighting Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -260,11 +260,11 @@ In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent t Take the following Bayes' net as an example. -![Gibbs Sampling Bayes' Net Example](Images/Gibbs_Example_BN.png "Example Bayes' Net") +![Gibbs Sampling Bayes' Net Example](./Images/Gibbs_Example_BN.png "Example Bayes' Net") Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown, in green, variables set to false in red and variables selected for resampling in yellow. -![Gibbs Sampling Procedure](Images/Gibbs_Example_Procedure.png "Example Gibbs Sampling Procedure") +![Gibbs Sampling Procedure](./Images/Gibbs_Example_Procedure.png "Example Gibbs Sampling Procedure") As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: $$ From 22b45f7ba5deaa0ab3798bb4fb02168befbe9022 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 10:30:41 +0330 Subject: [PATCH 37/44] Change index.yml --- notebooks/index.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/index.yml b/notebooks/index.yml index 358ec64a..4c01a9ac 100644 --- a/notebooks/index.yml +++ b/notebooks/index.yml @@ -30,8 +30,8 @@ notebooks: kind: S2021, LN, Notebook metadata: notebooks/9_bayesian_networks/metadata.yml text: Baysian Networks - Part 3 - - md: notebooks/10_bayesian_networks_sampling/index.md - kind: S2021, LN, Notebook + - md: notebooks/10_bayesian_networks_sampling/ + kind: F2021, LN metadata: notebooks/10_bayesian_networks_sampling/metadata.yml text: Baysian Networks - Sampling - notebook: notebooks/11_temporal_probability_models/index1.ipynb From 43f2671475eb369b656c20041017023ca6252498 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 10:34:16 +0330 Subject: [PATCH 38/44] Change index.yml in lecture note folder --- notebooks/10_bayesian_networks_sampling/metadata.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml index 7de24ff1..1610a906 100644 --- a/notebooks/10_bayesian_networks_sampling/metadata.yml +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -1,7 +1,7 @@ -title: # shown on browser tab +title: # shown on browser tab header: - title: # title of your notebook + title: # title of your notebook description: # short description of your notebook authors: From 661511fc505db8746b4e0f379089a10ede84acd0 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 10:51:13 +0330 Subject: [PATCH 39/44] Fix main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7e8ef31a..70726084 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,5 +24,5 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} enable_jekyll: true allow_empty_commit: true - publish_dir: . + publish_dir: './webified/' exclude_assets: '.github' From 268e525cdd6682505b4f25837c6ca2ed8104ff69 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 10:57:04 +0330 Subject: [PATCH 40/44] Add people to metadata.yml --- notebooks/10_bayesian_networks_sampling/metadata.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml index 1610a906..74b73a70 100644 --- a/notebooks/10_bayesian_networks_sampling/metadata.yml +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -7,6 +7,7 @@ header: authors: label: position: top + kind: people content: # list of notebook authors - name: # name of author From 6a9dffa62b341ccf7451a3f700afe2aea15c8d66 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 11:15:51 +0330 Subject: [PATCH 41/44] Fix comments and images --- .../10_bayesian_networks_sampling/index.md | 24 +++++++++---------- .../metadata.yml | 6 ++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index f39eda2b..e8ff11f6 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -53,8 +53,8 @@ To compute an approximate posterior probability, one approach is to simulate the Sampling has two main advantages: -- Learning: By getting samples from an unknown distribution, we can learn the associated probabilities. -- Performance: Getting a sample is much faster than computing the right answer. +- **Learning**: By getting samples from an unknown distribution, we can learn the associated probabilities. +- **Performance**: Getting a sample is much faster than computing the right answer. The primitive element in any sampling algorithm is the generation of samples from a known probability distribution. So the step-by-step algorithm is described in the following section. @@ -77,7 +77,7 @@ probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. -![Partition of the Unit Length Segment](./Images/Unit_Length_Segment_Partition.png "Partition of the Unit Length Segment") +drawing We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_i$. Since we chose the seed from a uniform distribution, it can be shown that the probability of the sample being equal to $c_i$ is $Pr(C=c_i)$. @@ -126,11 +126,11 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since Take the following Bayes' net as an example. -![Prior Sampling Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") +drawing Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. -Based on the sampling algorithm proposed above, we start with the topological sorted variables. At the first step, we sample $A$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. Suppose the result of this sampling is $-c$. We continue our sampling algorithm with $B$. Suppose that after this sampling, the result is $-b$. The last variable to sample is $D$ with the result of $+d$. We return the resulting sample $(+a,-c,-b,+d)$. +Based on the sampling algorithm proposed above, we start with the topological sorted variables. At the first step, we sample $A$. Suppose that the result of the aforementioned operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. Suppose the result of this sampling is $-c$. We continue our sampling algorithm with $B$. Suppose that after this sampling, the result is $-b$. The last variable to sample is $D$ with the result of $+d$. We return the resulting sample $(+a,-c,-b,+d)$. After the sampling algorithm has finished, to determine $Pr(query|evidence)$, first, we need to filter out samples inconsistent with our evidence list. We will set the count of samples in this list as our denominator, and the count of samples in this list consistent with our query as our numerator. @@ -155,7 +155,7 @@ This algorithm is also consistent with the conditional probabilities. Take the following Bayes' net as an example. -![Rejection Sampling Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") +drawing Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -212,13 +212,13 @@ $$ Take the following Bayes' net as an example. -![Likelihood Weighting Bayes' Net Example](./Images/General_Example_BN.png "Example Bayes' Net") +drawing Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. -Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. Then, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will we sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. +Based on the sampling algorithm proposed above, we start by setting the weight $w$ equal to $1.0$. Then, we sample $A$ from its distribution, since it is the first node in the topological order of the Bayes' net. Thus, $A$ will be sampled from the distribution $Pr(A)$, where $Pr(+a) = 0.7$. Suppose that the result of said operation is $+a$. Next in line could be $C$, since it can be thought of as the next node to be processed. However, $C$ is an evidence node. This means that we should set it to $-c$ and multiply $w$ by $Pr(-c | +a) = 0.9$, leading to $w=0.9$. Next in line is $B$, which is again sampled from the distribution $Pr(B | +a)$ where $Pr(+b | +a) = 0.8$. Suppose that the result of this opreation is $-b$. Now, the only node left to be processed is $D$. Since this node is again an evidence variable, we should set it to $+d$ and multiply $w$ by $Pr(+d | -b, -c) = 0.2$, which is the conditional probability based on the values generated up to this point. This changes $w$ to $0.18$. Since there are no more nodes left, $w = 0.18$ is the weight of the sample $(+a, -b, -c, +d)$. -By repeating this procedure and calculating a weigth for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. +By repeating this procedure and calculating a weight for each sample, we will eventually find a collection of weighted samples. Then we could use the calculated weights to approximate the probability in question. This is done by summing the weights of the samples consistent with the query, and dividing by the sum of all weights generated. ## Gibbs Sampling The main problem with Likelihood Weighting was the sample inefficiency that could occur. To rectify this issue, one could use the approach of Gibbs Sampling, which is a special case of the *Metropolis-Hastings* algorithm (See Page 62 of this [lecture note](https://www.stat.umn.edu/geyer/f05/8931/n1998.pdf)). @@ -260,11 +260,11 @@ In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent t Take the following Bayes' net as an example. -![Gibbs Sampling Bayes' Net Example](./Images/Gibbs_Example_BN.png "Example Bayes' Net") +drawing -Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown, in green, variables set to false in red and variables selected for resampling in yellow. +Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown in green, variables set to false in red and variables selected for resampling in yellow. -![Gibbs Sampling Procedure](./Images/Gibbs_Example_Procedure.png "Example Gibbs Sampling Procedure") +drawing As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: $$ diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml index 74b73a70..1ac51a8c 100644 --- a/notebooks/10_bayesian_networks_sampling/metadata.yml +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -10,7 +10,7 @@ authors: kind: people content: # list of notebook authors - - name: # name of author + - name: Alireza Honarvar # name of author role: Author # change this if you want contact: # list of contact information @@ -20,7 +20,7 @@ authors: - link: https://t.me/FekKonamAlirezaBezarCheckKonam # contact link icon: fab fa-telegram # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) - - name: # name of author + - name: Navid Eslami # name of author role: Author # change this if you want contact: # list of contact information @@ -30,7 +30,7 @@ authors: - link: https://t.me/NavidEsl # contact link icon: fab fa-telegram # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons) - - name: # name of author + - name: Ali Najibi # name of author role: Author # change this if you want contact: # list of contact information From 3e53d902ea36788a63e55b6b24ec42b0f7828760 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 11:27:04 +0330 Subject: [PATCH 42/44] Fix table and image alignment --- .../10_bayesian_networks_sampling/index.md | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index e8ff11f6..91b776a2 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -60,15 +60,26 @@ The primitive element in any sampling algorithm is the generation of samples fro # Sampling from Given Distribution Consider the example of picking random colored cubes from a large bag of them. The probrability distribution of the colors of these cubes is given in the table below. In this setting, sampling is analogous to picking a random cube from said bag so that the probabilities are taken into account. -

- -| C | Pr(C) | -|:-----: |:----: | -| green | 0.6 | -| red | 0.1 | -| blue | 0.3 | - -
+

+ + + + + + + + + + + + + + + + + +
C Pr(C)
Green 0.6
Red 0.1
Blue 0.3
+

In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed and determine the sample based on that. As shown in the figure below, the unit length segment is @@ -77,7 +88,9 @@ probabilities of the distribution, and are equal to $Pr(C=c_i)$. In other words, values that the random variable $C$ can take and defined the probabilities based on them. Here, we have $c_1 = green$, $c_2 = red$ and $c_3 = blue$. -drawing +

+drawing +

We say that the sample drawn has the value $c_i$, if the seed chosen lies in $l_i$. Since we chose the seed from a uniform distribution, it can be shown that the probability of the sample being equal to $c_i$ is $Pr(C=c_i)$. @@ -126,7 +139,9 @@ It is apparent that this algorithm is faster than its exact counter-parts. Since Take the following Bayes' net as an example. -drawing +

+drawing +

Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -155,7 +170,9 @@ This algorithm is also consistent with the conditional probabilities. Take the following Bayes' net as an example. -drawing +

+drawing +

Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -212,7 +229,9 @@ $$ Take the following Bayes' net as an example. -drawing +

+drawing +

Suppose we want to calculate $Pr(-a, | -c, +d)$. This means that our evidence variables are $C$ and $D$. An example of the sampling procedure is as follows. @@ -260,11 +279,15 @@ In practice, the samples $X^{(t)}$ with small $t$ may not accurately represent t Take the following Bayes' net as an example. -drawing +

+drawing +

Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown in green, variables set to false in red and variables selected for resampling in yellow. -drawing +

+drawing +

As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: $$ From bd8115646f92f28006e6b566a1eee79a77629fc5 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 11:33:19 +0330 Subject: [PATCH 43/44] Fix table alignment --- notebooks/10_bayesian_networks_sampling/index.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 91b776a2..7597d8ab 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -60,8 +60,7 @@ The primitive element in any sampling algorithm is the generation of samples fro # Sampling from Given Distribution Consider the example of picking random colored cubes from a large bag of them. The probrability distribution of the colors of these cubes is given in the table below. In this setting, sampling is analogous to picking a random cube from said bag so that the probabilities are taken into account. -

- +
@@ -79,7 +78,6 @@ Consider the example of picking random colored cubes from a large bag of them. T
C Pr(C) 0.3
-

In order to draw a sample from this distribution, we can use a uniform distribution to generate a seed and determine the sample based on that. As shown in the figure below, the unit length segment is @@ -286,7 +284,7 @@ Take the following Bayes' net as an example. Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown in green, variables set to false in red and variables selected for resampling in yellow.

-drawing +drawing

As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: From 3e01c90949fc00044446fb08da18c072a1cb4b87 Mon Sep 17 00:00:00 2001 From: jalalhemmati Date: Sun, 9 Jan 2022 11:37:23 +0330 Subject: [PATCH 44/44] Fix image size and metadata title --- notebooks/10_bayesian_networks_sampling/index.md | 2 +- notebooks/10_bayesian_networks_sampling/metadata.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/notebooks/10_bayesian_networks_sampling/index.md b/notebooks/10_bayesian_networks_sampling/index.md index 7597d8ab..0d3a849f 100644 --- a/notebooks/10_bayesian_networks_sampling/index.md +++ b/notebooks/10_bayesian_networks_sampling/index.md @@ -284,7 +284,7 @@ Take the following Bayes' net as an example. Suppose we want to calculate $Pr(+a, -b | +c, -d)$. This means that $C$ and $D$ are our evidence variables. An example of the sampling procedure is shown below. Variables set to true are shown in green, variables set to false in red and variables selected for resampling in yellow.

-drawing +drawing

As it is shown in the figure above, we start from an arbitrary sample that satisfies the evidence values. Often, this arbitrary sample is generated randomly. Then, in each iteration, a non-evidence variable is selected to be resampled. Here, the first variable to be resampled is chosen to be $B$. The distribution used in this sampling, based on the formula stated above, is: diff --git a/notebooks/10_bayesian_networks_sampling/metadata.yml b/notebooks/10_bayesian_networks_sampling/metadata.yml index 1ac51a8c..38eecdd1 100644 --- a/notebooks/10_bayesian_networks_sampling/metadata.yml +++ b/notebooks/10_bayesian_networks_sampling/metadata.yml @@ -1,8 +1,8 @@ -title: # shown on browser tab +title: Inference in Bayesian Networks (Sampling) # shown on browser tab header: - title: # title of your notebook - description: # short description of your notebook + title: Inference in Bayesian Networks (Sampling) # title of your notebook + description: Fast Approximate Inference Methods in Bayesian Networks A.K.A. Sampling # short description of your notebook authors: label: