Phân tích thành phần chính có trọng số


17

Sau một số tìm kiếm, tôi thấy rất ít về việc kết hợp các trọng số / sai số đo quan sát vào phân tích thành phần chính. Những gì tôi tìm thấy có xu hướng dựa vào các phương pháp lặp để bao gồm trọng số (ví dụ, ở đây ). Câu hỏi của tôi là tại sao phương pháp này là cần thiết? Tại sao chúng ta không thể sử dụng các hàm riêng của ma trận hiệp phương sai có trọng số?


1
Ngoài câu trả lời bên dưới, vui lòng xem thống kê chủ đề.stackexchange.com / q / 141754/3277 , trong đó PCA có trọng số (với trọng số trên cột và / hoặc hàng) được giải thích chủ yếu tương đương với svd có trọng số (tổng quát) biplot.
ttnphns

Câu trả lời:


33

Nó phụ thuộc vào chính xác những gì trọng lượng của bạn áp dụng cho.

Trọng lượng hàng

Đặt X là ma trận dữ liệu với các biến trong cột và n quan sát xi theo hàng. Nếu mỗi quan sát có trọng số liên quan wi , thì thực sự đơn giản để kết hợp các trọng số này vào PCA.

Trước tiên, người ta cần tính trung bình có trọng số và trừ nó khỏi dữ liệu để căn giữa nó.μ=1wiwixi

Sau đó, chúng tôi tính toán ma trận hiệp phương sai có trọng số1wiXWX , trong đó là ma trận đường chéo có trọng số và áp dụng PCA tiêu chuẩn cho phân tích nóW=diag(wi)

Trọng lượng tế bào

Nghiên cứu của Tamuz et al., 2013 , mà bạn tìm thấy, xem xét một trường hợp phức tạp hơn khi trọng lượng khác nhau được áp dụng cho từng yếu tố của ma trận dữ liệu. Sau đó, thực sự không có giải pháp phân tích và người ta phải sử dụng một phương pháp lặp. Lưu ý rằng, như đã được các tác giả thừa nhận, họ đã phát minh lại bánh xe, vì các trọng số chung như vậy chắc chắn đã được xem xét trước đó, ví dụ như trong Gabriel và Zamir, 1979, Xấp xỉ xấp xỉ ma trận theo Least Squares với bất kỳ lựa chọn nào về trọng số . Điều này cũng đã được thảo luận ở đây .wij

Như một nhận xét bổ sung: nếu các trọng số thay đổi theo cả hai biến và quan sát, nhưng là đối xứng, do đó , thì giải pháp phân tích có thể trở lại, xem Koren và Carmel, 2004, Robust Tuyến tính Giảm kích thước .wijwij=wji


Cảm ơn bạn đã làm rõ. Bạn có thể giải thích tại sao không có giải pháp phân tích nào khả thi với trọng lượng ngoài đường chéo không? Tôi đây là những gì tôi đang thiếu từ cả Tamuz et al 2013 và Gabriel và Zamir 1979.
noname

@noname: Tôi không biết về một bằng chứng như vậy, và hơn nữa tôi sẽ không ngạc nhiên nếu nó không được biết đến. Nói chung là khá khó khăn để chứng minh rằng một cái gì đó là không thể , đặc biệt là một cái gì đó là không thể phân tích. Sự bất khả thi của việc cắt góc nổi tiếng đã chờ đợi bằng chứng của nó trong hơn 2000 năm ... (tiếp)
amip nói rằng Rebstate Monica

3
@noname: (tt) Những gì bạn đang hỏi là chỉ ra rằng vấn đề giảm thiểu đối với A bị ràng buộc để có thứ hạng thấp q . không thể giảm đối với một vấn đề eigenvector. Tôi sợ bạn sẽ cần một diễn đàn khác cho điều đó (có thể là mathoverflow?). Nhưng lưu ý rằng việc tìm kiếm các hàm riêng cũng không chính xác là một giải pháp phân tích : chỉ là các phép lặp thường được thực hiện một cách âm thầm bởi một hàm thư viện chuẩn. ΣTôi,jwTôij(XTôij-MộtTôij)2Mộtq
amip nói phục hồi Monica

2
+1. Phần đầu tiên của câu trả lời cũng có thể được khái niệm hóa theo thuật ngữ Biplot có trọng số (Tổng quát) như được mô tả ở đây . Hãy ghi nhớ làm thế nào PCA là một "trường hợp cụ thể" của Biplot (cũng liên quan đến câu trả lời được xếp hàng).
ttnphns

@ttnphns: Sau khi bình luận của bạn và một chủ đề khác được đóng lại dưới dạng trùng lặp, tôi đọc lại câu trả lời của mình và mở rộng giải thích về cách xử lý trọng số hàng. Tôi nghĩ rằng trước đây nó không hoàn toàn chính xác hoặc ít nhất là không hoàn chỉnh bởi vì tôi đã không đề cập đến việc định tâm với một trung bình có trọng số. Tôi hy vọng nó có ý nghĩa hơn bây giờ!
amip nói rằng Phục hồi Monica

5

Cảm ơn bạn rất nhiều amip vì cái nhìn sâu sắc về trọng lượng hàng. Tôi biết rằng đây không phải là stackoverflow, nhưng tôi đã gặp một số khó khăn khi tìm cách triển khai PCA có trọng số hàng với lời giải thích và, vì đây là một trong những kết quả đầu tiên khi googling cho PCA có trọng số, tôi nghĩ rằng sẽ rất tốt nếu đính kèm giải pháp của mình , có lẽ nó có thể giúp đỡ những người khác trong tình huống tương tự. Trong đoạn mã Python2 này, một PCA có trọng số với nhân RBF như mô tả ở trên được sử dụng để tính các tiếp tuyến của bộ dữ liệu 2D. Tôi sẽ rất vui khi nghe một số thông tin phản hồi!

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()

Và một đầu ra mẫu (nó làm tương tự cho mỗi dấu chấm): nhập mô tả hình ảnh ở đây

Chúc mừng,
Andres

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.