<jupyter_start><jupyter_text>고유분해   - $A = V\Lambda$$V^T$       - 정방행렬       - $Au = \lambda{u}$----- 정방행렬         - $A\in{R}^{N\times{M}}$       - $\lambda$는 복소수   - $\lambda$는 $N$개   - $AV = V\Lambda$   - $tr A = \Sigma_{i=1}^{N}\lambda_i$   - $det A = \Pi_{i=1}^{N}\lambda_i$ ---- 대칭행렬    - $A = A^T$    - $\lambda$는 실수    - $V^T = V^{-1}$    - $A = V\Lambda{V}^T$    - $A = \Sigma_{i=1}^N\lambda_iV_iV_i^T$    ---- 분산행렬    - $A = X^TX$    - 모든 고유값이 0 또는 양수 $\lambda_i \geq 0$---- 양의 정부호 (PD)   - $X$ 가 Full RANK   - 역행렬 존재   - 모든 고유값이 양수 $\lambda_i \geq 0$ ---- 특이분해       - $A = U\Sigma$$V^T$        - from numpy.linalg import svd     - A = np.array([[3,-1],[1,3],[1,1]])     - U, S, VT = svd(A)     - svd(A, full_matrices=False) $\rightarrow$ 축소형     - $Au = \sigma{u}$     ---- RANK-K 근사문제   - $ arg min \|A-AWW^T\|$  PCA (주성분 분석) - 차원이 높은 데이터    $\rightarrow$ 데이터를 이루는 벡터의 차원이 많다라는 뜻  ---- scikit-learn 의 PCA 기능  - 입력인수 : n_components : 정수  - method : fit_transform() : 특징행렬을 낮은 차원의 근사행렬로 변환           inverse_transform() : 변환된 근사행렬을 원래의 차원으로 복귀             - 속성 : mean_ : 평균벡터        components_ : 주성분 벡터<jupyter_code># load iris data

from sklearn.datasets import load_iris
import warnings
warnings.filterwarnings("ignore")
iris = load_iris()
N = 10  # 앞의 10송이만 선택
X = iris.data[:N, :2]  # 꽃받침 길이와 꽃받침 폭만 선택
X
# PCA

from sklearn.decomposition import PCA
pca1 = PCA(n_components=1)
X_low = pca1.fit_transform(X)
# 잠재변수
# 원점을 옯기면서 음수가 나오게 되는 것

X_low
X2 = pca1.inverse_transform(X_low)
# 저차원으로 투영

X2
plt.figure(figsize=(7, 7))
ax = sns.scatterplot(0, 1, data=pd.DataFrame(X), s=100, color=".2", marker="s")
for i in range(N):
    d = 0.03 if X[i, 1] > X2[i, 1] else -0.04
    ax.text(X[i, 0] - 0.065, X[i, 1] + d, "표본 {}".format(i + 1))
    plt.plot([X[i, 0], X2[i, 0]], [X[i, 1], X2[i, 1]], "k--")
plt.plot(X2[:, 0], X2[:, 1], "o-", markersize=10)
plt.plot(X[:, 0].mean(), X[:, 1].mean(), markersize=10, marker="D")
plt.axvline(X[:, 0].mean(), c='r')
plt.axhline(X[:, 1].mean(), c='r')
plt.grid(False)
plt.xlabel("꽃받침 길이")
plt.ylabel("꽃받침 폭")
plt.title("Iris 데이터의 1차원 차원축소")
plt.axis("equal")
plt.show()
# 데이터가 있는 중심 위치

pca1.mean_
# 파란색 기저벡터의 방향을 나타내는 단위 벡터

pca1.components_
X0 = X - X.mean(axis=0)
U, S, VT = np.linalg.svd(X0)
VT
VT[:, 0]<jupyter_output><empty_output><jupyter_text>분산행렬의 고유벡터랑 일치<jupyter_code>XCOV = X0.T @ X0
W, V = np.linalg.eig(XCOV)
W
V
V[:, np.argmax(W)]<jupyter_output><empty_output><jupyter_text>8번째 꽃의 꽃받침 길이와 꽃받침 폭은 다음과 같다.<jupyter_code>X[7, :]
# 주성분

X_low[7]
X2[7, :]<jupyter_output><empty_output><jupyter_text>---- 3.5.1 연습문제 - 붓꽃 데이터 중 앞에서 50개의 데이터(setosa 중)에 대해 다음 문제를 풀어라. 1) 꽃 잎의 길이와 꽃잎의 폭을 이용하여 1차원 PCA를 수행하라. 꽃의 크기는 꽃받침 길이와 꽃받침 폭의 어떤 선형조합으로 나타나는가.<jupyter_code>N = 10
X = iris.data[:N, :2]
X
pca3 = PCA(n_components=1)
X_low = pca3.fit_transform(X)
X_low
X2 = pca3.inverse_transform(X_low)
X2<jupyter_output><empty_output><jupyter_text>2) 꽃 받침 길이와 폭, 꽃잎 길이와 폭, 이 4가지 변수를 모두 사용하여 1차원 PCA를 수행하라. 꽃의 크기는 관측 데이터의 어떤 선형조합으로 나타나는가.<jupyter_code>N = 10
X = iris.data[:N, :]
X
pca2 = PCA(n_components=1)
X_low = pca2.fit_transform(X)
X_low
X2 = pca2.inverse_transform(X_low)
X2<jupyter_output><empty_output><jupyter_text>PCA를 왜 배워야하나? - 데이터의 양이 종류가 많은 것보다 좋다.  - 선형 종속에 가까워지면 역행렬이 거의 나오지 않는다.   $\rightarrow$ 데이터를 버리는 작업을 해야한다. (특징선택:feature selection)   * 이럴 때 PCA를 활용!!     $\rightarrow$ 데이터를 압축해서 저차원의 데이터로 만들어 줌.    -----  이미지 PCA<jupyter_code>from sklearn.datasets import fetch_olivetti_faces
faces_all = fetch_olivetti_faces()
K = 15  # 20번 인물의 사진만 선택
faces = faces_all.images[faces_all.target == K]
N = 2
M = 5
fig = plt.figure(figsize=(10, 5))
plt.subplots_adjust(top=1, bottom=0, hspace=0, wspace=0.05)
for i in range(N):
    for j in range(M):
        k = i * M + j
        ax = fig.add_subplot(N, M, k+1)
        ax.imshow(faces[k], cmap=plt.cm.bone)
        ax.grid(False)
        ax.xaxis.set_ticks([])
        ax.yaxis.set_ticks([])
plt.suptitle("olivetti_face image")
plt.tight_layout()
plt.show()
faces.shape
64*64
pca4 = PCA(n_components=2)
X3 = faces_all.data[faces_all.target == K]
W3 = pca4.fit_transform(X3)
X32 = pca4.inverse_transform(W3)
X32
# eigenface

faces_all = fetch_olivetti_faces()
K = 8
faces = faces_all.images[faces_all.target == K]
N = 2
M = 5
fig = plt.figure(figsize=(10, 5))
plt.subplots_adjust(top=1, bottom=0, hspace=0, wspace=0.05)
for i in range(N):
    for j in range(M):
        k = i * M + j
        ax = fig.add_subplot(N, M, k+1)
        ax.imshow(faces[k], cmap=plt.cm.bone)
        ax.grid(False)
        ax.xaxis.set_ticks([])
        ax.yaxis.set_ticks([])
plt.suptitle("olivetti_face image")
plt.tight_layout()
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17890204520990313, 'fraction_numerical': 0.03272335844994618, 'mean_word_length': 3.1593554162936437, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 26, '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': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '507317', 'license': 'MIT', 'n_tokens_mistral': 2730, 'n_tokens_neox': 2983, 'n_words': 501, 'path': 'MATH/05_PCA.ipynb', 'repo_name': 'CATERINA-SEUL/Data-Science-School', 'size': '4645'}