在 10,000 维空间中取 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')