Skip to content
C.W.K.
Stream
Lesson 04 of 05 · published

The Central Limit Theorem: Why Bells Show Up Everywhere

~10 min · CLT, averages, magic

Level 0Math Novice
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

What the Theorem Actually Approximates

In the classical central limit theorem, independent identically distributed variables with finite mean and variance have a standardized sum—or equivalently a properly centered and scaled sample mean—that approaches a normal distribution as sample size grows.

The conditions matter. Heavy-tailed variables can have infinite variance, dependence can change the limit, and a single dominant contribution can prevent the usual approximation. The theorem describes the sampling distribution of a sum or mean, not the shape of the original observations.

Why Normal Approximations Still Appear Often

Measurement error and aggregates can combine many modest effects, making a Gaussian approximation useful. But adult height, sensor noise, or residuals are not normal merely because the phrase “many factors” applies; biology, boundaries, correlation, and mixtures also shape the distribution. Check the approximation rather than invoking the theorem as a universal cause.

Implications for ML and Statistics

  • Sampling distributions: standard errors and confidence intervals for means often use a CLT when its conditions and sample size are adequate.
  • Noise models: Gaussian noise can be a defensible approximation for additive effects, but residual diagnostics still matter.
  • Batch normalization: it uses batch statistics to re-center and rescale activations. Its mechanism is not that the CLT makes activations Gaussian.
The CLT concerns standardized sums and means under stated conditions. It does not say that every distribution becomes normal when the dataset is large.

Code

Bell appears from non-bell·python
import numpy as np

# Take a wildly non-normal distribution — uniform [0, 1]
samples = np.random.uniform(0, 1, size=(100_000, 30))   # 100k samples of size 30

# Compute the mean of each sample
sample_means = samples.mean(axis=1)

# The distribution of sample means is approximately normal!
print(f"mean of means: {sample_means.mean():.3f}")  # ≈ 0.5
print(f"std of means : {sample_means.std():.3f}")   # ≈ 1/sqrt(12*30) ≈ 0.053

# Plot a histogram of sample_means — it's a bell, even though the
# original distribution was a flat uniform.

External links

Exercise

Take 10,000 samples each of size 50 from an exponential distribution (very skewed, not bell-shaped). Compute each sample's mean. Plot a histogram of those means. The CLT predicts you'll see a bell.
Hint
np.random.exponential(scale=1.0, size=(10000, 50)).mean(axis=1). Despite the lopsided original distribution, the mean-of-means histogram is symmetric and bell-shaped.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.