प्रत्येक से समन्वयित iid के साथ 10,000-आयामी स्थान में 20 यादृच्छिक अंक लें । उन्हें 10 जोड़े ("जोड़े") में विभाजित करें और डेटासेट में प्रत्येक जोड़ी ("एक बच्चा") का औसत जोड़ें। फिर परिणामी 30 बिंदुओं पर पीसीए करें और पीसी 1 बनाम पीसी 2 प्लॉट करें।
एक उल्लेखनीय बात होती है: प्रत्येक "परिवार" उन बिंदुओं का एक समूह बनाता है जो सभी एक साथ पास होते हैं। बेशक हर बच्चा मूल 10,000-आयामी स्थान में अपने माता-पिता में से प्रत्येक के करीब है, इसलिए कोई यह उम्मीद कर सकता है कि वह पीसीए अंतरिक्ष में भी माता-पिता के करीब हो। हालांकि, पीसीए स्पेस में माता-पिता की प्रत्येक जोड़ी एक साथ करीब है, भले ही मूल स्थान में वे सिर्फ यादृच्छिक बिंदु हैं!
पीसीए प्रोजेक्शन में बच्चे माता-पिता को एक साथ खींचने का प्रबंधन कैसे करते हैं?
किसी को चिंता हो सकती है कि यह किसी तरह से इस तथ्य से प्रभावित है कि बच्चों के पास माता-पिता की तुलना में कम आदर्श है। इससे कोई फर्क नहीं पड़ता: अगर मैं बच्चों को पैदा करता हूं कहाँ पे तथा माता-पिता के बिंदु हैं, तो उनके पास माता-पिता के समान आदर्श होंगे। लेकिन मैं अभी भी पीसीए अंतरिक्ष में गुणात्मक रूप से एक ही घटना का निरीक्षण करता हूं:
यह सवाल एक खिलौना डेटा सेट का उपयोग कर रहा है, लेकिन यह एक जीनोम-वाइड एसोसिएशन स्टडी (जीडब्ल्यूएएस) से निर्धारित वास्तविक दुनिया के आंकड़ों में जो मैंने देखा है, उससे प्रेरित है, जहां आयाम एकल-न्यूक्लियोटाइड पॉलीमॉर्फिज्म (एसएनपी) हैं। इस डेटा सेट में माता-पिता-बच्चे की तिकड़ी थी।
कोड
%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')