การวิเคราะห์องค์ประกอบหลักถ่วงน้ำหนัก


17

หลังจากการค้นหาบางอย่างฉันพบข้อผิดพลาดเล็กน้อยเกี่ยวกับการรวมตัวกันของน้ำหนัก / การวัดในการวิเคราะห์องค์ประกอบหลัก สิ่งที่ฉันพบมักใช้วิธีวนซ้ำเพื่อรวมน้ำหนัก (เช่นที่นี่ ) คำถามของฉันคือเหตุใดจึงจำเป็นต้องใช้วิธีการนี้ ทำไมเราไม่สามารถใช้ eigenvector ของเมทริกซ์ความแปรปรวนร่วมแบบถ่วงน้ำหนักได้?


1
นอกเหนือจากคำตอบด้านล่างโปรดดู thread stats.stackexchange.com/q/141754/3277โดยที่ PCA ถ่วงน้ำหนัก (ที่มีน้ำหนักในคอลัมน์และ / หรือแถว) มีการอธิบายเป็นหลักเทียบเท่ากับ svd / generalized ถ่วงน้ำหนัก biplot
ttnphns

คำตอบ:


33

ขึ้นอยู่กับน้ำหนักที่คุณใช้

น้ำหนักแถว

ให้เป็นเมทริกซ์ข้อมูลที่มีตัวแปรในคอลัมน์และnสังเกตxฉันในแถว หากการสังเกตการณ์แต่ละครั้งมีน้ำหนักที่เกี่ยวข้องw ฉันก็จะต้องรวมน้ำหนักเหล่านี้ไว้ใน PCAXnxiwi

ก่อนอื่นต้องคำนวณหาค่าเฉลี่ยถ่วงน้ำหนักและลบได้จากข้อมูลในการสั่งซื้อเพื่อศูนย์มันμ=1wiwixi

จากนั้นเราคำนวณเมทริกซ์ความแปรปรวนร่วมถ่วงน้ำหนักโดยที่W=diag(wi)เป็นเมทริกซ์แนวทแยงน้ำหนักและใช้ PCA มาตรฐานเพื่อวิเคราะห์1wiXWXW=diag(wi)

น้ำหนักเซลล์

กระดาษโดยTamuz et al. 2013ที่คุณพบจะพิจารณาเป็นกรณีที่มีความซับซ้อนมากขึ้นเมื่อน้ำหนักที่แตกต่างจะนำไปใช้ในแต่ละองค์ประกอบของเมทริกซ์ข้อมูล แน่นอนว่าไม่มีวิธีการวิเคราะห์และต้องใช้วิธีการวนซ้ำ โปรดทราบว่าตามที่ได้รับการยอมรับจากผู้เขียนพวกเขาได้คิดค้นล้อขึ้นใหม่เช่นน้ำหนักทั่วไปได้รับการพิจารณาอย่างแน่นอนเช่นในGabriel and Zamir, 1979, การจัดอันดับโดยประมาณของเมทริกซ์น้อยที่สุดด้วยตัวเลือกน้ำหนักน้อยที่สุด สิ่งนี้ถูกกล่าวถึงที่นี่ด้วยwij

เป็นข้อสังเกตเพิ่มเติม: ถ้าน้ำหนักแตกต่างกันไปตามทั้งตัวแปรและการสังเกต แต่มีความสมมาตรดังนั้นw ฉันj = w j ฉันแล้วการแก้ปัญหาการวิเคราะห์เป็นไปได้อีกครั้งดูKoren และคาร์เมล 2004 การลดขนาดเชิงเส้นที่แข็งแกร่ง .wijwij=wji


ขอบคุณสำหรับการชี้แจง คุณสามารถอธิบายได้หรือไม่ว่าทำไมไม่สามารถใช้สารละลายวิเคราะห์กับตุ้มน้ำหนักแนวทแยงได้ ฉันนี่คือสิ่งที่ฉันหายไปจากทั้ง Tamuz et al 2013 และ Gabriel และ Zamir 1979
noname

@ ชื่อ: ฉันไม่ได้ตระหนักถึงหลักฐานดังกล่าวและยิ่งกว่านั้นฉันจะไม่แปลกใจถ้ามันไม่เป็นที่รู้จัก โดยทั่วไปค่อนข้างยุ่งยากในการพิสูจน์ว่าบางสิ่งเป็นไปไม่ได้โดยเฉพาะอย่างยิ่งสิ่งที่ไม่สามารถวิเคราะห์ได้ ความเป็นไปไม่ได้ของการเพิ่มความยาวของมุมที่มีชื่อเสียงรอการพิสูจน์มานานกว่า 2,000 ปี ... (ต่อ)
อะมีบากล่าวว่า Reinstate Monica

3
(. ต่อ): @noname สิ่งที่คุณจะถามคือการแสดงให้เห็นว่าปัญหาของการลดเกี่ยวกับการบีบบังคับให้มีตำแหน่งต่ำQ ไม่สามารถลดปัญหา eigenvector ได้ ฉันกลัวว่าคุณจะต้องมีฟอรัมอื่นสำหรับสิ่งนั้น แต่โปรดทราบว่าการหา eigenvector นั้นไม่ได้เป็นวิธีการวิเคราะห์ที่แน่นอน: มันเป็นเพียงแค่การทำซ้ำที่มักจะดำเนินการอย่างเงียบ ๆ โดยฟังก์ชั่นห้องสมุดมาตรฐาน i,jwij(XijAผมJ)2AQ
อะมีบากล่าวว่า Reinstate Monica

2
+1 ส่วนแรกของคำตอบที่สามารถแนวความคิดในแง่ของการถ่วงน้ำหนัก (ทั่วไป) Biplot ตามที่อธิบายไว้ที่นี่ โปรดจำไว้ว่า PCA เป็น "กรณีเฉพาะของ" Biplot (เกี่ยวข้องกับคำตอบที่เรียงรายกัน)
ttnphns

@ttnphns: หลังจากความคิดเห็นของคุณและเธรดอื่นถูกปิดเป็นรายการที่ซ้ำกันฉันอ่านคำตอบของฉันอีกครั้งและขยายคำอธิบายวิธีจัดการกับน้ำหนักแถว ฉันคิดว่าก่อนหน้านี้มันไม่ถูกต้องสมบูรณ์หรืออย่างน้อยก็ไม่สมบูรณ์เพราะฉันไม่ได้พูดถึงการอยู่ตรงกลางด้วยค่าเฉลี่ยถ่วงน้ำหนัก ฉันหวังว่ามันจะสมเหตุสมผลมากขึ้นในตอนนี้!
อะมีบาพูดว่า Reinstate Monica

5

ขอบคุณอะมีบาสำหรับข้อมูลเชิงลึกเกี่ยวกับน้ำหนักแถว ฉันรู้ว่านี่ไม่ใช่ stackoverflow แต่ฉันมีปัญหาบางอย่างในการหาการติดตั้ง PCA แบบถ่วงน้ำหนักพร้อมคำอธิบายและเนื่องจากนี่เป็นหนึ่งในผลลัพธ์แรกเมื่อ googling สำหรับ PCA แบบถ่วงน้ำหนักฉันคิดว่าการแนบโซลูชันของฉันจะดี อาจช่วยคนอื่นในสถานการณ์เดียวกัน ในตัวอย่างโค้ด Python2 นี้ PCA ที่ถ่วงด้วยเคอร์เนล RBF ตามที่อธิบายไว้ข้างต้นจะใช้ในการคำนวณแทนเจนต์ของชุดข้อมูล 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()

และเอาต์พุตตัวอย่าง (มันเหมือนกันทุกจุด): ป้อนคำอธิบายรูปภาพที่นี่

ไชโย
แอนเดรส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.