Примечание
Перейти к концу, чтобы загрузить полный пример кода. или запустить этот пример в вашем браузере через 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,512 секунды)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/covariance/plot_sparse_cov.html