Что такое закон больших чисел?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Закон больших чисел (Law of Large Numbers)
Закон больших чисел — фундаментальный закон теории вероятности, который утверждает, что при увеличении количества независимых испытаний выборочное среднее сходится к математическому ожиданию (истинному среднему).
Другими словами: если провести достаточно много экспериментов, среднее значение результатов будет очень близко к теоретическому среднему.
Математическое определение
Слабый закон больших чисел (Weak LLN): Для последовательности независимых одинаково распределённых случайных величин X1, X2, ... с математическим ожиданием μ:
lim P(|X̄n - μ| > ε) = 0 при n → ∞
Где X̄n = (X1 + X2 + ... + Xn) / n — выборочное среднее
Сильный закон больших чисел (Strong LLN): Выборочное среднее почти наверняка сходится к μ:
P(lim X̄n = μ) = 1 при n → ∞
Практический пример: Бросание монеты
import numpy as np
import matplotlib.pyplot as plt
# Симулируем броски монеты (1 = орёл, 0 = решка)
np.random.seed(42)
trials = 10000
coin_flips = np.random.binomial(1, 0.5, trials)
# Вычисляем выборочное среднее по мере накопления данных
sample_means = np.cumsum(coin_flips) / np.arange(1, trials + 1)
# Визуализируем сходимость
plt.figure(figsize=(12, 6))
plt.plot(sample_means, linewidth=1, alpha=0.7, label='Sample mean')
plt.axhline(y=0.5, color='r', linestyle='--', linewidth=2, label='True mean (μ=0.5)')
plt.xlabel('Number of trials')
plt.ylabel('Sample mean')
plt.title('Law of Large Numbers: Coin Flip')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xscale('log')
plt.show()
print(f"После 10 бросков: {sample_means[9]:.3f}")
print(f"После 100 бросков: {sample_means[99]:.3f}")
print(f"После 1000 бросков: {sample_means[999]:.3f}")
print(f"После 10000 бросков: {sample_means[-1]:.3f}")
print(f"Истинное значение: 0.500")
Применение в Monte Carlo моделировании
# Оценка числа π с помощью Monte Carlo
def estimate_pi(n_samples):
"""Генерируем случайные точки в единичном квадрате
и считаем, сколько попадают в четверть круга"""
# Генерируем случайные координаты
x = np.random.uniform(0, 1, n_samples)
y = np.random.uniform(0, 1, n_samples)
# Расстояние от начала координат
distance = np.sqrt(x**2 + y**2)
# Доля точек внутри круга
inside_circle = np.sum(distance <= 1)
# π ≈ 4 * (площадь круга / площадь квадрата)
pi_estimate = 4 * inside_circle / n_samples
return pi_estimate
# Демонстрируем LLN
sample_sizes = [100, 1000, 10000, 100000, 1000000]
pi_estimates = [estimate_pi(n) for n in sample_sizes]
for n, pi_est in zip(sample_sizes, pi_estimates):
error = abs(pi_est - np.pi)
print(f"n={n:7d}: π ≈ {pi_est:.6f}, error = {error:.6f}")
print(f"\nПри увеличении количества выборок, ошибка уменьшается!")
Практический пример: Оценка среднего дохода
# Реальный сценарий: оценка среднего дохода в городе
np.random.seed(42)
# Истинное распределение доходов
true_mean = 50000 # рублей
true_std = 15000
# Случайная выборка респондентов
incomes = np.random.normal(true_mean, true_std, 10000)
# Средний доход при разных размерах выборки
sample_sizes = [10, 50, 100, 500, 1000, 5000]
means = []
for size in sample_sizes:
sample_mean = np.mean(incomes[:size])
means.append(sample_mean)
error = abs(sample_mean - true_mean)
print(f"Выборка {size:4d}: среднее = {sample_mean:8.2f}, ошибка = {error:7.2f}")
# Визуализируем
plt.figure(figsize=(10, 6))
plt.plot(sample_sizes, means, 'o-', linewidth=2, markersize=8)
plt.axhline(y=true_mean, color='r', linestyle='--', linewidth=2, label='True mean')
plt.xlabel('Sample size')
plt.ylabel('Sample mean')
plt.title('Convergence to True Mean')
plt.xscale('log')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Применение в машинном обучении
1. Оценка ошибки модели
from sklearn.metrics import accuracy_score
# ЗБЧ гарантирует, что при достаточно большой выборке
# оценка на test наборе близка к истинной ошибке
def estimate_generalization_error(model, X_test, y_test, n_iterations=1000):
"""Оцениваем generalization error с помощью LLN"""
accuracies = []
for _ in range(n_iterations):
# Случайная выборка из test набора (с заменой)
indices = np.random.choice(len(X_test), len(X_test), replace=True)
X_sample = X_test[indices]
y_sample = y_test[indices]
# Вычисляем accuracy
y_pred = model.predict(X_sample)
acc = accuracy_score(y_sample, y_pred)
accuracies.append(acc)
mean_accuracy = np.mean(accuracies)
std_accuracy = np.std(accuracies)
return mean_accuracy, std_accuracy
2. Доверительные интервалы
# ЗБЧ и центральная предельная теорема позволяют вычислить доверительные интервалы
def calculate_confidence_interval(data, confidence=0.95):
"""Вычисляем доверительный интервал для среднего"""
n = len(data)
mean = np.mean(data)
std_error = np.std(data, ddof=1) / np.sqrt(n)
# Z-значение для 95% доверительного интервала
z = 1.96 # для 95%
margin_of_error = z * std_error
ci_lower = mean - margin_of_error
ci_upper = mean + margin_of_error
return mean, ci_lower, ci_upper, std_error
# Пример
data = np.random.normal(100, 15, 1000)
mean, ci_lower, ci_upper, se = calculate_confidence_interval(data)
print(f"Mean: {mean:.2f}")
print(f"95% CI: [{ci_lower:.2f}, {ci_upper:.2f}]")
print(f"Standard error: {se:.2f}")
Важные связи
Центральная предельная теорема (CLT): Сумма независимых случайных величин приблизительно нормально распределена, независимо от распределения исходных величин.
Закон итерированного логарифма: Уточняет скорость сходимости в ЗБЧ
Неравенство Чебышёва: Дает верхнюю границу вероятности отклонения от среднего
# Неравенство Чебышёва
def chebyshev_bound(variance, deviation):
"""P(|X - μ| > d) <= σ² / d²"""
return variance / (deviation ** 2)
variance = 100
deviation = 10
bound = chebyshev_bound(variance, deviation)
print(f"P(|X - μ| > 10) <= {bound:.2f}") # <= 1.0
Лучшие практики в Data Science
- Убедись, что выборка достаточно большая для сходимости
- Проверяй распределение данных перед применением LLN
- Используй ЗБЧ для обоснования вычисления доверительных интервалов
- Помни о требовании независимости выборок
- При наличии смещения выборки, ЗБЧ не гарантирует сходимость к истинному среднему
Закон больших чисел — основа статистического вывода и обоснование использования выборок для оценки параметров популяции.