Математическое ожидание в 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

Математическое ожидание в Python - comments

En
Expected value python (python)