파이썬에서 강력한 공분산 추정

Beginner

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

소개

이 실습에서는 Python 의 scikit-learn 라이브러리를 사용하여 강력한 공분산 행렬을 추정하는 방법을 배웁니다. 이 튜토리얼은 강력한 공분산 추정의 개념을 소개하고 이상치가 포함된 데이터 집합의 공분산 행렬을 추정하는 방법을 보여줍니다.

VM 팁

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

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

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

라이브러리 가져오기

첫 번째 단계는 필요한 라이브러리를 가져오는 것입니다. 이 튜토리얼에서는 NumPy, Matplotlib, 그리고 scikit-learn 을 사용할 것입니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.covariance import MinCovDet, EmpiricalCovariance

데이터 생성

이 단계에서는 n_samples개의 샘플과 n_features개의 특징을 가진 무작위 데이터 집합을 생성합니다. 또한 데이터 집합에 일부 이상치를 추가합니다.

n_samples = 80
n_features = 5

## 무작위 데이터 집합 생성
rng = np.random.RandomState(42)
X = rng.randn(n_samples, n_features)

## 데이터 집합에 이상치 추가
n_outliers = 20
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

강력한 공분산 행렬 추정

이 단계에서는 최소 공분산 행렬 결정 (MCD) 추정기를 사용하여 데이터 집합의 강력한 공분산 행렬을 추정합니다.

## 데이터 집합의 강력한 공분산 행렬 추정
mcd = MinCovDet().fit(X)
robust_cov = mcd.covariance_

경험적 공분산 행렬 추정

이 단계에서는 최대 가능도 추정 (MLE) 추정기를 사용하여 데이터 집합의 경험적 공분산 행렬을 추정합니다.

## 데이터 집합의 경험적 공분산 행렬 추정
emp_cov = EmpiricalCovariance().fit(X).covariance_

공분산 행렬 비교

이 단계에서는 데이터 집합의 추정된 강력 및 경험적 공분산 행렬을 비교합니다.

## 추정된 공분산 행렬 비교
print("강력 공분산 행렬:")
print(robust_cov)
print("\n경험적 공분산 행렬:")
print(emp_cov)

결과 시각화

이 단계에서는 강력 및 경험적 공분산 추정 결과를 시각화합니다.

## 결과 시각화
fig, ax = plt.subplots()

## 데이터셋 플롯
inliers_index = np.arange(n_samples)[~np.in1d(np.arange(n_samples), outliers_index)]
ax.scatter(
    X[inliers_index, 0], X[inliers_index, 1], color="black", label="내부값"
)
ax.scatter(X[outliers_index, 0], X[outliers_index, 1], color="red", label="외부값")

## 추정된 공분산 행렬 플롯
for covariance, color, label in zip(
    [emp_cov, robust_cov], ["green", "magenta"], ["MLE", "MCD"]
):
    v, w = np.linalg.eigh(covariance)
    u = w[0] / np.linalg.norm(w[0])
    angle = np.arctan2(u[1], u[0])
    angle = 180 * angle / np.pi
    v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
    ell = mpl.patches.Ellipse(
        mcd.location_,
        v[0],
        v[1],
        180 + angle,
        color=color,
        label=label,
        alpha=0.2,
    )
    ell.set_clip_box(ax.bbox)
    ell.set_facecolor(color)
    ax.add_artist(ell)

## 플롯 옵션 설정
plt.legend()
plt.title("강력 공분산 추정")
plt.show()

요약

이 튜토리얼에서는 Python 의 scikit-learn 라이브러리를 사용하여 강력한 공분산 행렬을 추정하는 방법을 배웠습니다. 또한 이상치가 포함된 데이터 집합의 공분산 행렬을 추정하기 위해 최소 공분산 행렬식 (MCD) 추정기를 사용하는 방법을 배웠습니다.