ใช้เวลาประมาณ 20 จุดสุ่มในพื้นที่ 10,000 มิติที่มีพิกัดแต่ละ IID จาก(0,1) แยกออกเป็น 10 คู่ ("คู่รัก") และเพิ่มค่าเฉลี่ยของแต่ละคู่ ("เด็ก") ไปยังชุดข้อมูล จากนั้นทำ PCA บนผลลัพธ์ 30 คะแนนและลงจุด PC1 กับ PC2
สิ่งที่น่าทึ่งเกิดขึ้น: "ครอบครัว" แต่ละแห่งก่อให้เกิดจุดที่อยู่ใกล้กัน แน่นอนว่าเด็กทุกคนอยู่ใกล้กับผู้ปกครองแต่ละคนในพื้นที่ 10,000 มิติดั้งเดิมดังนั้นใคร ๆ ก็คาดหวังว่ามันจะอยู่ใกล้กับพ่อแม่ในพื้นที่ PCA อย่างไรก็ตามในพื้นที่ PCA ผู้ปกครองแต่ละคู่อยู่ใกล้กันเช่นกันแม้ว่าในพื้นที่ดั้งเดิมพวกเขาเป็นเพียงจุดสุ่ม!
เด็ก ๆ จัดการดึงผู้ปกครองมารวมกันในการฉาย PCA ได้อย่างไร
บางคนอาจกังวลว่าสิ่งนี้ได้รับอิทธิพลจากความจริงที่ว่าเด็กมีบรรทัดฐานต่ำกว่าพ่อแม่ สิ่งนี้ดูเหมือนจะไม่สำคัญ: ถ้าฉันสร้างเด็กเป็นโดยที่และเป็นจุดของผู้ปกครองพวกเขาจะมีบรรทัดฐานเดียวกันโดยเฉลี่ยกับผู้ปกครอง แต่ฉันยังคงสังเกตเห็นปรากฏการณ์เชิงคุณภาพในพื้นที่ PCA:
คำถามนี้ใช้ชุดข้อมูลของเล่น แต่ได้แรงบันดาลใจจากสิ่งที่ฉันสังเกตเห็นในชุดข้อมูลจริงจากการศึกษาความสัมพันธ์จีโนมกว้าง (GWAS) ที่มีมิติเป็นแบบหลายนิวคลีโอไทด์ polymorphisms (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')