取20个随机点与每个一万维空间从坐标IID 。将它们分成10对(“对”),并将每对的平均值(“子”)添加到数据集中。然后对所得的30点进行PCA并绘制PC1与PC2的关系图。
发生了一件了不起的事情:每个“家庭”形成一个紧密相连的三元组。当然,在最初的10,000维空间中,每个孩子都更接近其父母中的每个,因此可以期望在PCA空间中每个孩子也都离父母更近。但是,在PCA空间中,每对父母也彼此靠近,即使在原始空间中,它们只是随机点!
在PCA预测中,孩子如何设法将父母团结在一起?
人们可能会担心,这在某种程度上受到以下事实的影响:孩子的规范低于父母。这似乎无关紧要:如果我将子代生成为,其中和是父母点,那么它们平均具有与父母相同的范数。但是我仍然在PCA领域从质上观察到相同的现象:
这个问题使用的是玩具数据集,但其动机是我在一个全基因组关联研究(GWAS)的真实数据集中所观察到的,其中维度是单核苷酸多态性(SNP)。该数据集包含母婴三重奏。
码
%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')