Ambil 20 titik acak dalam ruang 10.000 dimensi dengan setiap koordinat iid dari . Bagi mereka menjadi 10 pasangan ("pasangan") dan tambahkan rata-rata setiap pasangan ("anak") ke dataset. Kemudian lakukan PCA pada 30 poin yang dihasilkan dan plot PC1 vs PC2.
Suatu hal yang luar biasa terjadi: setiap "keluarga" membentuk triplet poin yang semuanya berdekatan. Tentu saja setiap anak lebih dekat dengan masing-masing orang tuanya di ruang 10.000 dimensi asli sehingga orang bisa berharap untuk dekat dengan orang tua juga di ruang PCA. Namun, dalam ruang PCA setiap pasangan orang tua juga berdekatan, meskipun di ruang asli mereka hanya titik acak!
Bagaimana anak-anak berhasil mengumpulkan orang tua bersama dalam proyeksi PCA?
Orang mungkin khawatir bahwa ini entah bagaimana dipengaruhi oleh fakta bahwa anak-anak memiliki norma yang lebih rendah daripada orang tua. Ini tampaknya tidak masalah: jika saya menghasilkan anak-anak sebagai mana dan adalah titik orangtua, maka mereka akan memiliki rata-rata norma yang sama dengan orang tua. Tapi saya masih mengamati secara kualitatif fenomena yang sama di ruang PCA:
Pertanyaan ini menggunakan set data mainan tetapi dimotivasi oleh apa yang saya amati dalam set data dunia nyata dari studi asosiasi genome-wide (GWAS) di mana dimensi adalah single-nucleotide polymorphisms (SNP). Kumpulan data ini berisi trio ibu-ayah-anak.
Kode
%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')