파이썬으로 SVD를 계산하는 방법

행렬 분해라고도 하는 행렬 분해는 구성 요소를 사용하여 주어진 행렬을 설명하는 것을 포함합니다.

아마도 가장 잘 알려져 있고 널리 사용되는 행렬 분해 방법은 특이값 분해 또는 SVD일 것입니다. 모든 행렬에는 SVD가 있으므로 고유 분해와 같은 다른 방법보다 안정적입니다. 따라서 압축, 노이즈 제거 및 데이터 감소를 포함한 다양한 응용 분야에서 자주 사용됩니다.

이 튜토리얼에서는 행렬을 구성 요소로 분해하기 위한 Singular-Value 분해 방법을 알아봅니다.

이 자습서를 완료하면 다음을 알 수 있습니다.

  • 특이값 분해란 무엇이며 무엇이 관련되어 있는지.
  • SVD를 계산하고 SVD 요소에서 직사각형 및 정사각형 행렬을 재구성하는 방법.
  • 의사 역을 계산하고 SVD를 사용하여 차원 축소를 수행하는 방법.

튜토리얼 개요

이 튜토리얼은 다음과 같이 다섯 부분으로 나뉩니다.

  1. 특이값 분해
  2. 특이값 분해 계산
  3. SVD에서 행렬 재구성
  4. 의사 역에 대한 SVD
  5. 차원 축소를 위한 SVD

특이값 분해

특이값 분해 또는 줄여서 SVD는 특정 후속 행렬 계산을 더 간단하게 만들기 위해 행렬을 구성 부분으로 줄이는 행렬 분해 방법입니다.

단순화의 경우 실수 값 행렬에 대한 SVD에 초점을 맞추고 복소수의 경우는 무시합니다.

여기서 A는 분해하려는 실수 m x n 행렬이고, U는 m x m 행렬이고, Sigma(종종 대문자 그리스 문자 Sigma로 표시됨)는 m x n 대각선 행렬이고, V^T는 N x n 행렬의 전치이며, 여기서 T는 위 첨자입니다.

특이값 분해는 선형 대수학의 하이라이트입니다.

— 371페이지, 선형 대수학 입문, 제5판, 2016.

시그마 행렬의 대각선 값은 원래 행렬 A의 특이 값으로 알려져 있습니다. U 행렬의 열을 A의 왼쪽 특이 벡터라고 하고 V의 열을 A의 오른쪽 특이 벡터라고 합니다.

SVD는 반복적인 수치 방법을 통해 계산됩니다. 우리는 이러한 방법에 대해 자세히 설명하지 않을 것입니다. 모든 직사각형 행렬에는 단수 값 분해가 있지만 결과 행렬에는 복소수가 포함될 수 있으며 부동 소수점 산술의 한계로 인해 일부 행렬이 깔끔하게 분해되지 않을 수 있습니다.

특이값 분해(SVD)는 행렬을 특이 벡터와 특이값으로 인수 분해하는 또 다른 방법을 제공합니다. SVD를 사용하면 고유 분해와 동일한 종류의 정보를 발견 할 수 있습니다. 그러나 SVD가 더 일반적으로 적용됩니다.

— 페이지 44-45, 딥 러닝, 2016.

SVD는 행렬 역과 같은 다른 행렬 연산의 계산뿐만 아니라 머신러닝의 데이터 축소 방법으로도 널리 사용됩니다. SVD는 최소 제곱 선형 회귀, 이미지 압축 및 노이즈 제거 데이터에도 사용할 수 있습니다.

특이값 분해(SVD)는 통계, 머신러닝 및 컴퓨터 과학 분야에서 수많은 응용 분야를 가지고 있습니다. SVD를 매트릭스에 적용하는 것은 X선 비전으로 매트릭스 내부를 보는 것과 같습니다…

— 페이지 297, 선형 대수학에 대한 헛소리 가이드 없음, 2017


특이값 분해 계산

SVD는 svd() 함수를 호출하여 계산할 수 있습니다.

이 함수는 행렬을 사용하여 U, Sigma 및 V^T 요소를 반환합니다. 시그마 대각선 행렬은 특이값으로 구성된 벡터로 반환됩니다. V 행렬은 전치 된 형식 (예 : VT)으로 반환됩니다.

아래 예제에서는 3×2 행렬을 정의하고 Singular 값 분해를 계산합니다.

예제를 실행하면 먼저 정의된 3×2 행렬이 인쇄된 다음 분해에서 계산된 3×3U 행렬, 2요소 Sigma 벡터 및 2×2V^T 행렬 요소가 인쇄됩니다.

SVD에서 행렬 재구성

원래 행렬은 U, Sigma 및 V^T 요소에서 재구성할 수 있습니다.

svd()에서 반환된 U, s 및 V 요소는 직접 곱할 수 없습니다.

s 벡터는 diag() 함수를 사용하여 대각 행렬로 변환되어야 합니다. 기본적으로 이 함수는 원래 행렬을 기준으로 n x n인 정사각형 행렬을 만듭니다. 이로 인해 행렬의 크기가 행렬의 열 수가 후속 행렬의 행 수와 일치해야 하는 행렬 곱셈 규칙에 맞지 않기 때문에 문제가 발생합니다.

정사각형 시그마 대각선 행렬을 만든 후 행렬의 크기는 다음과 같이 분해하는 원래 m x n 행렬을 기준으로 합니다.

실제로 필요한 경우 :

m x n (예 : 더 많은 행) 인 모든 0 값의 새 시그마 행렬을 만들고 행렬의 첫 번째 n x n 부분을 diag() 통해 계산 된 정사각형 대각선 행렬로 채우면이를 달성 할 수 있습니다.

예제를 실행하면 먼저 원본 행렬이 인쇄된 다음 SVD 요소에서 재구성된 행렬이 인쇄됩니다.

시그마 대각선에 대한 위의 합병증은 m과 n이 같지 않은 경우에만 존재합니다. 대각선 행렬은 다음과 같이 정사각형 행렬을 재구성 할 때 직접 사용할 수 있습니다.

예제를 실행하면 원래 3×3 행렬과 SVD 요소에서 직접 재구성된 버전이 인쇄됩니다.

유사 역(pseudoinverse)에 대한 SVD

유사 역행렬은 정사각형 행렬에 대한 행렬 역행렬을 행과 열의 개수가 같지 않은 직사각형 행렬로 일반화한 것입니다.

그것은 또한 방법의 두 독립적 인 발견자 또는 일반화 된 역의 이름을 따서 무어-펜로즈 역이라고 불립니다.

행렬 반전은 정사각형이 아닌 행렬에 대해 정의되지 않습니다. […] A에 행보다 열이 더 많은 경우 의사 역을 사용하여 선형 방정식을 풀면 가능한 많은 솔루션 중 하나가 제공됩니다.

— 46페이지, 딥러닝, 2016.

의사 역은 A^+로 표시되며, 여기서 A는 반전되는 행렬이고 +는 위 첨자입니다.

의사 역은 A의 특이값 분해를 사용하여 계산됩니다.

또는 점 표기법이 없는 경우:

여기서 A^+는 의사 역수, D^+는 대각선 행렬 시그마의 의사 역수, U^T는 U의 전치입니다.

SVD 작업에서 당신과 V를 얻을 수 있습니다.

D^+는 Sigma에서 대각선 행렬을 만들고, Sigma에서 0이 아닌 각 요소의 역수를 계산하고, 원래 행렬이 직사각형인 경우 전치를 취하여 계산할 수 있습니다.

의사 역은 선형 회귀 방정식을 푸는 한 가지 방법을 제공하며, 특히 열보다 행이 더 많은 경우 종종 발생합니다.

NumPy는 직사각형 행렬의 의사 역수를 계산하기 위한 pinv() 함수를 제공합니다.

아래 예제에서는 4×2 행렬을 정의하고 의사 역행렬을 계산합니다.

예제를 실행하면 먼저 정의된 행렬이 인쇄된 다음 계산된 의사 역행렬이 인쇄됩니다.

SVD를 통해 의사 역수를 수동으로 계산하고 결과를 pinv() 함수와 비교할 수 있습니다.

먼저 SVD를 계산해야합니다. 다음으로 s 배열에 있는 각 값의 역수를 계산해야 합니다. 그런 다음 s 배열을 직사각형으로 만들기 위해 0 행이 추가 된 대각선 행렬로 변환 할 수 있습니다. 마지막으로 요소에서 의사 역수를 계산할 수 있습니다.

구체적인 구현은 다음과 같습니다.

전체 예제는 다음과 같습니다.

예제를 실행하면 정의된 사각형 행렬과 pinv() 함수의 위 결과와 일치하는 의사 역행렬이 인쇄됩니다.


차원 축소를 위한 SVD

SVD의 인기 있는 응용 분야는 차원 축소입니다.

관측치(행)보다 더 많은 특징(열)과 같이 많은 수의 특징을 갖는 데이터는 예측 문제와 가장 관련이 있는 특징의 더 작은 서브세트로 축소될 수 있습니다.

결과는 원래 행렬에 근사한다고 하는 순위가 낮은 행렬입니다.

이를 위해 원본 데이터에 대해 SVD 연산을 수행하고 시그마에서 상위 k 개의 가장 큰 특이 값을 선택할 수 있습니다. 이러한 열은 Sigma에서 선택하고 V^T에서 선택한 행을 선택할 수 있습니다.

그런 다음 원래 벡터 A의 근사 B를 재구성할 수 있습니다.

자연어 처리에서 이 접근 방식은 문서의 단어 발생 행렬 또는 단어 빈도에 사용할 수 있으며 잠재 의미 체계 분석 또는 잠재 의미 체계 인덱싱이라고 합니다.

실제로 T라는 데이터의 설명 하위 집합을 유지하고 작업할 수 있습니다. 이것은 행렬 또는 투영의 조밀한 요약입니다.

또한, 이 변환은 원래의 행렬 A 뿐만 아니라 다른 유사한 행렬들에도 계산되고 적용될 수 있다.

아래 예는 SVD를 사용한 데이터 축소를 보여줍니다.

먼저 행보다 열이 많은 3×10 행렬이 정의됩니다. SVD가 계산되고 처음 두 피처만 선택됩니다. 요소는 원래 행렬을 정확하게 재현하기 위해 재결합됩니다. 마지막으로 변환은 두 가지 방법으로 계산됩니다.

예제를 실행하면 먼저 정의된 행렬이 인쇄된 다음 재구성된 근사치가 인쇄되고 원래 행렬의 두 개의 동등한 변환이 인쇄됩니다.

scikit-learn은 이 기능을 직접 구현하는 잘린 SVD 클래스를 제공합니다.

TruncatedSVD 클래스를 만들 수 있으며, 여기서 선택할 바람직한 기능 또는 구성 요소의 수(예: 2)를 지정해야 합니다. 일단 생성되면fit()함수를 호출하여 변환 (예 : V ^ Tk 계산)을 피팅 한 다음transform()함수를 호출하여 원래 행렬에 적용 할 수 있습니다. 결과는 위의 T라는 A의 변환입니다.

아래 예제에서는 잘린 SVD 클래스를 보여 줍니다.

예제를 실행하면 먼저 정의된 행렬이 인쇄된 다음 행렬의 변환된 버전이 인쇄됩니다.

일부 값의 기호를 제외하고 값이 위에서 수동으로 계산한 값과 일치함을 알 수 있습니다. 관련된 계산의 특성과 사용된 기본 라이브러리 및 메서드의 차이를 고려할 때 기호와 관련하여 약간의 불안정성이 있을 것으로 예상할 수 있습니다. 이러한 부호의 불안정성은 변환이 재사용을 위해 훈련되는 한 실제로 문제가 되지 않습니다.

확장

이 섹션에는 탐색할 수 있는 자습서를 확장하기 위한 몇 가지 아이디어가 나열되어 있습니다.

  • 자신의 데이터에 대해 SVD 방법을 실험해 보십시오.
  • 머신러닝에서 SVD의 10가지 응용 프로그램을 연구하고 나열합니다.
  • SVD를 테이블 형식 데이터 세트에 데이터 축소 기술로 적용합니다.


추가 정보

이 섹션에서는 더 자세히 알아보려는 경우 주제에 대한 더 많은 리소스를 제공합니다.


API


기사


요약

이 자습서에서는 행렬을 구성 요소로 분해하기 위한 Singular-value 분해 방법을 알아보았습니다.

특히 다음 내용을 배웠습니다.

  • 특이값 분해란 무엇이며 무엇이 관련되어 있는지.
  • SVD를 계산하고 SVD 요소에서 직사각형 및 정사각형 행렬을 재구성하는 방법.
  • 유사 역을 계산하고 SVD를 사용하여 차원 축소를 수행하는 방법.

네피리티
No Comments

Sorry, the comment form is closed at this time.