ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SVD(Singular Value Decomposition)란 무엇인가? (파이썬으로 SVD 구현하기 실습 포함)
    데이터/처리 및 분석 2024. 10. 19. 10:51

     

     

     

    SVD란 무엇인가?

    SVD(Singular Value Decomposition)는 복잡한 고차원 데이터를 더 적은 차원으로 축소하면서도 핵심 정보를 유지할 수 있는 방법입니다. 이를 통해 데이터의 분석이 더 간단해지고 시각화가 쉬워지며, 불필요한 노이즈를 제거하는 데도 유용합니다. 이번 포스팅에서는 Iris 데이터셋을 사용해 SVD를 직접 적용하는 방법을 배우고, 이를 통해 차원 축소된 데이터를 시각화하는 방법까지 살펴보겠습니다.

    SVD 계산 과정

    SVD는 \( A\)라는 행렬을 세 개의 행렬 \( , \( \Sigma\), \( V^T\)로 분해하는 과정을 말합니다. 수식으로 표현하면 다음과 같습니다.

    \( A = U \Sigma V^T\)

    여기서 각 행렬의 의미는 다음과 같습니다:

    • \(A\): 원본 행렬입니다.
    • \(U\): 원본 행렬의 좌표계를 나타내는 직교 행렬로, 데이터의 패턴을 설명하는 좌표계입니다.
    • \(\Sigma\): 대각 행렬로, 대각선에 있는 값들이 특이값(Singular Values)입니다. 이 특이값은 데이터의 분산 정도를 설명합니다.
    • \(V^T\): 원본 행렬의 새로운 좌표계를 나타내는 직교 행렬입니다.

    1. 데이터 정규화

    SVD를 적용하기 전에, PCA와 마찬가지로 데이터를 정규화하는 것이 좋습니다. 정규화는 변수들의 스케일을 맞춰주는 작업으로, 특이값 분해 결과에 영향을 미칠 수 있는 변수를 균형 있게 다룰 수 있게 해줍니다.

    2. 특이값 분해

    SVD는 데이터를 고유값 분해와 유사한 방식으로, 고유값 대신 특이값을 계산하여 행렬을 분해합니다. 특이값 분해는 차원 축소 및 노이즈 제거에도 유용하며, 데이터의 중요한 패턴을 찾을 수 있습니다.

     

    SVD를 통해 얻은 특이값들은 데이터의 중요도를 나타내며, 큰 특이값은 데이터에서 중요한 정보를 설명하는 반면, 작은 특이값은 노이즈나 덜 중요한 정보를 나타냅니다.

    SVD의 활용 예시

    SVD는 여러 분야에서 활용됩니다. 몇 가지 주요 응용 분야는 다음과 같습니다:

    1. 차원 축소

    PCA와 유사하게, SVD는 데이터의 차원을 줄이면서 중요한 정보를 유지할 수 있습니다. 차원 축소는 고차원 데이터에서 분석의 복잡성을 줄이고, 연산 속도를 높이는 데 유리합니다.

    2. 이미지 압축

    이미지를 SVD를 통해 압축하면, 이미지의 품질을 유지하면서도 저장 공간을 줄일 수 있습니다. SVD로 압축된 이미지는 특이값이 적은 성분들을 제거해 용량을 줄이지만, 주요한 시각적 정보를 유지할 수 있습니다.

    3. 추천 시스템

    SVD는 추천 시스템에서 사용되며, 특히 넷플릭스나 아마존 같은 플랫폼에서 사용자와 제품 간의 관계를 분석하는 데 도움이 됩니다. SVD를 통해 사용자와 제품의 행렬을 분해하여, 잠재적인 선호 패턴을 찾아낼 수 있습니다.

    Iris 데이터셋이란?

    Iris 데이터셋은 머신러닝 및 통계학에서 널리 사용되는 데이터셋입니다. 이 데이터셋은 붓꽃의 세 가지 품종(Iris setosa, Iris versicolor, Iris virginica)에 대한 150개의 샘플로 구성되어 있으며, 각 샘플은 꽃받침의 길이와 너비, 꽃잎의 길이와 너비를 특징으로 가지고 있습니다. 이 4차원 데이터를 2차원으로 축소하여 시각화하는 것이 이번 실습의 목표입니다.

    파이썬으로 SVD 구현하기

    Python과 scikit-learn을 사용하여 SVD를 적용하는 단계별 실습입니다. 이 과정에서는 SVD를 사용해 데이터를 차원 축소한 후, 축소된 데이터를 시각화하고, 결과를 해석하는 방법을 다룹니다. 

    1. 필요한 라이브러리 임포트

    import numpy as np
    import pandas as pd
    from sklearn.decomposition import TruncatedSVD
    from sklearn.datasets import load_iris
    from sklearn.preprocessing import StandardScaler
    import matplotlib.pyplot as plt
    • numpy와 pandas: 데이터 처리 및 행렬 연산을 위한 라이브러리.
    • TruncatedSVD: SVD를 적용하는 클래스.
    • load_iris: Iris 데이터셋을 불러오는 함수.
    • StandardScaler: 데이터를 정규화(표준화)하는 클래스.
    • matplotlib.pyplot: 데이터를 시각화하기 위한 라이브러리.

    TruncatedSVD는 scikit-learn에서 제공하는 SVD 알고리즘을 사용하여 차원 축소를 쉽게 수행할 수 있습니다. 차원 축소 후 데이터를 시각화하기 위해 matplotlib를 사용합니다.

    2. Iris 데이터셋 로드

    iris = load_iris()
    X = iris.data
    y = iris.target
    feature_names = iris.feature_names

     

    • load_iris() 함수를 사용해 Iris 데이터셋을 로드하고, 이를 X (특징 데이터)와 y (타겟 클래스)로 나눕니다.
    • X는 4개의 특징을 가진 150개의 샘플을 포함하며, y는 각 샘플의 품종 레이블을 나타냅니다.

     

    3. 데이터 정규화 

     

    scaler = StandardScaler()
    X_standardized = scaler.fit_transform(X)

     

    • 정규화의 중요성: PCA와 SVD 모두 데이터의 분산을 기준으로 데이터를 변환하는 기법이므로, 각 특징의 스케일이 다르면 분석에 영향을 미칠 수 있습니다. 이를 방지하기 위해 표준화를 진행합니다.
    • StandardScaler는 데이터의 평균을 0, 표준편차를 1로 맞추어 모든 변수가 동일한 스케일을 갖도록 변환합니다.

     

    4. SVD 적용

    svd = TruncatedSVD(n_components=2)
    X_svd = svd.fit_transform(X_standardized)

     

    • TruncatedSVD: SVD를 이용해 차원을 축소하는 클래스로, 여기서는 n_components=2를 지정해 2차원으로 차원을 축소합니다.
    • fit_transform을 통해 SVD를 적용한 후, 차원 축소된 데이터를 X_svd에 저장합니다.
    • SVD는 원본 데이터의 분산을 가장 잘 설명하는 두 개의 축을 찾아 데이터를 축소합니다.

    5. SVD 결과 출력 

    print("SVD로 차원 축소된 데이터:\n", X_svd)

     

    • SVD를 통해 차원 축소된 데이터를 출력하여, 원래 4차원이었던 데이터가 2차원으로 축소된 것을 확인합니다.
    • 이 차원 축소된 데이터는 시각화를 통해 더 쉽게 해석할 수 있습니다.

     

     

    6. 시각화 (차원 축소 결과)

    plt.figure(figsize=(8, 6))
    colors = ['r', 'g', 'b']
    for i, color in zip([0, 1, 2], colors):
        plt.scatter(X_svd[y == i, 0], X_svd[y == i, 1], label=iris.target_names[i], color=color)
    
    plt.xlabel('주성분 1 (PC1)')
    plt.ylabel('주성분 2 (PC2)')
    plt.title('SVD를 사용한 Iris 데이터 차원 축소')
    plt.legend()
    plt.grid(True)
    plt.show()

     

    • 시각화: 차원 축소된 데이터(X_svd)를 2차원 공간에 시각화합니다.
    • 각 품종(Iris setosa, Iris versicolor, Iris virginica)을 색깔로 구분하여, SVD가 어떻게 데이터를 구분하는지 시각적으로 확인할 수 있습니다.
    • 차원 축소 전보다 데이터 간의 구분이 명확해지는 것을 확인할 수 있습니다.

     

    7. 특이값 출력

    print("특이값(Singular Values):", svd.singular_values_)

     

    • 특이값: SVD에서 나온 특이값은 각 주성분이 데이터의 분산을 얼마나 잘 설명하는지를 나타냅니다. 첫 번째 특이값이 가장 크고, 두 번째 특이값은 상대적으로 작습니다.
    • 특이값이 클수록 해당 주성분이 데이터의 중요한 패턴을 많이 설명하고 있다는 의미입니다.

     

    전체 코드

    import numpy as np
    import pandas as pd
    from sklearn.decomposition import TruncatedSVD
    from sklearn.datasets import load_iris
    from sklearn.preprocessing import StandardScaler
    import matplotlib.pyplot as plt
    
    # 1. Iris 데이터셋 로드
    iris = load_iris()
    X = iris.data
    y = iris.target
    feature_names = iris.feature_names
    
    # 2. 데이터 정규화
    scaler = StandardScaler()
    X_standardized = scaler.fit_transform(X)
    
    # 3. SVD 적용 (2개의 주성분으로 차원 축소)
    svd = TruncatedSVD(n_components=2)
    X_svd = svd.fit_transform(X_standardized)
    
    # 4. SVD 결과 출력
    print("SVD로 차원 축소된 데이터:\n", X_svd)
    
    # 5. 차원 축소 결과 시각화
    plt.figure(figsize=(8, 6))
    colors = ['r', 'g', 'b']
    for i, color in zip([0, 1, 2], colors):
        plt.scatter(X_svd[y == i, 0], X_svd[y == i, 1], label=iris.target_names[i], color=color)
    
    plt.xlabel('주성분 1 (PC1)')
    plt.ylabel('주성분 2 (PC2)')
    plt.title('SVD를 사용한 Iris 데이터 차원 축소')
    plt.legend()
    plt.grid(True)
    plt.show()
    
    # 6. 특이값 출력
    print("특이값(Singular Values):", svd.singular_values_)

    결과 및 해석

    1. SVD로 차원 축소된 데이터 출력

    각 붓꽃 샘플이 2차원 주성분 공간에서 표현된 것을 볼 수 있습니다.

    SVD로 차원 축소된 데이터:
    [[-2.26454173  0.5057039 ]
     [-2.0864255   0.65540473]
     [-2.36795045  0.31847731]
     [-2.30419716  0.57536771]
     [-2.38877749 -0.6747674 ]]
    ...

    2. 차원 축소된 데이터 시각화 

    2차원으로 축소된 Iris 데이터는 붓꽃 품종별로 잘 구분됩니다. 세 개의 품종이 주성분 공간에서 나름의 영역을 차지하며 구분되는 것을 볼 수 있습니다.

     

    3. 특이값

    첫 번째 특이값이 가장 크며, 이는 첫 번째 주성분이 데이터를 설명하는 데 가장 중요한 역할을 한다는 것을 의미합니다.

    특이값(Singular Values): [2.93858199 2.07053062]

     

    이번 실습에서는 SVD를 이용해 Iris 데이터셋을 4차원에서 2차원으로 축소하고, 이를 시각화하는 방법을 배웠습니다. SVD는 데이터를 간소화하면서도 중요한 패턴을 유지할 수 있는 강력한 도구로, 차원 축소 외에도 추천 시스템, 이미지 압축 등 다양한 분야에서 사용됩니다. 차원 축소된 데이터를 시각화함으로써 복잡한 데이터의 구조를 더 쉽게 이해할 수 있습니다.

     

    SVD는 데이터 분석 및 머신러닝의 필수적인 도구 중 하나로, 고차원 데이터를 효율적으로 처리하는 데 큰 도움이 됩니다.

Designed by Tistory.