Show Python code
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
rng = np.random.default_rng(2026)
plt.rcParams.update({'figure.figsize': (9, 4.5), 'axes.grid': True, 'grid.alpha': .25})Carlos Buitrago
Вектор \(\xi=(\xi_1,\ldots,\xi_n)^\top\) называется гауссовским, если его характеристическая функция имеет вид \[ \varphi_\xi(u)=\mathbb E e^{i u^\top\xi}=\exp\left(iu^\top a-\frac12u^\top\Sigma u\right),\quad u\in\mathbb R^n, \] где \(a\in\mathbb R^n\), а \(\Sigma\) — симметричная неотрицательно определённая матрица. Обозначение: \(\xi\sim\mathcal N(a,\Sigma)\).
При этом \(a=\mathbb E\xi\), \(\Sigma_{ij}=\operatorname{cov}(\xi_i,\xi_j)\). Вырожденные нормальные распределения тоже допускаются: например, константа \(c\) имеет закон \(\mathcal N(c,0)\).
Почему это полезно? Чтобы доказать гауссовость нового вектора, достаточно представить его как детерминированное линейное преобразование исходного гауссовского вектора.
Независимость: если вектор совместно гауссовский, то его координаты независимы тогда и только тогда, когда попарно некоррелированы (\(\Sigma\) диагональна). Без совместной гауссовости это неверно.
Сгенерируем \(Z\sim\mathcal N(0,I_2)\) и положим \(X=AZ\). Тогда \(\operatorname{cov}(X)=AA^\top\).
z = rng.standard_normal((3000, 2))
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
for ax, rho in zip(axes, [-0.85, 0, 0.85]):
A = np.array([[1., 0.], [rho, np.sqrt(1-rho**2)]])
x = z @ A.T
ax.scatter(x[:, 0], x[:, 1], s=5, alpha=.22)
ax.set(title=fr'$\rho={rho}$', xlabel='$X_1$', ylabel='$X_2$', xlim=(-4,4), ylim=(-4,4))
plt.tight_layout(); plt.show()
Пусть \(Z\sim N(0,1)\), \(S\) независимо от \(Z\) и принимает значения \(\pm1\) с вероятностью \(1/2\). Тогда \(X=Z\) и \(Y=SZ\) по отдельности стандартно нормальны и \(\operatorname{cov}(X,Y)=0\), но \(X+Y\) не нормально: с вероятностью \(1/2\) оно равно нулю.
z = rng.standard_normal(6000)
s = rng.choice([-1, 1], size=z.size)
x, y = z, s*z
fig, ax = plt.subplots(1, 2, figsize=(11, 4))
ax[0].scatter(x, y, s=3, alpha=.25); ax[0].set(title='Нормальные маргиналы, но не совместно нормальны', xlabel='X', ylabel='Y')
ax[1].hist(x+y, bins=90, density=True); ax[1].set(title='Сумма X+Y имеет атом в нуле', xlabel='X+Y')
plt.tight_layout(); plt.show()
print('Эмпирическая ковариация:', np.cov(x, y)[0, 1])
Эмпирическая ковариация: -0.010901520049899338
Процесс \((X_t)_{t\in T}\) называется гауссовским, если для любого \(n\ge1\) и любых \(t_1,\ldots,t_n\in T\) вектор \[ (X_{t_1},\ldots,X_{t_n}) \] совместно гауссовский.
Важно: мало проверить, что каждый \(X_t\) по отдельности нормально распределён. Нужно проверить совместную нормальность любого конечного набора времён.
Гауссовский процесс задаётся в смысле конечномерных распределений двумя функциями: \[m(t)=\mathbb EX_t,\qquad R(s,t)=\operatorname{cov}(X_s,X_t).\] Для \(t_1,\ldots,t_n\) имеем \[ (X_{t_1},\ldots,X_{t_n})^\top\sim\mathcal N(m_T,K_T),\quad (K_T)_{ij}=R(t_i,t_j). \]
Траектории и распределения: ковариационная функция определяет конечномерные законы, но сама по себе не означает непрерывность траекторий. Например, для независимых стандартных нормальных \(X_t\) при разных \(t\) ковариация равна \(\mathbf 1_{\{s=t\}}\); на непрерывном множестве индексов это не даёт непрерывных траекторий.
Функция \(R:T\times T\to\mathbb R\) может быть ковариацией гауссовского процесса тогда и только тогда, когда она
Функция среднего \(m:T\to\mathbb R\) может быть произвольной.
Доказательство необходимости: \[ \sum_{i,j}c_ic_jR(t_i,t_j) =\operatorname{Var}\left(\sum_i c_iX_{t_i}\right)\ge0. \] Симметрия следует из симметрии ковариации.
Идея достаточности: каждой конечной совокупности времён сопоставим многомерный нормальный закон с вектором средних \((m(t_i))\) и матрицей \((R(t_i,t_j))\). Положительная полуопределённость гарантирует существование этих законов, а их согласованность позволяет применить теорему Колмогорова о продолжении.
Отрицательная диагональ или отрицательный определитель \(2\times2\) немедленно исключают функцию. Однако проверка лишь нескольких сеток не является строгим доказательством положительной определённости для всех времён.
Для \(t_1,\ldots,t_n\) строим \(K=(R(t_i,t_j))\), затем генерируем \(Z\sim N(0,I_n)\) и \(X=m+LZ\), где \(LL^\top=K\). Если \(K\) вырождена, используем спектральное разложение с обрезкой малых отрицательных ошибок округления. На графике изображается только дискретизация процесса; соединение точек линиями не доказывает непрерывность его траекторий.
def sample_gp(times, mean, kernel, n_paths=5, seed=1):
local = np.random.default_rng(seed)
K = np.array([[kernel(s,t) for t in times] for s in times])
vals, vecs = np.linalg.eigh((K+K.T)/2)
if vals.min() < -1e-8:
raise ValueError('Матрица ковариаций не является PSD')
L = vecs @ np.diag(np.sqrt(np.clip(vals, 0, None)))
return np.asarray([mean(t) for t in times])[:, None] + L @ local.standard_normal((len(times), n_paths))
times = np.linspace(0, 5, 140)
examples = [
('Броуновское движение', lambda s,t: min(s,t)),
('Экспоненциальная ковариация', lambda s,t: np.exp(-abs(s-t))),
('Квадратично-экспоненциальная', lambda s,t: np.exp(-0.5*(s-t)**2)),
('Косинусная', lambda s,t: np.cos(s-t)),
]
fig, axes = plt.subplots(2, 2, figsize=(13, 8))
for ax, (name, kernel) in zip(axes.flat, examples):
paths = sample_gp(times, lambda t: 0, kernel, 5)
ax.plot(times, paths); ax.set(title=name, xlabel='t', ylabel='$X_t$')
plt.tight_layout(); plt.show()
Если \((X_t)\) — гауссовский процесс, а \(f,g,h\) — детерминированные функции (причём \(g(t)\in T\)), то \[Y_t=f(t)X_{g(t)}+h(t)\] тоже гауссовский процесс. Более общо, любая конечная детерминированная линейная комбинация \(X_{g_j(t)}\) гауссова.
Доказательство: для любых \(t_1,\ldots,t_n\) все исходные величины, встречающиеся в формулах \(Y_{t_i}\), составляют конечномерный гауссовский вектор \(V\). Тогда \((Y_{t_1},\ldots,Y_{t_n})^\top=AV+b\) с детерминированными \(A,b\).
Для \(Y_t=f(t)X_{g(t)}+h(t)\): \[m_Y(t)=f(t)m_X(g(t))+h(t),\] \[R_Y(s,t)=f(s)f(t)R_X(g(s),g(t)).\]
Для \(Y_t=\sum_{j=1}^k a_j(t)X_{g_j(t)}\): \[R_Y(s,t)=\sum_{i,j}a_i(s)a_j(t)R_X(g_i(s),g_j(t)).\]
Нелинейные функции обычно разрушают нормальность: при \(X_t\sim N(0,\sigma_t^2)\) и \(\sigma_t>0\) величина \(X_t^2/\sigma_t^2\sim\chi^2_1\), а не нормальна.
Пусть \((X_t,t\ge0)\) — центрированный гауссовский процесс с ковариацией \(r(s,t)\), причём \(r(t,t)>0\) для всех \(t>0\). Определим:
Найти все гауссовские процессы.
1. Нет. При любом \(t>0\), \(X_t\sim N(0,r(t,t))\) невырожденна, а \(X_t^2\) почти наверное неотрицательна и при этом не является константой. Невырожденная нормальная случайная величина принимает отрицательные значения с положительной вероятностью, следовательно \(X_t^2\) не нормальна.
2. Да. Для любых \(t_1,\ldots,t_n\) вектор \((t_1X_{t_1},\ldots,t_nX_{t_n})\) есть диагональное линейное преобразование гауссовского вектора. Ковариация: \(R_Y(s,t)=st\,r(s,t)\).
3. Да. Времена \(|\sin t|\) и \(t\) неслучайны и неотрицательны. Каждый конечный вектор \(Y\) — линейное преобразование конечного гауссовского вектора из значений \(X\) в этих временах. Ковариация: \[R_Y(s,t)=r(|\sin s|,|\sin t|)-t\,r(|\sin s|,t)-s\,r(s,|\sin t|)+st\,r(s,t).\]
4. Да. Времена \(t^5+t\) и \(t^3\) детерминированны и принадлежат \([0,\infty)\). Конечные линейные комбинации значений \(X\) гауссовы. Ковариация: \[R_Y(s,t)=r(s^5+s,t^5+t)+r(s^5+s,t^3)+r(s^3,t^5+t)+r(s^3,t^3).\]
Ответ: 2, 3, 4.
Для фиксированного \(t>0\) нормируем \(X_t\) так, что \(X_t/\sqrt{r(t,t)}\sim N(0,1)\). Сравним распределения \(Z\), \(Z^2\) и \(tZ\).

Существует ли центрированный гауссовский процесс с указанной ковариацией \(R(s,t)\) на \([0,\infty)\)?
1. Нет. Для \(s\ne t\) имеем \(R(s,s)=R(t,t)=0\), но \(R(s,t)=|s-t|>0\). Это противоречит \(|R(s,t)|^2\le R(s,s)R(t,t)=0\). Эквивалентно, матрица \(\begin{pmatrix}0&|s-t|\\|s-t|&0\end{pmatrix}\) имеет отрицательное собственное значение.
2. Да. Возьмём независимые \(Z_1,Z_2\sim N(0,1)\) и определим \(X_t=Z_1\cos t+Z_2\sin t\). Тогда \(\mathbb EX_t=0\) и \[\operatorname{cov}(X_s,X_t)=\cos s\cos t+\sin s\sin t=\cos(s-t).\] Вектор любых значений процесса — линейное преобразование \((Z_1,Z_2)\), следовательно процесс гауссов.
3. Нет. Для \(t>0\), \(R(t,t)=-t^2<0\), что невозможно для дисперсии.
4. Да. Возьмём \(Z\sim N(0,2)\) и положим \(X_t=Z\) для всех \(t\). Тогда \(\operatorname{cov}(X_s,X_t)=2\); все конечномерные распределения совместно нормальны, хотя вырождены.
Ответ: 2, 4.
Если \(R(s,t)=2\), то \(\operatorname{Var}(X_t-X_s)=2+2-2\cdot2=0\), то есть \(X_s=X_t\) почти наверное для каждой фиксированной пары \((s,t)\). На конечной сетке траектории горизонтальны. Утверждение об одновременном равенстве для всех несчётных \(t\) требует отдельно выбирать подходящую версию процесса; построение \(X_t=Z\) такую версию даёт.
Стандартное броуновское движение — центрированный гауссовский процесс с \(R(s,t)=\min(s,t)\), \(s,t\ge0\), и непрерывными траекториями. Его приращения на непересекающихся интервалах независимы, поскольку совместно гауссовы и некоррелированы.
Для стационарного по распределению центрированного гауссовского процесса ковариация зависит только от разности времён: \(R(s,t)=k(s-t)\). Примеры: \(e^{-|s-t|/\ell}\) и \(\cos(\omega(s-t))\). Не всякая функция разности допустима: нужна положительная определённость.
Если \[\begin{pmatrix}X\\Y\end{pmatrix}\sim N\left(\begin{pmatrix}m_X\\m_Y\end{pmatrix},\begin{pmatrix}K_{XX}&K_{XY}\\K_{YX}&K_{YY}\end{pmatrix}\right),\] то при обратимой \(K_{XX}\) \[Y\mid X=x\sim N\left(m_Y+K_{YX}K_{XX}^{-1}(x-m_X),\;K_{YY}-K_{YX}K_{XX}^{-1}K_{XY}\right).\] Именно эта формула лежит в основе Gaussian Process Regression в машинном обучении. При шумных наблюдениях вместо \(K_{XX}\) используют \(K_{XX}+\sigma_\varepsilon^2 I\).
Используем ядро \(k(s,t)=\exp[-(s-t)^2/(2\ell^2)]\) и шум наблюдения с дисперсией \(\sigma_\varepsilon^2\).
x_obs = np.linspace(0, 8, 13)
y_obs = np.sin(x_obs) + rng.normal(0, .18, len(x_obs))
x_star = np.linspace(-1, 9, 260)
ell, noise = 1.1, .18
kernel = lambda a,b: np.exp(-.5*((np.asarray(a)[:,None]-np.asarray(b)[None,:])/ell)**2)
K = kernel(x_obs,x_obs) + noise**2*np.eye(len(x_obs))
Ks = kernel(x_obs,x_star)
Kss = kernel(x_star,x_star)
alpha = np.linalg.solve(K, y_obs)
mu = Ks.T @ alpha
V = np.linalg.solve(K, Ks)
cov = Kss - Ks.T @ V
sd = np.sqrt(np.maximum(np.diag(cov),0))
fig, ax = plt.subplots(figsize=(11,4.5))
ax.scatter(x_obs,y_obs,color='black',label='Наблюдения',zorder=5)
ax.plot(x_star,mu,label='Апостериорное среднее')
ax.fill_between(x_star,mu-1.96*sd,mu+1.96*sd,alpha=.25,label='95% интервал для латентной функции')
ax.set(xlabel='t',ylabel='f(t)',title='Gaussian Process Regression'); ax.legend(); plt.show()