Математическое ожидание в Python: от базовых функций до сложных примеров
Вычисление математического ожидания в Python
Математическое ожидание (expected value) - одна из ключевых характеристик случайной величины. В Python существует несколько способов его вычисления в зависимости от формата данных и контекста задачи.
Как вычислить математическое ожидание для набора чисел?
Наиболее эффективное решение для числовых массивов - использование функции numpy.mean. Она оптимизирована для работы с большими объёмами данных и поддерживает многомерные массивы.
import numpy as np
data = [2, 4, 6, 8, 10]
expected = np.mean(data)
print(expected)Scipy stats python (модуль scipy.stats)
6.0
Expected value python (математическое ожидание в python)
Если данные представлены в виде списка чисел с равными весами, среднее арифметическое совпадает с математическим ожиданием.
Типичные ошибки:
- Передача пустого списка - возникает ValueError. Решение: проверка на длину перед вызовом.
- Наличие пропущенных значений (NaN) - результат NaN. Используйте np.nanmean для игнорирования пропусков.
Как учесть различную вероятность для каждого значения?
Если значения имеют неравные вероятности, математическое ожидание вычисляется как взвешенная сумма: Σ (x_i * p_i).
values = [1, 2, 3]
probs = [0.2, 0.5, 0.3]
expected = sum(v * p for v, p in zip(values, probs))
print(expected)вывести среднее число python (вычисление и вывод среднего числа в python)
2.1
Проблемы:
- Вероятности должны суммироваться в единицу. Если нет, результат будет некорректен. Нормируйте их: probs = [p / sum(probs) for p in probs].
- Ошибка округления при большом количестве значений - используйте math.fsum для более точной суммы.
Как вычислить математическое ожидание для дискретного распределения, заданного в виде словаря?
Часто распределение хранится в виде словаря: значение → вероятность.
dist = {1: 0.2, 2: 0.5, 3: 0.3}
expected = sum(k * v for k, v in dist.items())
print(expected)2.1
Как использовать библиотеку pandas для вычисления математического ожидания?
Для данных в DataFrame или Series удобно применять метод .mean().
import pandas as pd
df = pd.DataFrame({'values': [5, 10, 15], 'weights': [0.2, 0.5, 0.3]})
expected = (df['values'] * df['weights']).sum()
print(expected)11.5
Распространённая ошибка - забвение о весах. Если веса не заданы, .mean() подойдёт для равновероятных наблюдений.
Как вычислить математическое ожидание для непрерывной случайной величины?
Для теоретического расчёта используется интеграл. В Python можно применить численное интегрирование через scipy.integrate.quad.
from scipy.integrate import quad
import math
# Плотность нормального распределения N(0,1)
def pdf(x):
return math.exp(-x**2/2) / math.sqrt(2*math.pi)
expected, _ = quad(lambda x: x * pdf(x), -math.inf, math.inf)
print(expected)0.0
Аналитическое решение для многих распределений доступно в scipy.stats.
Проблемы:
- Неверное задание пределов интегрирования - результат может быть неверным. Для стандартных распределений лучше использовать готовые методы.
- Сложные плотности приводят к ошибкам сходимости - увеличьте параметр limit в quad.
Как вычислить математическое ожидание с помощью Monte Carlo?
Метод Монте-Карло имитирует выборку из распределения и оценивает среднее.
import random
import statistics
samples = [random.gauss(0, 1) for _ in range(100000)]
expected = statistics.mean(samples)
print(expected)-0.0023 (примерный результат)
Точность растёт с увеличением числа симуляций. Подходит для сложных распределений, где аналитическое вычисление затруднено.
Расширенные примеры вычисления математического ожидания
Представлены более сложные сценарии использования, включая работу с многомерными данными, символьные вычисления и специфические распределения.
import numpy as np
# Многомерный массив: математическое ожидание по оси
matrix = np.array([[1,2,3], [4,5,6]])
mean_all = np.mean(matrix) # общее среднее
mean_rows = np.mean(matrix, axis=1) # среднее по строкам
mean_cols = np.mean(matrix, axis=0) # среднее по столбцам
print(mean_all, mean_rows, mean_cols)3.5 [2. 5.] [2.5 3.5 4.5]
# Взвешенное среднее с разными весами для каждого элемента
values = np.array([1,2,3,4])
weights = np.array([0.1,0.2,0.3,0.4])
expected = np.average(values, weights=weights)
print(expected)3.0
# Использование scipy.stats для известных распределений
from scipy.stats import norm, expon, poisson
# Нормальное распределение: математическое ожидание = loc
norm_mean = norm.mean(loc=5, scale=2)
print('Normal mean:', norm_mean)
# Экспоненциальное: 1/scale (если задан scale)
exp_mean = expon.mean(scale=3)
print('Exponential mean:', exp_mean)
# Пуассоновское: mu
pois_mean = poisson.mean(mu=4)
print('Poisson mean:', pois_mean)Normal mean: 5.0 Exponential mean: 3.0 Poisson mean: 4.0
# Символьное вычисление с sympy (для аналитического ожидания)
import sympy as sp
x = sp.Symbol('x', real=True)
# Плотность: f(x) = 2*x на [0,1]
f = 2*x
expected_sp = sp.integrate(x * f, (x, 0, 1))
print('Symbolic expectation:', expected_sp)Symbolic expectation: 2/3
# Оценка математического ожидания через симуляцию (Monte Carlo) для сложной функции
import numpy as np
np.random.seed(42)
samples = np.random.uniform(0, 10, 100000)
# Интересует ожидание g(x) = x^2
g = samples**2
expected_mc = np.mean(g)
print('Monte Carlo estimate:', expected_mc)
# Аналитическое: ∫0^10 x^2 * (1/10) dx = (10^3)/30 ≈ 33.33
print('Analytic:', 1000/30)Monte Carlo estimate: 33.307... Analytic: 33.333...
# Математическое ожидание для дискретного распределения с большим количеством значений
import itertools
def expectation_discrete(values, probs):
return sum(v * p for v, p in zip(values, probs))
# Пример: распределение суммы двух кубиков
outcomes = list(itertools.product(range(1,7), repeat=2))
sums = [a+b for a,b in outcomes]
probs = [1/36]*36
expected = expectation_discrete(sums, probs)
print('Expected sum of two dice:', expected)Expected sum of two dice: 7.0
# Использование GroupBy в pandas для ожидания по категориям
import pandas as pd
df = pd.DataFrame({
'group': ['A','A','B','B'],
'value': [10,20,30,40],
'weight': [0.2,0.8,0.5,0.5]
})
# Взвешенное среднее по группам
expected_by_group = df.groupby('group').apply(
lambda g: (g['value'] * g['weight']).sum() / g['weight'].sum()
)
print(expected_by_group)group A 18.0 B 35.0 dtype: float64