비버놀로지

[K-Means 클러스터링] PCA 차원축소 본문

인공지능 머신러닝

[K-Means 클러스터링] PCA 차원축소

KUNDUZ 2022. 11. 4. 13:14
728x90

PCA 차원축소

주성분 분석(Principal Component Analysis, PCA)은 고차원 데이터를 저차원의 데이터로 변환하는 알고리즘입니다.

13차원의 와인 데이터셋을 2차원으로 변환해보겠습니다.

sklearn.decomposition.PCA

PCA를 사용하기 위하여 scikit-learn에 구현된 함수를 호출합니다. PCA() 함수를 이용해 쉽게 PCA를 적용할 수 있습니다.

다음은 13차원의 데이터 X를 2차원으로 줄이는 코드입니다. 이때 X의 shape은 (n, 13) 형식이 되어야 합니다.

pca = sklearn.decomposition.PCA(n_components=2)
pca.fit(X)
pca_array = pca.transform(X)

실습에 사용된 와인 데이터는 UCI Machine Learning Repository Wine Data Set에서 받을 수 있습니다.

 

 

실습

이번 실습에서는 와인 데이터를 입력받아 PCA를 통해 2차원으로 줄인 뒤, 이것을 matplotlib을 이용해 출력하는 연습해보겠습니다.

data/wine.csv에 와인 데이터가 준비되어 있습니다. 각 행과 열은 각각 와인과 와인의 특성을 나타냅니다.

 

import sklearn.decomposition
import matplotlib.pyplot as plt
import numpy as np
import elice_utils
import csv

def main():
    X, attributes = input_data()
    #print(X)
    #print(X.shape)
    pca_array = normalize(X)
    #print(X)
    pca, pca_array = run_PCA(X, 2)
    visualize_2d_wine(pca_array)

def input_data():
    X = []
    attributes = []
    with open('data/attributes.txt') as fp:
        attributes = fp.readlines()
    attributes = [x for x in attributes]
    #print(attributes)
    
    csvreader = csv.reader(open("data/wine.csv"))
    for line in csvreader:
        float_numbers = [float(x) for x in line]
        X.append(float_numbers)
        #print(line)

    return np.array(X), attributes

def run_PCA(X, num_components):
    pca  = sklearn.decomposition.PCA(n_components=num_components)
    pca.fit(X)
    pca_array = pca.transform(X)
    
    #print(pca_array)
    
    return pca, pca_array
    
def normalize(X):
    '''
    각각의 feature에 대해,
    178개의 데이터에 나타나는 해당하는 feature의 값이 최소 0, 최대 1이 되도록
    선형적으로 데이터를 이동시킵니다.
    '''
    for i in range(X.shape[1]):
        X[:,i] = X[:,i] - np.min(X[:,i])
        X[:,i] = X[:,i] / np.max(X[:,i])

    return X

def visualize_2d_wine(X):
    '''X를 시각화하는 코드를 구현합니다.'''
    plt.scatter(X[:,0],X[:,1])
    plt.savefig("image.png")
    elice_utils.send_image("image.png")

if __name__ == '__main__':
    main()

 

 

 

728x90
Comments