**Importance Sampling** is a statistical technique used to estimate the properties (like the expectation or mean) of a target distribution by sampling from a different, easier-to-sample distribution, called the **proposal distribution**. This approach is particularly useful in cases where directly sampling from the target distribution is challenging or computationally expensive.
The key idea is that we can draw samples from a simpler distribution and then use these samples to approximate characteristics of the more complex target distribution. We correct the difference between the two distributions using **weights**.
### Understanding the Distributions
- **Target Distribution (P)**: The distribution we want to estimate properties of, but it's difficult to sample from.
- **Proposal Distribution (Q)**: A simpler distribution that we can sample from more easily.
### Why Use Importance Sampling?
Directly sampling from a complex target distribution might be difficult for several reasons:
1. It could have a very intricate or unknown shape.
2. There might not be an easy way to generate data points from it.
Instead, we choose a proposal distribution from which sampling is straightforward, and we apply **importance weights** to correct the bias introduced by sampling from a different distribution.
### How Importance Sampling Works
The process can be broken down into three key steps:
1. **Sampling from the Proposal Distribution**:
Draw a sample from an easy-to-use proposal distribution (`Q`). This distribution is often chosen because it allows efficient and straightforward sampling. For example, you could choose a uniform or normal distribution.
2. **Computing Importance Weights**:
For each sample drawn from `Q`, we calculate a weight to correct for the fact that the samples come from `Q` instead of the target distribution `P`. The weights ensure that the contribution of each sample matches how it would have contributed if it were drawn directly from `P`.
3. **Calculating Estimates**:
Finally, use the weighted samples to estimate the properties of the target distribution, such as the expected value.
The importance weight for a sample `x_i` is given by:
$
w(x_i) = \frac{P(x_i)}{Q(x_i)}
$
Where:
- $P(x_i)$: The probability density of `x_i` under the target distribution.
- $Q(x_i)$: The probability density of `x_i` under the proposal distribution.
### Code Example for Importance Sampling
Let’s walk through a more detailed code example to illustrate this idea.
#### Problem Statement
Suppose we want to estimate the mean of a complex **target distribution** `P(x)` that follows a **Gaussian (Normal) distribution** with mean = 0 and standard deviation = 1 (denoted as $\mathcal{N}(0, 1)$). However, sampling directly from this target distribution might be computationally challenging, so we use a **proposal distribution** `Q(x)` which is a **Uniform distribution** over $[-3, 3]$.
Here's the step-by-step implementation:
```python
import numpy as np
import matplotlib.pyplot as plt
# Target distribution (Gaussian N(0, 1))
def target_distribution(x):
return (1 / np.sqrt(2 * np.pi)) * np.exp(-0.5 * x**2)
# Proposal distribution (Uniform distribution between -3 and 3)
def proposal_distribution(size):
return np.random.uniform(-3, 3, size)
# Number of samples
n_samples = 1000
# Step 1: Sample from the proposal distribution
samples = proposal_distribution(n_samples)
# Step 2: Calculate the importance weights
weights = target_distribution(samples) / (1 / 6) # Since Q(x) is uniform, the density is 1/6 over [-3, 3]
# Normalize weights to sum to 1 (optional, but often done for stability)
weights /= np.sum(weights)
# Step 3: Use the samples and weights to estimate the mean of the target distribution
estimated_mean = np.sum(weights * samples)
# Output the estimated mean
print("Estimated Mean:", estimated_mean)
# Compare with the actual mean of the target distribution
print("Actual Mean (Gaussian N(0, 1)):", 0)
```
#### Explanation of the Code
1. **Define Distributions**:
- We defined the **target distribution** (Gaussian) as `target_distribution(x)`.
- The **proposal distribution** is uniform between $[-3, 3]$, which we used for sampling.
2. **Sampling**:
- We sampled `n_samples = 1000` data points from the proposal distribution.
3. **Calculate Importance Weights**:
- We calculated weights using the ratio $\frac{P(x_i)}{Q(x_i)}$. Here, $P(x_i)$ is the Gaussian density, and $Q(x_i)$ is the density of the uniform distribution (which is `1/6` over the interval).
4. **Weighted Estimate**:
- We calculated the weighted average of the samples to estimate the mean of the target distribution.
### Visual Understanding of Importance Sampling
Imagine that the target distribution (the one we really want to work with) is a bell-shaped curve, while the proposal distribution is a simple, flat, rectangular shape. Importance sampling helps us use the flat distribution (which is easier to sample from) to make inferences about the bell-shaped curve.
- If you just average the samples from the proposal distribution without using weights, your estimate would be biased towards the proposal distribution.
- The **importance weights** are larger when a sample falls in a region where the target distribution has more probability mass compared to the proposal distribution.
Below is a simple visualization that illustrates this concept:
```python
import seaborn as sns
# Plot the target and proposal distributions
x_vals = np.linspace(-4, 4, 1000)
plt.plot(x_vals, target_distribution(x_vals), label='Target Distribution (Gaussian N(0,1))', color='blue')
plt.plot(x_vals, [1/6 if -3 <= x <= 3 else 0 for x in x_vals], label='Proposal Distribution (Uniform)', color='red')
sns.histplot(samples, weights=weights, color='green', label='Importance Samples (Weighted)', kde=True, bins=20)
plt.legend()
plt.xlabel('x')
plt.ylabel('Density')
plt.title('Importance Sampling Illustration')
plt.show()
```
![[Pasted image 20241025111556.png]]
In this plot:
- **Blue Curve** represents the target distribution.
- **Red Line** represents the uniform proposal distribution.
- **Green Histogram** represents the sampled data adjusted by importance weights.
### Key Points to Understand
1. **Purpose of Importance Sampling**: It allows you to draw inferences about a complex target distribution using samples from a simpler distribution. This is particularly useful when the target is computationally hard to sample from directly.
2. **Importance Weights**: The weights are used to correct for the fact that the data points are sampled from a different distribution. They help adjust the contribution of each sample based on how much that sample is "important" for the target distribution.
3. **Bias and Efficiency**: The effectiveness of importance sampling heavily depends on how well the proposal distribution approximates the target distribution. If the proposal is too different from the target, the weights will have a high variance, leading to inefficiency and potential bias.
### Summary of Importance Sampling
- **Problem**: Sampling from a complex distribution is challenging.
- **Solution**: Sample from a simpler distribution and use weights to correct the difference.
- **Weights**: The ratio between the target and proposal densities at each sampled point.
- **Key Insight**: The choice of the proposal distribution greatly affects the accuracy and efficiency of the estimates. It should be chosen such that it has **good overlap** with the target distribution to minimize variance.
Importance sampling is widely used in areas like **reinforcement learning**, **Monte Carlo integration**, and **statistical physics** to efficiently estimate expected values and reduce variance.