• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

TSVD scipy와 scikit_learn

22.01.01 14:44 작성 조회수 316

0

안녕하세요?
새해복 많이 받으세요~
제가 책 p.402의 예제에서는 사이킷럿으로 나와있는데 이것을 사이파이로 바꿔서 한번 돌려봤습니다.
그 결과 y=-x에 대해 대칭인 결과가 나왔는데요. 제가 뭘 잘못 돌린걸까요?
 
사이파이
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy as np
from scipy.sparse.linalg import svds
from scipy.linalg import svd

iris = load_iris()
iris_ftrs = iris.data
# 2개의 주요 component TruncatedSVD 변환
U, Sigma, Vt = svd(iris_ftrs, full_matrices=False)
num_components = 2
U_tr, Sigma_tr, Vt_tr = svds(iris_ftrs, k=num_components)
print('\nTruncated SVD 분해 행렬 차원:',U_tr, Sigma_tr, Vt_tr.shape)
matrix_tr = np.dot(U_tr,np.diag(Sigma_tr)) # output of TruncatedSVD
plt.scatter(x=matrix_tr[:,0], y= matrix_tr[:,1])
plt.xlabel('TruncatedSVD Component 1')
plt.ylabel('TruncatedSVD Component 2')
print(matrix_tr)

 

사이킷럿

from sklearn.decomposition import TruncatedSVD, PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

iris = load_iris()
iris_ftrs = iris.data
# 2개의 주요 component TruncatedSVD 변환
tsvd = TruncatedSVD(n_components=2)
tsvd.fit(iris_ftrs)
iris_tsvd = tsvd.transform(iris_ftrs)

# Scatter plot 2차원으로 TruncatedSVD 변환 된 데이터 표현. 품종은 색깔로 구분
plt.scatter(x=iris_tsvd[:,0], y= iris_tsvd[:,1], c= iris.target)
plt.xlabel('TruncatedSVD Component 1')
plt.ylabel('TruncatedSVD Component 2')
print(iris_tsvd)

 

답변 2

·

답변을 작성해보세요.

1

1. default값이 0인데 tol=0를 적어줘야 되는 이유와 tolerance의 사전적 의미는 알지만 여기서의 파라미터의 의미가 조금 궁금합니다.

=> default값이 0이므로 tol=0을 적어주실 필요 없습니다. tolerance의 정확한 의미는 저도 모르겠습니다. 아마도 SVD 계산시 컴퓨터의 허용 수치연산값 한계치로 생각됩니다. 

주피터와 파이참에서 왜 그런지는 잘 모르겠습니다. 아마도  scipy.linalg 의 scipy.sparse.linalg의 svds가 수행시마다 행렬 분해 값이 변경이 되는 것 같습니다.

사이킷런의 TruncatedSVD의 구현 소스를 알려 드리오니 참조해 보시기 바랍니다.   195 line에서 212 line 참조하시면 될 겁니다. 

https://github.com/scikit-learn/scikit-learn/blob/ed865d7a3363a92846d7955a9bdedae2ad29542e/sklearn/decomposition/_truncated_svd.py#L24

 

1

안녕하십니까, 

사이킷런의 TruncatedSVD는 scipy.linalg 의 svd를 사용하지 않고, scipy.sparse.linalg의 svds 를 사용해서 그런것 같습니다. 아래와 같이 코드를 바꿔 보시지요. 

U, Sigma, Vt = svds(iris_ftrs, k=2, tol=0)
tu님의 프로필

tu

질문자

2022.01.02

답변 감사합니다.

tol=0 를 적용해봤습니다.

여기서 3가지 궁금증이 생겼는데요.

 

1. default값이 0인데 tol=0를 적어줘야 되는 이유와 tolerance의 사전적 의미는 알지만 여기서의 파라미터의 의미가 조금 궁금합니다.

tolfloat, optional

Tolerance for singular values. Zero (default) means machine precision.

 

 

 

2. 주피터 노트북으로 해당 코드 실행히 x,y는 바뀌지만 (x=y대칭) 값이 제대로 나왔습니다. 여기서 x,y값이 왜 바뀌어서 나오는 것인가요?

 

3. 파이참으로 동일 코드를 수행했을때 tol=0의 파라미터를 추가 해줬는데도 불구하고 처음과 동일하게 y=-x대칭인 값이 나옵니다. 이 또한 궁금합니다. 제 생각에는 파이참은 그냥 IDE이기 때문에 이걸 통제할 수 있는 요소가 없을 것 같거든요... 제가 사용하는 interpreter는 아나콘다의 파이썬입니다.

 

항상 친절한 답변 감사합니다!!