भारित प्रमुख घटक विश्लेषण


17

कुछ खोज के बाद, मुझे मुख्य घटकों के विश्लेषण में अवलोकन भार / माप त्रुटियों के समावेश पर बहुत कम लगता है। वेटिंग (उदाहरण के लिए, यहाँ ) को शामिल करने के लिए मुझे क्या करना चाहिए । मेरा प्रश्न यह है कि यह दृष्टिकोण क्यों आवश्यक है? हम भारित सहसंयोजक मैट्रिक्स के आइजनवेक्टर का उपयोग क्यों नहीं कर सकते हैं?


1
नीचे दिए गए उत्तर के अलावा, कृपया थ्रेड आँकड़े देखें ।stackexchange.com / q / 141754 / 3277 , जहां भारित पीसीए (स्तंभों और / या पंक्तियों पर भार के साथ) को मुख्य रूप से भारित (सामान्यीकृत) svd / के बराबर बताया गया है biplot।
ttnphns

जवाबों:


33

यह इस बात पर निर्भर करता है कि वास्तव में आपका वजन किस पर लागू होता है।

रो वजन

स्तंभों में चर के साथ X डेटा मैट्रिक्स होने दें और पंक्तियों में n अवलोकन xi । प्रत्येक अवलोकन एक संबद्ध वजन है, तो wi , तो यह वास्तव में पीसीए में इन वजन शामिल करने के लिए सरल है।

सबसे पहले, किसी को भारित माध्य μ = 1 की गणना करने की आवश्यकता हैμ=1wiwixiऔर व्यवस्था करने के लिए डेटा से घटा देंकेंद्रयह।

फिर हम भारित सहसंयोजक मैट्रिक्स , जहां वजन का विकर्ण मैट्रिक्स है, और इसका विश्लेषण करने के लिए मानक पीसीए लागू करें।1wiXWXW=diag(wi)

सेल वजन

तमूज एट अल।, 2013 के पेपर , जो आपको मिला, एक अधिक जटिल मामले पर विचार करता है जब डेटा मैट्रिक्स के प्रत्येक तत्व पर विभिन्न भार लागू होते हैं । तब वास्तव में कोई विश्लेषणात्मक समाधान नहीं है और किसी को एक पुनरावृत्त विधि का उपयोग करना है। ध्यान दें, जैसा कि लेखकों द्वारा स्वीकार किया जाता है, उन्होंने पहिया को फिर से स्थापित किया, क्योंकि इस तरह के सामान्य वजन को निश्चित रूप से पहले माना गया है, उदाहरण के लिए गेब्रियल और ज़मीर, 1979 में, लोअर स्क्वॉयर द्वारा मेट्रिसेस का कम से कम वजन के किसी भी विकल्प के साथ रैंक । इस पर भी यहां चर्चा हुईwij

एक अतिरिक्त टिप्पणी के रूप में: यदि भार चर और अवलोकनों दोनों के साथ बदलता रहता है, लेकिन सममित है, तो , फिर विश्लेषणात्मक समाधान संभव है, फिर देखें कोरेन और कार्मेल, 2004, Robust लीनियर डायमेंशनली रिडक्शनwijwij=wji


स्पष्टीकरण के लिए धन्यवाद। क्या आप बता सकते हैं कि ऑफ-डायग्निकल वेट के साथ कोई विश्लेषणात्मक समाधान क्यों संभव नहीं है? मुझे यह वही है जो मुझे तमुज़ एट अल 2013 और गेब्रियल और ज़मीर 1979 से याद आ रहा है।
नं

@ गन: मुझे इस तरह के सबूत के बारे में पता नहीं है, और इसके अलावा मुझे आश्चर्य नहीं होगा अगर यह पता नहीं था। आम तौर पर यह साबित करना काफी मुश्किल है कि कुछ संभव नहीं है , विशेष रूप से यह कि कुछ विश्लेषणात्मक रूप से संभव नहीं है। एंगल ट्रिसफेक्शन की असंभवता ने 2000 से अधिक वर्षों तक इसके प्रमाण की प्रतीक्षा की ... (प्रतियोगिता)
अमीबा का कहना है कि मोनिका

3
@noname: (। शेष भाग) क्या आप पूछ रहे हैं पता चलता है कि कम से कम करने की समस्या है के साथ करने के लिए सम्मान एक कम रैंक करने के लिए विवश । एक eigenvector समस्या के लिए reducible नहीं है। मुझे डर है कि आपको इसके लिए एक और मंच की आवश्यकता होगी (हो सकता है कि मैथोवेटफ्लो?)। लेकिन ध्यान दें कि eigenvectors ढूंढना भी वास्तव में एक विश्लेषणात्मक समाधान नहीं है : यह सिर्फ इतना है कि पुनरावृत्तियों को आमतौर पर एक मानक पुस्तकालय फ़ंक्शन द्वारा चुपचाप प्रदर्शन किया जाता है। i,jwij(XijAij)2Aq
अमीबा

2
+1। उत्तर के पहले खंड को भारित (सामान्यीकृत) बिप्लॉट के संदर्भ में भी वर्णित किया जा सकता है । यह ध्यान में रखते हुए कि कैसे पीसीए एक "बाइपोलॉट का विशिष्ट मामला है (पंक्तिबद्ध उत्तर में भी चिंतित)।
ttnphns 10

@ttnphns: आपकी टिप्पणी के बाद और एक अन्य धागे को डुप्लिकेट के रूप में बंद किए जाने के बाद, मैंने अपना उत्तर पढ़ा और पंक्ति भार से निपटने के तरीके की व्याख्या का विस्तार किया। मुझे लगता है कि पहले यह पूरी तरह से सही नहीं था या कम से कम पूरा नहीं था क्योंकि मैंने एक भारित मतलब के साथ केंद्र का उल्लेख नहीं किया था। मुझे आशा है कि अब यह अधिक समझ में आता है!
अमीबा का कहना है कि मोनिका

5

पंक्ति भार के बारे में जानकारी के लिए बहुत बहुत अमीबा धन्यवाद। मुझे पता है कि यह स्टैकओवरफ्लो नहीं है, लेकिन मुझे स्पष्टीकरण के साथ पंक्ति-भारित पीसीए के कार्यान्वयन को खोजने के लिए कुछ कठिनाइयाँ हुईं और चूंकि यह पहले परिणाम में से एक है जब भारित पीसीए के लिए googling, मैंने सोचा कि इसका समाधान संलग्न करना अच्छा होगा , शायद यह उसी स्थिति में दूसरों की मदद कर सकता है। इस Python2 कोड स्निपेट में, एक पीसीबी एक आरबीएफ कर्नेल के साथ भारित होता है जैसा कि ऊपर वर्णित एक 2D डेटासेट के स्पर्शरेखा की गणना करने के लिए उपयोग किया जाता है। कुछ प्रतिक्रिया सुनकर मुझे बहुत खुशी होगी!

def weighted_pca_regression(x_vec, y_vec, weights):
    """
    Given three real-valued vectors of same length, corresponding to the coordinates
    and weight of a 2-dimensional dataset, this function outputs the angle in radians
    of the line that aligns with the (weighted) average and main linear component of
    the data. For that, first a weighted mean and covariance matrix are computed.
    Then u,e,v=svd(cov) is performed, and u * f(x)=0 is solved.
    """
    input_mat = np.stack([x_vec, y_vec])
    weights_sum = weights.sum()
    # Subtract (weighted) mean and compute (weighted) covariance matrix:
    mean_x, mean_y =  weights.dot(x_vec)/weights_sum, weights.dot(y_vec)/weights_sum
    centered_x, centered_y = x_vec-mean_x, y_vec-mean_y
    matrix_centered = np.stack([centered_x, centered_y])
    weighted_cov = matrix_centered.dot(np.diag(weights).dot(matrix_centered.T)) / weights_sum
    # We know that v rotates the data's main component onto the y=0 axis, and
    # that u rotates it back. Solving u.dot([x,0])=[x*u[0,0], x*u[1,0]] gives
    # f(x)=(u[1,0]/u[0,0])x as the reconstructed function.
    u,e,v = np.linalg.svd(weighted_cov)
    return np.arctan2(u[1,0], u[0,0]) # arctan more stable than dividing


# USAGE EXAMPLE:
# Define the kernel and make an ellipse to perform regression on:
rbf = lambda vec, stddev: np.exp(-0.5*np.power(vec/stddev, 2))
x_span = np.linspace(0, 2*np.pi, 31)+0.1
data_x = np.cos(x_span)[:-1]*20-1000
data_y = np.sin(x_span)[:-1]*10+5000
data_xy = np.stack([data_x, data_y])
stddev = 1 # a stddev of 1 in this context is highly local
for center in data_xy.T:
    # weight the  points based on their euclidean distance to the current center
    euclidean_distances = np.linalg.norm(data_xy.T-center, axis=1)
    weights = rbf(euclidean_distances, stddev)
    # get the angle for the regression in radians
    p_grad = weighted_pca_regression(data_x, data_y, weights)
    # plot for illustration purposes
    line_x = np.linspace(-5,5,10)
    line_y = np.tan(p_grad)*line_x
    plt.plot(line_x+center[0], line_y+center[1], c="r")
    plt.scatter(*data_xy)
    plt.show()

और एक नमूना उत्पादन (यह हर डॉट के लिए भी यही करता है): यहाँ छवि विवरण दर्ज करें

चीयर्स,
एंड्रेस

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