공분산 추정기 비교

Beginner

This tutorial is from open-source community. Access the source code

소개

공분산 추정은 통계 분석에서 중요한 작업입니다. 이 실습에서는 Ledoit-Wolf 및 OAS 두 가지 공분산 추정 방법을 비교합니다. 이 실습에서는 가우시안 분포 데이터를 사용하여 두 방법의 추정된 MSE 를 비교합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

먼저, 이 실습에 필요한 라이브러리를 가져와야 합니다. numpy는 수치 계산, matplotlib는 시각화, scikit-learn은 공분산 추정에 사용됩니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz, cholesky
from sklearn.covariance import LedoitWolf, OAS

데이터 생성

다음으로, AR(1) 과정을 따르는 공분산 행렬을 가진 가우시안 분포 데이터를 생성합니다. scipy.linalgtoeplitzcholesky 함수를 사용하여 공분산 행렬을 생성합니다.

np.random.seed(0)

n_features = 100
r = 0.1
real_cov = toeplitz(r ** np.arange(n_features))
coloring_matrix = cholesky(real_cov)

MSE 및 축소량 계산

모의 데이터를 사용하여 Ledoit-Wolf 및 OAS 방법을 비교합니다. 두 방법의 평균 제곱 오차 (MSE) 와 축소량을 계산합니다.

n_samples_range = np.arange(6, 31, 1)
repeat = 100
lw_mse = np.zeros((n_samples_range.size, repeat))
oa_mse = np.zeros((n_samples_range.size, repeat))
lw_shrinkage = np.zeros((n_samples_range.size, repeat))
oa_shrinkage = np.zeros((n_samples_range.size, repeat))

for i, n_samples in enumerate(n_samples_range):
    for j in range(repeat):
        X = np.dot(np.random.normal(size=(n_samples, n_features)), coloring_matrix.T)

        lw = LedoitWolf(store_precision=False, assume_centered=True)
        lw.fit(X)
        lw_mse[i, j] = lw.error_norm(real_cov, scaling=False)
        lw_shrinkage[i, j] = lw.shrinkage_

        oa = OAS(store_precision=False, assume_centered=True)
        oa.fit(X)
        oa_mse[i, j] = oa.error_norm(real_cov, scaling=False)
        oa_shrinkage[i, j] = oa.shrinkage_

결과 플롯

마지막으로, Ledoit-Wolf 및 OAS 방법의 MSE 및 축소량을 비교하기 위해 결과를 플롯합니다.

plt.subplot(2, 1, 1)
plt.errorbar(
    n_samples_range,
    lw_mse.mean(1),
    yerr=lw_mse.std(1),
    label="Ledoit-Wolf",
    color="navy",
    lw=2,
)
plt.errorbar(
    n_samples_range,
    oa_mse.mean(1),
    yerr=oa_mse.std(1),
    label="OAS",
    color="darkorange",
    lw=2,
)
plt.ylabel("제곱 오차")
plt.legend(loc="upper right")
plt.title("공분산 추정기 비교")
plt.xlim(5, 31)

plt.subplot(2, 1, 2)
plt.errorbar(
    n_samples_range,
    lw_shrinkage.mean(1),
    yerr=lw_shrinkage.std(1),
    label="Ledoit-Wolf",
    color="navy",
    lw=2,
)
plt.errorbar(
    n_samples_range,
    oa_shrinkage.mean(1),
    yerr=oa_shrinkage.std(1),
    label="OAS",
    color="darkorange",
    lw=2,
)
plt.xlabel("n_samples")
plt.ylabel("축소량")
plt.legend(loc="lower right")
plt.ylim(plt.ylim()[0], 1.0 + (plt.ylim()[1] - plt.ylim()[0]) / 10.0)
plt.xlim(5, 31)

plt.show()

요약

이 실험에서는 가우시안 분포 데이터를 사용하여 공분산 추정을 위한 Ledoit-Wolf 및 OAS 방법을 비교했습니다. 두 방법의 MSE 와 축소량을 플롯하여 OAS 방법이 데이터가 가우시안이라는 가정 하에서 더 나은 수렴성을 보이는 것을 확인했습니다.