10.000 boyutlu bir alanda 20 rastgele nokta alın. . Onları 10 çifte ("çiftler") ayırın ve veri kümesine her çiftin ("bir çocuk") ortalamasını ekleyin. Sonra elde edilen 30 noktada PCA yapın ve PC1'e PC2'yi çizin.
Dikkat çekici bir şey olur: her "aile" birbirine yakın noktalardan oluşan bir üçlü oluşturur. Tabii ki her çocuk orijinal 10.000 boyutlu alanda ebeveynlerinin her birine daha yakındır, böylece kişi PCA alanında da ebeveynlere yakın olmasını bekleyebilir. Bununla birlikte, PCA alanında, her ebeveyn çifti de, orijinal alanda sadece rastgele noktalar olsa da birbirine yakındır!
Çocuklar PCA projeksiyonunda ebeveynleri bir araya getirmeyi nasıl başarıyorlar?
Bunun, çocukların ebeveynlerden daha düşük normlara sahip olmasından bir şekilde etkilendiğinden endişe edilebilir. Bu önemli değil: eğer çocukları nerede ve ebeveyn puanları ise, ortalama olarak ebeveynlerle aynı normlara sahip olacaklardır. Ama yine de PCA alanında niteliksel olarak aynı fenomeni gözlemliyorum:
Bu soru bir oyuncak veri seti kullanıyor, ancak boyutların tek nükleotid polimorfizmleri (SNP) olduğu genom çapında bir ilişki çalışmasından (GWAS) gerçek dünyadaki veri setinde gözlemlediğim şeyle motive oluyor . Bu veri seti anne-baba-çocuk üçlüleri içeriyordu.
kod
%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')