인프런 커뮤니티 질문&답변

헬로월드님의 프로필 이미지

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

LDA의 이해와 붓꽃 데이터 세트의 차원 축소 실습

LDA 그래프 좌우반전 질문합니다.

해결된 질문

20.10.05 15:01 작성

·

760

1

안녕하세요.

LDA 파트를 공부하는 중에

철민님께서 올려주신 소스코드를 동일하게 실행했는데

이런 결과가 나와야 하는데

같은 코드를 제가 돌렸을 때는

이런 결과가 나옵니다.

분류가 잘 되었음을 시각적으로 보는데에 있어서는 큰 문제가 없지만 어째서 이렇게 거꾸로? 보이게 되는지 궁금합니다.

답변 10

1

freedom07님의 프로필 이미지

2021. 03. 14. 16:23

버전이 업그레이드 되면서 정확하게는 모르겠지만.. 뭔가가 바뀌었나봐요.. 

코드에서 

for i, marker in enumerate(markers):

    x_axis_data = irisDF_lda[irisDF_lda['target']==i]['lda_component_1']*-1

    y_axis_data = irisDF_lda[irisDF_lda['target']==i]['lda_component_2']

x축 값에 -1을 곱하니깐 강의처럼 그림이 나오긴 하네요..!

0

freedom07님의 프로필 이미지

2021. 03. 14. 09:42

저도 반전으로 나오네요.. 이유가 궁금합니다..ㅜ

0

hyunseon.chae님의 프로필 이미지

2020. 10. 20. 22:18

https://ratsgo.github.io/machine%20learning/2017/03/21/LDA/

이 글의 'LDA에 대한 첫번째 접근' 부분에 있습니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

2020. 10. 15. 18:13

hyunseon.chae님 좋은 정보 감사합니다.

S_w^-1 * S_B 에 대한 것으로 확인이 되어 있는 글의 URL을 알수 있을 까요?

감사합니다.

0

hyunseon.chae님의 프로필 이미지

2020. 10. 14. 22:19

LDA계산 과정의 자료 중 2번째에 S_w^T * S_B 에 대한 eigenvector 분해를 통해서 진행한다고 하셨는데, 이에 대한 증명과정을 살펴보니, 증명결과로 S_w^-1 * S_B 에 대한 것으로 확인이 되어 있는 글이 있습니다.

이는 혹시 동일 목적의 다른 방법을 통해 구하는 과정일 수 있거나 한 것인지요?

대략의 생각으로는 두 분산의 행렬이 각각 최대와 최소가 되기 위한 값을 구하는 과정에 '하나를 Transpose해서 곱하는 과정'이 있는 것이 이해가 되지 않아서 찾아보다가 생긴 질문입니다.

0

헬로월드님의 프로필 이미지
헬로월드
질문자

2020. 10. 06. 09:05

그런 이슈가 있었군요. 감사합니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

2020. 10. 05. 20:51

확인해 보니 사이킷런 0.22.2 이상에서 부터 실습 예제 코드와 대칭으로 나오는 군요.

실습시 사용한 사이킷런이 0.22.1 인데 버전업이 되면서 결과가 달라지는 군요.

해당 부분은 제가 좀더 확인후에 다시 공지드리겠습니다.

감사합니다.

0

헬로월드님의 프로필 이미지
헬로월드
질문자

2020. 10. 05. 16:55

복붙에 용이하시라고 아래에 코드 덧붙입니다.

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.preprocessing import StandardScaler

from sklearn.datasets import load_iris

iris = load_iris()

iris_scaled = StandardScaler().fit_transform(iris.data)

lda = LinearDiscriminantAnalysis(n_components=2)

# fit()호출 시 target값 입력 

lda.fit(iris_scaled, iris.target)

iris_lda = lda.transform(iris_scaled)

print(iris_lda.shape)

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

lda_columns=['lda_component_1','lda_component_2']

irisDF_lda = pd.DataFrame(iris_lda,columns=lda_columns)

irisDF_lda['target']=iris.target

#setosa는 세모, versicolor는 네모, virginica는 동그라미로 표현

markers=['^', 's', 'o']

#setosa의 target 값은 0, versicolor는 1, virginica는 2. 각 target 별로 다른 shape으로 scatter plot

for i, marker in enumerate(markers):

    x_axis_data = irisDF_lda[irisDF_lda['target']==i]['lda_component_1']

    y_axis_data = irisDF_lda[irisDF_lda['target']==i]['lda_component_2']

    plt.scatter(x_axis_data, y_axis_data, marker=marker,label=iris.target_names[i])

plt.legend(loc='upper right')

plt.xlabel('lda_component_1')

plt.ylabel('lda_component_2')

plt.show()

0

헬로월드님의 프로필 이미지
헬로월드
질문자

2020. 10. 05. 16:47

깃허브에 올려주신 코드 그대로 실행했습니다.

한 화면에 담기 위해 화면 사이즈를 줄여서 캡쳐하느라 글자가 작아졌습니다. 양해바랍니다,,

버전은 아래와 같이 0.23.2 입니다.

참고로 PCA 공부할때는 문제 없이 동일하게 나왔습니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

2020. 10. 05. 16:25

안녕하십니까,

저도 이유가 궁금하군요. 실습 코드를 변경하지 않으셨다고 했는데, 일단 수행하신 모든 코드를 여기에 올려 주시겠습니까?

제가 수행해 보고 말씀드리겠습니다. 그리고 사이킷런 버전도 부탁드립니다.

감사합니다.