Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Оценка разреженной обратной ковариации
Использование оценщика GraphicalLasso для оценки ковариации и разреженной матрицы точности по небольшому числу выборок.
Для оценки вероятностной модели (например, гауссовской модели) оценка матрицы точности, то есть обратной ковариационной матрицы, так же важна, как и оценка ковариационной матрицы. Действительно, гауссовская модель параметризуется матрицей точности.
Чтобы обеспечить благоприятные условия для восстановления, мы выбираем данные из модели с разреженной обратной ковариационной матрицей. Кроме того, мы гарантируем, что данные не слишком сильно коррелируют (ограничивая наибольший коэффициент матрицы точности) и что в матрице точности нет малых коэффициентов, которые невозможно восстановить. Кроме того, при небольшом числе наблюдений легче восстановить корреляционную матрицу, а не ковариационную, поэтому мы масштабируем временной ряд.
Здесь число выборок немного больше числа измерений, поэтому эмпирическая ковариационная матрица всё ещё обратима. Однако, поскольку наблюдения сильно коррелируют, эмпирическая ковариационная матрица плохо обусловлена, и в результате её обратная матрица — эмпирическая матрица точности — сильно отличается от истинной.
Если использовать l2-регуляризацию, как в оценщике Ledoit-Wolf, то из-за малого числа выборок необходимо применять сильную регуляризацию. В результате матрица точности Ledoit-Wolf довольно близка к истинной матрице точности, которая почти диагональная, однако её внедиагональная структура теряется.
Оценщик с l1-регуляризацией может восстановить часть этой внедиагональной структуры. Он строит разреженную матрицу точности. Ему не удаётся восстановить точную структуру разреженности: он обнаруживает слишком много ненулевых коэффициентов. Однако наибольшие ненулевые коэффициенты оценки с l1-регуляризацией соответствуют ненулевым коэффициентам истинной матрицы. Наконец, коэффициенты оценки матрицы точности с l1-регуляризацией смещены к нулю: из-за регуляризации они все меньше соответствующих истинных значений, что видно на рисунке.
Обратите внимание, что диапазон цветов для матриц точности изменён для повышения наглядности рисунка. Полный диапазон значений эмпирической матрицы точности не отображается.
Параметр alpha оценщика GraphicalLasso, задающий разреженность модели, выбирается с помощью внутренней кросс-валидации в GraphicalLassoCV. Как видно на рисунке 2, сетка для вычисления оценки кросс-валидации итеративно уточняется в окрестности максимума.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Сгенерировать данные
import numpy as np
from scipy import linalg
from sklearn.datasets import make_sparse_spd_matrix
n_samples = 60
n_features = 20
prng = np.random.RandomState(1)
prec = make_sparse_spd_matrix(
n_features, alpha=0.98, smallest_coef=0.4, largest_coef=0.7, random_state=prng
)
cov = linalg.inv(prec)
d = np.sqrt(np.diag(cov))
cov /= d
cov /= d[:, np.newaxis]
prec *= d
prec *= d[:, np.newaxis]
X = prng.multivariate_normal(np.zeros(n_features), cov, size=n_samples)
X -= X.mean(axis=0)
X /= X.std(axis=0)
Оценить ковариацию
from sklearn.covariance import GraphicalLassoCV, ledoit_wolf emp_cov = np.dot(X.T, X) / n_samples model = GraphicalLassoCV() model.fit(X) cov_ = model.covariance_ prec_ = model.precision_ lw_cov_, _ = ledoit_wolf(X) lw_prec_ = linalg.inv(lw_cov_)
Построить графики результатов
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.subplots_adjust(left=0.02, right=0.98)
# plot the covariances
covs = [
("Empirical", emp_cov),
("Ledoit-Wolf", lw_cov_),
("GraphicalLassoCV", cov_),
("True", cov),
]
vmax = cov_.max()
for i, (name, this_cov) in enumerate(covs):
plt.subplot(2, 4, i + 1)
plt.imshow(
this_cov, interpolation="nearest", vmin=-vmax, vmax=vmax, cmap=plt.cm.RdBu_r
)
plt.xticks(())
plt.yticks(())
plt.title("%s covariance" % name)
# plot the precisions
precs = [
("Empirical", linalg.inv(emp_cov)),
("Ledoit-Wolf", lw_prec_),
("GraphicalLasso", prec_),
("True", prec),
]
vmax = 0.9 * prec_.max()
for i, (name, this_prec) in enumerate(precs):
ax = plt.subplot(2, 4, i + 5)
plt.imshow(
np.ma.masked_equal(this_prec, 0),
interpolation="nearest",
vmin=-vmax,
vmax=vmax,
cmap=plt.cm.RdBu_r,
)
plt.xticks(())
plt.yticks(())
plt.title("%s precision" % name)
if hasattr(ax, "set_facecolor"):
ax.set_facecolor(".7")
else:
ax.set_axis_bgcolor(".7")

# plot the model selection metric
plt.figure(figsize=(4, 3))
plt.axes([0.2, 0.15, 0.75, 0.7])
plt.plot(model.cv_results_["alphas"], model.cv_results_["mean_test_score"], "o-")
plt.axvline(model.alpha_, color=".5")
plt.title("Model selection")
plt.ylabel("Cross-validation score")
plt.xlabel("alpha")
plt.show()

Общее время выполнения скрипта: (0 минут 0.623 секунды)
Похожие примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/covariance/plot_sparse_cov.html