<jupyter_start><jupyter_text>PCA with breast cancer diagnostic dataset 어떻게 2차원을 1차원으로 줄일 수 있을까?  가장 쉬운방법은 하나의 축을 선택하여, 점을 몰아넣는 방법이다.  이러한 방식을 사용하면 몇개의 점은 서로 겹치게 되는 문제점이 발생한다. 즉, 정보의 유실이 발생할 수 있다.   정보의 유실을 막으면서 차원을 줄이는 방법은 무엇일까?  바로 분산이 가장 넓은 지역을 찾는 것이다.   분산이 넓다는 말은 각 점들이 퍼져있는 정도를 지켜주고, 따라서 점들은 최대한 겹치지 않게 된다. 분산이 가장 넓은 지역(축)을 PC(Principal Component)라 칭하고,  수학적으로 PC를 구하는 방법은, 각 점들이 가지고 있는 feature들의 covariance matrix에 있는 eigen vector들이다.  (PC = eigen vector from covariance matrix) N차원에는 N개의 eigen vector가 존재하게 되는데 이 때, Eigen value가 높은 값을 찾아야한다.  Eigen value가 크면 분산이 크다는 것을 의미하기 때문이다. 결국 data feature들 간의 covariance matrix를 eigen decomposition 하여,  높은 eigen value를 따르는 eigen vector를 찾고, 그 PC(축)에 data를 project 하여 차원을 축소한다.<jupyter_code>from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
import pandas as pd

cancer = load_breast_cancer() # 유방암 진단 데이터
X = cancer.data
y = cancer.target
X_ = StandardScaler().fit_transform(X) # 평균이 0과 표준편차가 1이 되도록 변환

print(X_.shape, y.shape)
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
sy = pd.Series(cancer.target, dtype="category")
sy = sy.cat.rename_categories(cancer.target_names)
df['class'] = sy
df.tail()
import numpy as np

X_cov = np.cov(X_.T) # data feature들 간의 covariance matrix
X_eigval, X_eigvec = np.linalg.eig(X_cov) # eigen decomposition

# find two highest eigen value
def two(array):
    idx1 = np.argmax(array)
    tmp = array.copy()
    tmp[idx1] = 0
    idx2 = np.argmax(tmp)
    return (idx1, idx2)

idx = two(X_eigval)
print("정보보존율:", (X_eigval[idx[0]]+X_eigval[idx[1]])/sum(X_eigval)*100, "%") # PC1 & PC2

# 찾은 eigen value를 따르는 eigen vector를 모아서
PC_vec = []
PC_vec.append(X_eigvec.T[idx[0]])
PC_vec.append(X_eigvec.T[idx[1]])
PC_vec = np.array(PC_vec).T

# 해당 PC(축)에 data를 project 한다.
X_projected = X_.dot(PC_vec)
import matplotlib.pyplot as plt
%matplotlib inline

pc_y = np.c_[X_projected,y]
df = pd.DataFrame(pc_y,columns=['PC1','PC2','diagnosis'])

plt.scatter(x=df['PC1'],y=df['PC2'],c=df['diagnosis'])
print("노랑 양성, 보라 음성")<jupyter_output>노랑 양성, 보라 음성<jupyter_text>검증<jupyter_code>from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
X = cancer.data
y = cancer.target

from sklearn.preprocessing import StandardScaler
X_ = StandardScaler().fit_transform(X)

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pc = pca.fit_transform(X_)

import pandas as pd
import numpy as np
pc_y = np.c_[pc,y]
df = pd.DataFrame(pc_y,columns=['PC1','PC2','diagnosis'])

import matplotlib.pyplot as plt
plt.scatter(x=df['PC1'],y=df['PC2'],c=df['diagnosis'])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11760242792109256, 'fraction_numerical': 0.010622154779969651, 'mean_word_length': 5.1183294663573085, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '238146', 'license': 'MIT', 'n_tokens_mistral': 1358, 'n_tokens_neox': 1518, 'n_words': 292, 'path': 'PCA.ipynb', 'repo_name': 'TaehoLi/Intern-Study', 'size': '2636'}