에서 각 좌표 iid로 10,000 차원 공간에서 20 개의 임의의 점을 취합니다 . 10 쌍 ( "커플")으로 나누고 각 쌍의 평균 ( "자식")을 데이터 세트에 추가하십시오. 그런 다음 결과 30 점에서 PCA를 수행하고 PC1 대 PC2를 플로팅합니다.
놀라운 일이 일어납니다. 각 "가족"은 서로 가까이있는 삼중점을 형성합니다. 물론 모든 어린이는 원래 10,000 차원 공간에서 각 부모에게 더 가까이 있으므로 PCA 공간에서도 부모와 더 가까이있을 것으로 기대할 수 있습니다. 그러나 PCA 공간에서 각 부모 쌍은 서로 가깝습니다. 비록 원래 공간에서는 무작위 포인트 일뿐입니다!
PCA 프로젝션에서 아이들은 어떻게 부모를 하나로 묶을 수 있습니까?
아이들이 부모보다 규범이 낮다는 사실에 영향을받는다고 걱정할 수도 있습니다. 중요하지 않은 것 같습니다 . 와 가 부모 지점 인 로 자식을 생성하면 평균적으로 부모와 같은 표준을 갖게됩니다. 그러나 나는 여전히 PCA 공간에서 질적으로 동일한 현상을 관찰합니다.
이 질문은 장난감 데이터 세트를 사용하고 있지만 치수가 단일 뉴클레오티드 다형성 (SNP) 인 게놈 넓은 협회 연구 (GWAS) 의 실제 데이터 세트에서 관찰 한 것에 동기를 부여 합니다 . 이 데이터 세트에는 어머니-아동-트리오가 포함되어 있습니다.
암호
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
def generate_families(n = 10, p = 10000, divide_by = 2):
X1 = np.random.randn(n,p) # mothers
X2 = np.random.randn(n,p) # fathers
X3 = (X1+X2)/divide_by # children
X = []
for i in range(X1.shape[0]):
X.extend((X1[i], X2[i], X3[i]))
X = np.array(X)
X = X - np.mean(X, axis=0)
U,s,V = np.linalg.svd(X, full_matrices=False)
X = U @ np.diag(s)
return X
n = 10
plt.figure(figsize=(4,4))
X = generate_families(n, divide_by = 2)
for i in range(n):
plt.scatter(X[i*3:(i+1)*3,0], X[i*3:(i+1)*3,1])
plt.tight_layout()
plt.savefig('families1.png')
plt.figure(figsize=(4,4))
X = generate_families(n, divide_by = np.sqrt(2))
for i in range(n):
plt.scatter(X[i*3:(i+1)*3,0], X[i*3:(i+1)*3,1])
plt.tight_layout()
plt.savefig('families2.png')