पीसीए के साथ आर में आयामी कमी कैसे करें


30

मेरे पास एक बड़ा डेटासेट है और मैं एक आयामी कमी करना चाहता हूं।

अब हर जगह मैंने पढ़ा है कि मैं इसके लिए पीसीए का उपयोग कर सकता हूं। हालाँकि, मुझे अभी भी पीसीए की गणना / प्रदर्शन करने के बाद क्या करना है, यह प्रतीत नहीं होता है। आर में यह आसानी से कमांड के साथ किया जाता है princomp

लेकिन पीसीए की गणना के बाद क्या करना है? अगर मैंने फैसला किया कि मैं पहले प्रमुख घटकों का उपयोग करना चाहता हूं , तो मैं अपने डेटासेट को बिल्कुल कैसे कम करूं?100


यह प्रश्न बहुत स्पष्ट नहीं है (100 पीसी कम आयामीता के आपके डेटासेट हैं ), लेकिन विशेष रूप से मूल चर (पुन: स्वीकार किए गए उत्तर का विषय) के पुनर्निर्माण के बारे में यह भी देखें: पीसीए को उल्टा कैसे करें और मूल चर को कई प्रमुख घटकों से फिर से संगठित करें?
अमीबा का कहना है कि मोनिका

जवाबों:


35

मुझे विश्वास है कि आप अपने प्रश्न पर क्या प्राप्त कर रहे हैं, मुख्य घटक (पीसी) की एक छोटी संख्या का उपयोग करके डेटा ट्रंकेशन की चिंता करता है। इस तरह के संचालन के लिए, मुझे लगता है कि फ़ंक्शन prcompअधिक उदाहरण में है कि पुनर्निर्माण में उपयोग किए गए मैट्रिक्स गुणन की कल्पना करना आसान है।

सबसे पहले, एक सिंथेटिक डेटासेट दें, Xtआप पीसीए का प्रदर्शन करते हैं (आमतौर पर आप एक कोवेरियन मैट्रिक्स से संबंधित पीसी का वर्णन करने के लिए नमूनों को केंद्र में रखते हैं:

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

परिणामों में या prcomp, आप पीसी के ( res$x), ईजेनवेल्यूज़ ( res$sdev) प्रत्येक पीसी के परिमाण पर जानकारी देते हुए, और लोडिंग ( res$rotation) देख सकते हैं।

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

आइगेनवैल्यूज़ को चुकता करके, आपको प्रत्येक पीसी द्वारा समझाया गया विचरण मिलता है:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

अंत में, आप केवल प्रमुख (महत्वपूर्ण) पीसी का उपयोग करके अपने डेटा का एक छोटा संस्करण बना सकते हैं:

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

आप देख सकते हैं कि परिणाम थोड़ा चिकना डेटा मैट्रिक्स है, जिसमें छोटे पैमाने पर फीचर्स फ़िल्टर किए गए हैं:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

यहां छवि विवरण दर्ज करें

और यहाँ एक बहुत ही बुनियादी तरीका है जिसे आप prcomp फ़ंक्शन के बाहर कर सकते हैं:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

अब, यह तय करना कि कौन से पीसी को बनाए रखना एक अलग सवाल है - एक जिसे मैं कुछ समय पहले दिलचस्पी ले रहा था । उम्मीद है की वो मदद करदे।


2
मार्क, आपको केंद्र और पैमाने को स्पष्ट रूप से रिकॉर्ड करने की आवश्यकता नहीं है, prcompयह आपके लिए है। पर एक नज़र डालें res$centerऔर res$scale। IMHO यह इनका उपयोग करने के लिए कम त्रुटि वाला है (स्पष्ट कॉल scaleऔर कॉल के बीच या बीच में / स्केलिंग या नहीं के बारे में कोई आकस्मिक अंतर prcomp)।
cbeleites मोनिका

1
इस उत्तर को विस्तार की आवश्यकता है क्योंकि यह ओपी के प्रश्नों के उत्तर नहीं देता है what to do after calculating the PCAया how do I reduce my dataset exactly? यह देखते हुए कि ओपी ने अपने नमूने पर पीसीए आयोजित किया है, उनका सवाल यह है कि इसके साथ क्या करना है, और वास्तव में इस उपसमूह के साथ क्या होता है; पीसीए कैसे नहीं। हम E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsस्कोर प्राप्त करने के लिए एक और तरीका प्राप्त करने के लिए ऐसा करने का प्रस्ताव कर सकते हैं (जो कि वास्तव में प्रिंट करता है stats:::princomp.default)।
us --r11852 का कहना है कि मोनिक

1
@ user11852 - यह प्रश्न विशेष रूप से डेटा सेट में कमी के संदर्भ में आता है (यानी मेरे द्वारा प्रदर्शित ट्रंकेशन)। मैं उसे यह तय करने के लिए छोड़ दूंगा कि वह वही था जो वह ढूंढ रहा था।
बॉक्स में

1
@Marc, प्रतिक्रिया के लिए धन्यवाद। मुझे लगता है कि मुझे फिर से कदम बढ़ाने और सब कुछ फिर से पढ़ने की आवश्यकता हो सकती है, क्योंकि मैं इस बात पर अटका हुआ हूं कि ऊपर दिए गए उत्तर में से कोई भी आयामी कमी के साथ कैसे निपटता है। क्योंकि जैसा कि आप दिखाते हैं, मंद (trunc) = मंद (Xt)। इसका फायदा क्या हुआ, डिमनेशन कम नहीं हुआ।
B_Miner

2
@B_Miner - बस ध्यान रखें कि ट्रंकेशन का उपयोग डेटा में मुख्य पैटर्न पर ध्यान केंद्रित करने और छोटे पैमाने के पैटर्न और शोर को फ़िल्टर करने के लिए किया जाता है। छंटा हुआ डेटा इसके आयामों के संदर्भ में छोटा नहीं है, लेकिन "क्लीनर" है। हालांकि, ट्रंकेशन डेटा की मात्रा को कम करता है जिसमें पूरे मैट्रिक्स को बस कुछ वैक्टर के साथ फिर से संगठित किया जा सकता है। एक अच्छा उदाहरण छवि संपीड़न के लिए पीसीए के उपयोग में है, जहां पीसी की एक छोटी संख्या का उपयोग छवि को फिर से संगठित करने के लिए किया जा सकता है। वैक्टर के इस छोटे उपसमुच्चय में कम मेमोरी लगती है, लेकिन पुनर्निर्माण से छोटे पैमाने पर विस्तार में कुछ नुकसान होगा।
बॉक्स में

3

ये अन्य उत्तर बहुत अच्छे और विस्तृत हैं, लेकिन मैं सोच रहा हूं कि क्या आप वास्तव में बहुत अधिक बुनियादी प्रश्न पूछ रहे हैं: आपके पीसी में एक बार क्या होता है?

प्रत्येक पीसी बस एक नया चर बन जाता है। कुल भिन्नता के 60% के लिए PC1 और 30% के लिए PC2 खाते कहते हैं। जैसा कि कुल भिन्नता का 90% है, आप बस इन दो नए चर (पीसी) को अपने मूल चर के सरलीकृत संस्करण के रूप में ले सकते हैं। इसका मतलब है कि उन्हें मॉडल में फिट करना, अगर वह आपकी रुचि है। जब आपके परिणामों की व्याख्या करने का समय आता है, तो आप ऐसा करते हैं मूल चर के संदर्भ में जो प्रत्येक पीसी के साथ संबंधित होते हैं।

क्षमा करें, यदि मैंने प्रश्न के दायरे को कम करके आंका है!


2

मेरा मानना ​​है कि पीसीए क्या कर रहा है, इस बारे में आपका मूल प्रश्न थोड़ा अनिश्चित है। प्रधान घटक विश्लेषण आपको अपने नमूने में भिन्नता के प्रमुख मोड की पहचान करने की अनुमति देता है। उन तरीकों को आपके नमूना के सहसंयोजक मैट्रिक्स ("लोडिंग") के आइजेनवेक्टर के रूप में स्पष्ट रूप से गणना की जाती है। इसके बाद वे वैक्टर आपके नमूने के नए "कोऑर्डिनेट सिस्टम" के रूप में काम करते हैं क्योंकि आप अपने मूल नमूने को उस स्थान पर प्रोजेक्ट करते हैं जिसे वे परिभाषित करते हैं ("स्कोर")। -th eigenvector / भिन्नता / लोडिंग / प्रिंसिपल कंपोनेंट के मोड के साथ जुड़े भिन्नता का अनुपात जहाँ आपके नमूने की मूल है (λ मैंi pp=784λλiΣk=1pλkpp=784आपके मामले में)। [याद रखें क्योंकि आपका सहसंयोजक मैट्रिक्स गैर-नकारात्मक है निश्चित रूप से आपके पास कोई नकारात्मक eigenvalues ।] अब, परिभाषा के अनुसार eigenvectors एक दूसरे के लिए रूढ़िवादी हैं। इसका मतलब है कि उनके संबंधित अनुमान भी ओर्थोगोनल हैं और जहां मूल रूप से आपके पास चर का एक बड़ा संभवतः सहसंबद्ध नमूना था, अब आपके पास (उम्मीद है कि) छोटे रैखिक रूप से स्वतंत्र नमूना ("स्कोर") है। λ

पीसीए के साथ व्यावहारिक रूप से आप अपने मूल नमूने के लिए सरोगेट डेटा के रूप में पीसी ("स्कोर") के अनुमानों का उपयोग कर रहे हैं। आप अपने सभी विश्लेषण स्कोर पर करते हैं, और बाद में आप अपने मूल नमूने को पीसी का उपयोग करके पता लगाते हैं कि आपके मूल स्थान पर क्या हुआ (यह मूल रूप से प्रिंसिपल कंपोनेंट रिग्रेशन है )। स्पष्ट रूप से, यदि आप अपने eigenvectors ("लोडिंग") की व्याख्या करने में सक्षम हैं, तो आप और भी बेहतर स्थिति में हैं: आप यह वर्णन कर सकते हैं कि आपके लोडिंग द्वारा प्रस्तुत किए गए भिन्नता के मोड में क्या होता है, जो सीधे उस लोडिंग पर अनुमान लगाकर लोड हो रहा है और पुनर्निर्माण के बारे में बिल्कुल भी परवाह नहीं है। :)

सामान्य तौर पर आप "पीसीए की गणना के बाद" क्या करते हैं, यह आपके विश्लेषण के लक्ष्य पर निर्भर करता है। पीसीए आपको केवल आपके डेटा का एक रेखीय स्वतंत्र उप-नमूना देता है जो कि आरएसएस पुनर्निर्माण मानदंड के तहत इष्टतम है। आप इसे वर्गीकरण, या प्रतिगमन, या दोनों के लिए उपयोग कर सकते हैं, या जैसा कि मैंने उल्लेख किया है कि आप अपने नमूने में विभिन्न प्रकार के सार्थक ऑर्थोगोनल मोड को पहचानना चाह सकते हैं।

एक टिप्पणी : मुझे लगता है कि बनाए रखने के लिए घटकों की संख्या तय करने के लिए सबसे अच्छा अनुभवहीन तरीका है कि आप नमूना भिन्नता की कुछ सीमा पर अपने अनुमान को आधार बनाएं जो आप केवल कुछ मनमानी संख्या के बजाय अपने कम आयामीपन नमूने में बनाए रखना चाहते हैं। 3, 100, 200. जैसा कि user4959 ने समझाया है कि आप सूची के संबंधित क्षेत्र की जाँच करके $loadingsउत्पादित वस्तु सूची के क्षेत्र के अंतर्गत उत्पादित वस्तु सूची की जाँच कर सकते हैं princomp


1
जैसा कि आप प्रिंसिपल कंपोनेंट रिग्रेशन का उल्लेख करते हैं, आर में जो पैकेज pls द्वारा प्रदान किया जाता है। के रूप में बनाए रखने के लिए घटकों की संख्या के लिए, मैं नहीं पर% विचरण तय करने का कोई वास्तविक लाभ नहीं देखते हैं। घटकों के (शायद ऐसा इसलिए है क्योंकि मैं उन डेटा के साथ काम करता हूं जिनके पास बहुत अलग-अलग स्तर के शोर हैं। @ मार्क-इन-द-बॉक्स में उल्लेख है, पीसी के एक उचित संख्या का निर्धारण करने के लिए कई अलग-अलग दृष्टिकोण हैं, और रणनीति होगी) चाहिए) दोनों प्रकार के डेटा पर और डेटा विश्लेषण के प्रकार पर निर्भर करता है जिसका पालन करना है।
cbeleites

मैंने कहा भोला रास्ता; कोई डरावनी भूखंड, कोई औसत eigenvalue, कोई लॉग- eigenvalue आरेख, कोई आंशिक सहसंबंध परीक्षण नहीं। आपके मॉडल के लिए कोई संभाव्य ढांचा नहीं। क्योंकि यह वह नहीं है जो ओपी पूछता है। (मैंने plsपैकेज का उल्लेख नहीं किया है princomp {stats}) , सह के% का उपयोग करने का एक स्पष्ट लाभ है। एक एकल मनमानी संख्या पर विचरण: आप अपने पुनर्निर्माण की गुणवत्ता जानते हैं। अगर आप सिर्फ डिम करना चाहते हैं। आयामों में कमी ( < , आपकी मूल नमूना आयामीता होने के नाते) यह ठीक भी है लेकिन आप वास्तव में अपनी आयामीता में कमी का गुण नहीं जानते हैं। के डी डीKKDD
us --r11852 का कहना है कि मोनिक

1
हाँ, यह अनुभवहीन है। मैं इस बात से सहमत नहीं हूं कि समझाया गया विचरण का एक मनमाना% सेट करने से किसी अन्य मनमाने कट-ऑफ का आंतरिक लाभ मिलता है। लेकिन यह वैसे भी इस बारे में लड़ने के लायक नहीं है कि) ओपी ने कभी नहीं चुनने के बारे में सलाह मांगी। पीसी के रखने के लिए और बी) मुझे लगता है कि हम सहमत हैं कि पीसीए मॉडल का उचित निरीक्षण वैसे भी किया जाना चाहिए।
सेल्यबाइट

कोई बात नहीं; यह केवल एक टिप्पणी थी जो मैंने अपने उत्तर से पहले की थी। (मैं अपनी टिप्पणी पैराग्राफ आखिरी डालूंगा क्योंकि मुझे लगता है कि यह स्पष्ट करता है बजाय इसके कि मैं क्या कहना चाहता हूं)
us2r11852

0

PCA करने के बाद आप पहले दो घटकों और प्लॉट का चयन कर सकते हैं .. आप R में एक डरावनी साजिश का उपयोग करते हुए घटकों की भिन्नता देख सकते हैं। इसके अलावा लोडिंग = T के साथ सारांश फ़ंक्शन का उपयोग करके आप घटकों के साथ सुविधाओं की भिन्नता को समाप्त कर सकते हैं।

आप इस http://www.statmethods.net/advstats/factor.html और http://statmath.wu.ac.at/~hornik/QFS1/principal_component.ignign.pdf पर भी देख सकते हैं

यह सोचने की कोशिश करें कि आप क्या चाहते हैं। आप पीसीए विश्लेषण से बहुत सारी चीजों की व्याख्या कर सकते हैं।

सर्वश्रेष्ठ अभि

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.