Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу, чтобы загрузить весь пример кода. Или запустить этот пример в вашем браузере через JupyterLite или Binder

Оценка ковариации с уменьшением: LedoitWolf против OAS и максимального правдоподобия

При работе с оценкой ковариации обычный подход заключается в использовании оценщика максимального правдоподобия, такого как EmpiricalCovariance. Он несмещён, то есть он сходится к истинной (генеральной совокупности) ковариации при большом количестве наблюдений. Однако, может быть полезно его регулировать, чтобы уменьшить его дисперсию; это, в свою очередь, вводит некоторую смещённость. Этот пример иллюстрирует простое регулирование, используемое в оценщиках Сжатой ковариации. В частности, он фокусируется на том, как задать величину регулирования, то есть как выбрать компромисс между смещением и дисперсией.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация образцовых данных

import numpy as np

n_features, n_samples = 40, 20
np.random.seed(42)
base_X_train = np.random.normal(size=(n_samples, n_features))
base_X_test = np.random.normal(size=(n_samples, n_features))

# Color samples
coloring_matrix = np.random.normal(size=(n_features, n_features))
X_train = np.dot(base_X_train, coloring_matrix)
X_test = np.dot(base_X_test, coloring_matrix)

Вычисление правдоподобия на тестовых данных

from scipy import linalg

from sklearn.covariance import ShrunkCovariance, empirical_covariance, log_likelihood

# spanning a range of possible shrinkage coefficient values
shrinkages = np.logspace(-2, 0, 30)
negative_logliks = [
    -ShrunkCovariance(shrinkage=s).fit(X_train).score(X_test) for s in shrinkages
]

# under the ground-truth model, which we would not have access to in real
# settings
real_cov = np.dot(coloring_matrix.T, coloring_matrix)
emp_cov = empirical_covariance(X_train)
loglik_real = -log_likelihood(emp_cov, linalg.inv(real_cov))

Сравнение различных подходов к установке параметра регуляризации

Здесь мы сравниваем 3 подхода:

  • Установление параметра путем перекрестной проверки правдоподобия на трех складках в соответствии с сеткой потенциальных параметров сжатия.
  • Закрытая формула, предложенная Ледоитом и Вольфом, для вычисления асимптотически оптимального параметра регулирования (минимизирующего критерий MSE), дающего оценку ковариации LedoitWolf.
  • Улучшение сжатия Ледоит-Вольф, OAS, предложенное Чен и др. Его сходимость значительно лучше при предположении, что данные являются гауссовыми, особенно для небольших выборок.
from sklearn.covariance import OAS, LedoitWolf
from sklearn.model_selection import GridSearchCV

# GridSearch for an optimal shrinkage coefficient
tuned_parameters = [{"shrinkage": shrinkages}]
cv = GridSearchCV(ShrunkCovariance(), tuned_parameters)
cv.fit(X_train)

# Ledoit-Wolf optimal shrinkage coefficient estimate
lw = LedoitWolf()
loglik_lw = lw.fit(X_train).score(X_test)

# OAS coefficient estimate
oa = OAS()
loglik_oa = oa.fit(X_train).score(X_test)

Графическое отображение результатов

Для количественной оценки ошибки оценки мы строим график правдоподобия незамеченных данных для различных значений параметра сжатия. Мы также показываем выбор с помощью перекрестной проверки или с помощью оценок LedoitWolf и OAS.

import matplotlib.pyplot as plt

fig = plt.figure()
plt.title("Regularized covariance: likelihood and shrinkage coefficient")
plt.xlabel("Regularization parameter: shrinkage coefficient")
plt.ylabel("Error: negative log-likelihood on test data")
# range shrinkage curve
plt.loglog(shrinkages, negative_logliks, label="Negative log-likelihood")

plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="Real covariance likelihood")

# adjust view
lik_max = np.amax(negative_logliks)
lik_min = np.amin(negative_logliks)
ymin = lik_min - 6.0 * np.log((plt.ylim()[1] - plt.ylim()[0]))
ymax = lik_max + 10.0 * np.log(lik_max - lik_min)
xmin = shrinkages[0]
xmax = shrinkages[-1]
# LW likelihood
plt.vlines(
    lw.shrinkage_,
    ymin,
    -loglik_lw,
    color="magenta",
    linewidth=3,
    label="Ledoit-Wolf estimate",
)
# OAS likelihood
plt.vlines(
    oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="OAS estimate"
)
# best CV estimator likelihood
plt.vlines(
    cv.best_estimator_.shrinkage,
    ymin,
    -cv.best_estimator_.score(X_test),
    color="cyan",
    linewidth=3,
    label="Cross-validation best estimate",
)

plt.ylim(ymin, ymax)
plt.xlim(xmin, xmax)
plt.legend()

plt.show()
Regularized covariance: likelihood and shrinkage coefficient

Примечание

Оценка максимального правдоподобия соответствует отсутствию сжатия и, следовательно, плохо работает. Оценка Ледоит-Вольф работает очень хорошо, так как она близка к оптимальной и не требует больших вычислительных затрат. В этом примере оценка OAS немного дальше. Интересно, что оба подхода превосходят перекрестную проверку, которая требует значительно больших вычислительных затрат.

Полное время выполнения скрипта: (0 минут 0,434 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_covariance_estimation.ipynb

Download Python source code: plot_covariance_estimation.py

Download zipped: plot_covariance_estimation.zip

Похожие примеры

Оценка Ледоит-Вольф против OAS

Линейный дискриминантный анализ (LDA) с нормальными, Ледоит-Вольф и OAS для классификации

Классификация с использованием ближайшего центра

Оценка разреженной ковариации

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/covariance/plot_covariance_estimation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API