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')
Jawaban:
Selama diskusi dengan @ttnphns dalam komentar di atas, saya menyadari bahwa fenomena yang sama dapat diamati dengan kurang dari 10 keluarga. Tiga keluarga (
n=3
dalam cuplikan kode saya) muncul secara kasar di sudut-sudut segitiga sama sisi. Bahkan, cukup untuk hanya mempertimbangkan dua keluarga (n=2
): mereka akhirnya dipisahkan sepanjang PC1, dengan masing-masing keluarga diproyeksikan secara kasar ke satu titik.Kasus dua keluarga dapat divisualisasikan secara langsung. Empat titik asli dalam ruang 10.000 dimensi hampir ortogonal dan berada dalam ruang bagian 4 dimensi. Jadi mereka membentuk 4-simpleks. Setelah pemusatan, mereka akan membentuk tetrahedron biasa yang merupakan bentuk 3D. Berikut ini tampilannya:
Sebelum anak-anak ditambahkan, PC1 dapat menunjuk ke mana saja; tidak ada arah yang disukai. Namun, setelah dua anak diposisikan di tengah-tengah dari dua sisi yang berlawanan, PC1 akan menembus mereka! Susunan enam poin ini dijelaskan oleh @ttnphns sebagai "dumbbell":
Perhatikan bahwa tepi berlawanan dari tetrahedron reguler saling ortogonal dan juga ortogonal dengan garis yang menghubungkan pusat-pusatnya. Ini berarti bahwa setiap keluarga akan diproyeksikan ke satu titik tunggal pada PC1.
Mungkin bahkan kurang intuitif, jika kedua anak diskalakan oleh faktor untuk memberi mereka norma yang sama seperti yang dimiliki orang tua, maka mereka akan "menonjol" dari tetrahedron, menghasilkan proyeksi PC1 dengan kedua orang tua runtuh bersama. dan anak terpisah lebih jauh. Hal ini dapat dilihat pada gambar kedua dalam pertanyaan saya: setiap keluarga memiliki orang tuanya yang benar-benar dekat dengan pesawat PC1 / PC2 (BAHKAN MEREKA TIDAK MEREKA TERKAIT!), Dan anak mereka agak jauh terpisah.2–√
sumber