Spec-Zone.ru › scikit-learn

Примечание

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

Устойчивая и эмпирическая оценки ковариации

Обычная оценка ковариации методом максимального правдоподобия очень чувствительна к наличию выбросов в наборе данных. В таком случае лучше использовать устойчивую оценку ковариации, чтобы гарантировать, что оценка будет невосприимчива к «ошибочным» наблюдениям в наборе данных. [1], [2]

Оценка по минимальному определителю ковариации

Оценка по минимальному определителю ковариации — это устойчивая оценка ковариации с высокой точкой разрушения (то есть её можно использовать для оценки матрицы ковариации сильно загрязнённых наборов данных с числом выбросов до \(\frac{n_\text{samples} - n_\text{features}-1}{2}\)). Идея состоит в том, чтобы найти \(\frac{n_\text{samples} + n_\text{features}+1}{2}\) наблюдений, эмпирическая ковариация которых имеет наименьший определитель, получив «чистое» подмножество наблюдений для вычисления стандартных оценок положения и ковариации. После этапа коррекции, компенсирующего тот факт, что оценки были получены только по части исходных данных, мы получаем устойчивые оценки положения и ковариации набора данных.

Оценка по минимальному определителю ковариации (MCD) была предложена П. Дж. Руссеувом в [3].

Оценка

В этом примере мы сравниваем ошибки оценивания, возникающие при использовании различных типов оценок положения и ковариации для загрязнённых наборов данных с гауссовским распределением:

  • Среднее значение и эмпирическая ковариация всего набора данных, которые становятся несостоятельными при появлении выбросов в наборе данных
  • Устойчивая оценка MCD, имеющая небольшую ошибку при условии, что \(n_\text{samples} > 5n_\text{features}\)
  • Среднее значение и эмпирическая ковариация наблюдений, заведомо являющихся корректными. Это можно считать «идеальной» оценкой MCD, поэтому, сравнив с этим случаем, можно убедиться в надёжности нашей реализации.

Литература

[1]

Johanna Hardin, David M Rocke. Распределение устойчивых расстояний. Journal of Computational and Graphical Statistics. 1 декабря 2005 г., 14(4): 928–946.

[2]

Zoubir A., Koivunen V., Chakhchoukh Y. and Muma M. (2012). Устойчивое оценивание в обработке сигналов: учебное изложение основных понятий. IEEE Signal Processing Magazine 29(4), 61–80.

[3]

P. J. Rousseeuw. Регрессия методом наименьшей медианы квадратов. Journal of American Statistical Ass., 79:871, 1984.

Influence of outliers on the location estimation, Influence of outliers on the covariance estimation
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.font_manager
import matplotlib.pyplot as plt
import numpy as np

from sklearn.covariance import EmpiricalCovariance, MinCovDet

# example settings
n_samples = 80
n_features = 5
repeat = 10

range_n_outliers = np.concatenate(
    (
        np.linspace(0, n_samples / 8, 5),
        np.linspace(n_samples / 8, n_samples / 2, 5)[1:-1],
    )
).astype(int)

# definition of arrays to store results
err_loc_mcd = np.zeros((range_n_outliers.size, repeat))
err_cov_mcd = np.zeros((range_n_outliers.size, repeat))
err_loc_emp_full = np.zeros((range_n_outliers.size, repeat))
err_cov_emp_full = np.zeros((range_n_outliers.size, repeat))
err_loc_emp_pure = np.zeros((range_n_outliers.size, repeat))
err_cov_emp_pure = np.zeros((range_n_outliers.size, repeat))

# computation
for i, n_outliers in enumerate(range_n_outliers):
    for j in range(repeat):
        rng = np.random.RandomState(i * j)

        # generate data
        X = rng.randn(n_samples, n_features)
        # add some outliers
        outliers_index = rng.permutation(n_samples)[:n_outliers]
        outliers_offset = 10.0 * (
            np.random.randint(2, size=(n_outliers, n_features)) - 0.5
        )
        X[outliers_index] += outliers_offset
        inliers_mask = np.ones(n_samples).astype(bool)
        inliers_mask[outliers_index] = False

        # fit a Minimum Covariance Determinant (MCD) robust estimator to data
        mcd = MinCovDet().fit(X)
        # compare raw robust estimates with the true location and covariance
        err_loc_mcd[i, j] = np.sum(mcd.location_**2)
        err_cov_mcd[i, j] = mcd.error_norm(np.eye(n_features))

        # compare estimators learned from the full data set with true
        # parameters
        err_loc_emp_full[i, j] = np.sum(X.mean(0) ** 2)
        err_cov_emp_full[i, j] = (
            EmpiricalCovariance().fit(X).error_norm(np.eye(n_features))
        )

        # compare with an empirical covariance learned from a pure data set
        # (i.e. "perfect" mcd)
        pure_X = X[inliers_mask]
        pure_location = pure_X.mean(0)
        pure_emp_cov = EmpiricalCovariance().fit(pure_X)
        err_loc_emp_pure[i, j] = np.sum(pure_location**2)
        err_cov_emp_pure[i, j] = pure_emp_cov.error_norm(np.eye(n_features))

# Display results
font_prop = matplotlib.font_manager.FontProperties(size=11)
plt.subplot(2, 1, 1)
lw = 2
plt.errorbar(
    range_n_outliers,
    err_loc_mcd.mean(1),
    yerr=err_loc_mcd.std(1) / np.sqrt(repeat),
    label="Robust location",
    lw=lw,
    color="m",
)
plt.errorbar(
    range_n_outliers,
    err_loc_emp_full.mean(1),
    yerr=err_loc_emp_full.std(1) / np.sqrt(repeat),
    label="Full data set mean",
    lw=lw,
    color="green",
)
plt.errorbar(
    range_n_outliers,
    err_loc_emp_pure.mean(1),
    yerr=err_loc_emp_pure.std(1) / np.sqrt(repeat),
    label="Pure data set mean",
    lw=lw,
    color="black",
)
plt.title("Influence of outliers on the location estimation")
plt.ylabel(r"Error ($||\mu - \hat{\mu}||_2^2$)")
plt.legend(loc="upper left", prop=font_prop)

plt.subplot(2, 1, 2)
x_size = range_n_outliers.size
plt.errorbar(
    range_n_outliers,
    err_cov_mcd.mean(1),
    yerr=err_cov_mcd.std(1),
    label="Robust covariance (mcd)",
    color="m",
)
plt.errorbar(
    range_n_outliers[: (x_size // 5 + 1)],
    err_cov_emp_full.mean(1)[: (x_size // 5 + 1)],
    yerr=err_cov_emp_full.std(1)[: (x_size // 5 + 1)],
    label="Full data set empirical covariance",
    color="green",
)
plt.plot(
    range_n_outliers[(x_size // 5) : (x_size // 2 - 1)],
    err_cov_emp_full.mean(1)[(x_size // 5) : (x_size // 2 - 1)],
    color="green",
    ls="--",
)
plt.errorbar(
    range_n_outliers,
    err_cov_emp_pure.mean(1),
    yerr=err_cov_emp_pure.std(1),
    label="Pure data set empirical covariance",
    color="black",
)
plt.title("Influence of outliers on the covariance estimation")
plt.xlabel("Amount of contamination (%)")
plt.ylabel("RMSE")
plt.legend(loc="center", prop=font_prop)

plt.tight_layout()
plt.show()

Общее время выполнения скрипта: (0 минут 3.185 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_robust_vs_empirical_covariance.ipynb

Download Python source code: plot_robust_vs_empirical_covariance.py

Download zipped: plot_robust_vs_empirical_covariance.zip

Связанные примеры

Устойчивая оценка ковариации и применимость расстояний Махаланобиса

Обнаружение выбросов в реальном наборе данных

Оценивание Ledoit–Wolf и OAS

Линейный и квадратичный дискриминантный анализ с эллипсоидом ковариации

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/covariance/plot_robust_vs_empirical_covariance.html

Spec-Zone.ru

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