Xoay các thành phần PCA để cân bằng phương sai trong từng thành phần


9

Tôi đang cố gắng giảm tính chiều và tiếng ồn của bộ dữ liệu bằng cách thực hiện PCA trên bộ dữ liệu và loại bỏ vài PC cuối cùng. Sau đó, tôi muốn sử dụng một số thuật toán học máy trên các PC còn lại và do đó tôi muốn bình thường hóa dữ liệu bằng cách cân bằng phương sai của PC để làm cho thuật toán hoạt động tốt hơn.

Một cách đơn giản là đơn giản hóa bình thường phương sai thành các giá trị đơn vị. Tuy nhiên, PC đầu tiên chứa nhiều phương sai so với tập dữ liệu gốc so với các tập dữ liệu sau và tôi vẫn muốn cho nó nhiều "trọng lượng" hơn. Vì vậy, tôi đã tự hỏi: có một cách đơn giản để chỉ phân chia phương sai của nó và chia sẻ nó với các PC có ít phương sai hơn?

Một cách khác là ánh xạ các PC trở lại không gian tính năng ban đầu, nhưng trong trường hợp đó, tính chiều cũng sẽ tăng lên giá trị ban đầu.

Tôi đoán tốt hơn là giữ các cột kết quả trực giao, nhưng không cần thiết tại thời điểm này.


1
Không ... varimax tối đa hóa tổng phương sai bình phương của các tải, vì vậy nó cố gắng làm cho chúng không bằng nhau nhất có thể. Ngoài ra, tại sao bạn muốn cân bằng các thành phần? Toàn bộ vấn đề là nắm bắt càng nhiều biến thể càng tốt trong càng ít thành phần càng tốt.

2
Có phải chỉ đơn giản là tiêu chuẩn hóa điểm thành phần để phương sai đơn vị không phù hợp với bạn? Tại sao sau đó? Bạn muốn loại kết quả nào - các cột kết quả không được tương quan ngoài các phương sai bằng nhau?
ttnphns

2
Từ mô tả của bạn, nó trông rất giống như bạn muốn chỉ đơn giản là "hình cầu" dữ liệu (giảm kích thước). Nó thường được thực hiện như một bước tiền xử lý trong học máy. Để đạt được nó, bạn chỉ cần thực hiện PCA, chọn một số thành phần và chuẩn hóa chúng. Tôi đoán có thể tìm thấy một phép quay trực giao (chẳng hạn như varimax) xoay các thành phần được tiêu chuẩn hóa để chúng vẫn không tương quan nhưng giải thích chính xác cùng một lượng phương sai; Đó là một câu hỏi thú vị, tôi cần suy nghĩ về nó. Nhưng tôi chưa bao giờ thấy điều này được thực hiện, chắc chắn không phải trong học máy.
amip

2
Nhân tiện, "một số thuật toán học máy" mà bạn muốn áp dụng sau PCA là gì? Điều này có thể có liên quan.
amip

1
Lưu ý rằng nếu bạn xoay PC chuẩn, thì khoảng cách sẽ không thay đổi! Vì vậy, nó thực sự không quan trọng đối với bất kỳ thuật toán dựa trên khoảng cách tiếp theo.
amip

Câu trả lời:


10

Tôi không hoàn toàn rõ ràng rằng những gì bạn đang hỏi là những gì bạn thực sự cần: một bước tiền xử lý phổ biến trong học máy là giảm kích thước + làm trắng, có nghĩa là thực hiện PCA và chuẩn hóa các thành phần, không có gì khác. Nhưng tôi vẫn sẽ tập trung vào câu hỏi của bạn vì nó được xây dựng, bởi vì nó thú vị hơn.


Đặt là ma trận dữ liệu trung tâm với các điểm dữ liệu trong các hàng và các biến trong các cột. PCA tương đương với phân tách giá trị số ít trong đó để thực hiện giảm kích thước, chúng tôi chỉ giữ các thành phần . Một "xoay nhân tố" trực giao của các thành phần này ngụ ý chọn một ma trận trực giao matrix và cắm nó vào phân tách:XX = U S VU k S k V k , k k × k R XU k S k V k = U k R RS k V k = n×d

X=USVUkSkVk,
kk×kR
XUkSkVk=UkRRSkVk=n1UkRRotatedstandardized scoresRSkVk/n1Rotated loadings.
Ở đây là các thành phần được tiêu chuẩn hóa xoay và thuật ngữ thứ hai đại diện cho tải trọng xoay được chuyển đổi. Phương sai của mỗi thành phần sau khi quay được tính bằng tổng bình phương của vectơ tải tương ứng; trước khi quay, nó chỉ đơn giản là . Sau khi xoay nó là một cái gì đó khác.s 2 i /(n-1)n1UkRsi2/(n1)

Bây giờ chúng tôi đã sẵn sàng để giải quyết vấn đề bằng thuật ngữ toán học: đưa ra các tải không được bảo vệ , tìm ma trận xoay sao cho các tải được xoay, , có tổng bình phương bằng nhau trong mỗi cột. RLRL=VkSk/n1RLR

Hãy giải quyết nó. Tổng các cột của hình vuông sau khi quay bằng các phần tử đường chéo của

(LR)LR=RS2n1R.
si2/(n1)μ

Tôi không nghĩ có một giải pháp dạng kín cho vấn đề này và trên thực tế có nhiều giải pháp khác nhau. Nhưng một giải pháp có thể dễ dàng được xây dựng theo kiểu liên tiếp:

  1. kσmax>μσmin<μ
  2. μθθ
    R2D=(cosθsinθsinθcosθ)
    cos2θσmax+sin2θσmin=cos2θσmax+(1cos2θ)σmin=μ,
    cos2θ=μσminσmaxσmin.
  3. μ
  4. Tiếp tục với cặp tiếp theo, lấy thành phần có phương sai lớn nhất và thành phần có phương sai nhỏ nhất. Đi số 2.

(k1)R


Thí dụ

S2/(n1)

(10000060000300001).
5
  1. 51+(105)=6

  2. 53+(65)=4

  3. 54+(61)=5

  4. Làm xong.

Tôi đã viết kịch bản Matlab thực hiện thuật toán này (xem bên dưới). Đối với ma trận đầu vào này, chuỗi các góc quay là:

48.1897   35.2644   45.0000

Phương sai thành phần sau mỗi bước (theo hàng):

10     6     3     1
 5     6     3     6
 5     5     4     6
 5     5     5     5

Ma trận xoay vòng cuối cùng (sản phẩm của ba ma trận xoay 2D):

 0.6667         0    0.5270    0.5270
      0    0.8165    0.4082   -0.4082
      0   -0.5774    0.5774   -0.5774
-0.7454         0    0.4714    0.4714

(LR)LR

5.0000         0    3.1623    3.1623
     0    5.0000    1.0000   -1.0000
3.1623    1.0000    5.0000    1.0000
3.1623   -1.0000    1.0000    5.0000

Đây là mã:

S = diag([10 6 3 1]);
mu = mean(diag(S));
R = eye(size(S));

vars(1,:) = diag(S);
Supdated = S;

for i = 1:size(S,1)-1
    [~, maxV] = max(diag(Supdated));
    [~, minV] = min(diag(Supdated));

    w = (mu-Supdated(minV,minV))/(Supdated(maxV,maxV)-Supdated(minV,minV));
    cosTheta = sqrt(w);
    sinTheta = sqrt(1-w);

    R2d = eye(size(S));
    R2d([maxV minV], [maxV minV]) = [cosTheta sinTheta; -sinTheta cosTheta];
    R = R * R2d;

    Supdated = transpose(R2d) * Supdated * R2d;    

    vars(i+1,:) = diag(Supdated);
    angles(i) = acosd(cosTheta);
end

angles                %// sequence of 2d rotation angles
round(vars)           %// component variances on each step
R                     %// final rotation matrix
transpose(R)*S*R      %// final S matrix

Đây là mã trong Python được cung cấp bởi @feilong:

def amoeba_rotation(s2):
    """
    Parameters
    ----------
    s2 : array
        The diagonal of the matrix S^2.

    Returns
    -------
    R : array
        The rotation matrix R.

    Examples
    --------
    >>> amoeba_rotation(np.array([10, 6, 3, 1]))
    [[ 0.66666667  0.          0.52704628  0.52704628]
     [ 0.          0.81649658  0.40824829 -0.40824829]
     [ 0.         -0.57735027  0.57735027 -0.57735027]
     [-0.74535599  0.          0.47140452  0.47140452]]

    http://stats.stackexchange.com/a/177555/87414
    """
    n = len(s2)
    mu = s2.mean()
    R = np.eye(n)
    for i in range(n-1):
        max_v, min_v = np.argmax(s2), np.argmin(s2)
        w = (mu - s2[min_v]) / (s2[max_v] - s2[min_v])
        cos_theta, sin_theta = np.sqrt(w), np.sqrt(1-w)
        R[:, [max_v, min_v]] = np.dot(
            R[:, [max_v, min_v]],
            np.array([[cos_theta, sin_theta], [-sin_theta, cos_theta]]))
        s2[[max_v, min_v]] = [mu, s2[max_v] + s2[min_v] - mu]
    return R

kσi2k


Tôi đoán, đối với bất kỳ hai cặp thành phần nào (điểm số của chúng), góc quay sẽ là 45 độ, để cân bằng phương sai của chúng. Tuy nhiên, tôi không thể tưởng tượng làm thế nào để thực hiện toàn bộ nhiệm vụ với hơn 3 thành phần.
ttnphns

1
@feilong, tôi nghĩ việc cân bằng phương sai của một cặp thành phần tại một thời điểm là một thuật toán rất tối ưu. Những gì tôi đề xuất là chọn các phép quay sao cho phương sai của một thành phần trở nên chính xác bằng phương sai trung bình toàn cầu. Sau đó, thành phần này được "thực hiện", và người ta có thể đối phó với phần còn lại. Điều này được đảm bảo để cân bằng tất cả các phương sai trong một số bước hữu hạn. Xem bình luận trước của tôi cho một ví dụ.
amip

1
@amoeba Bạn nói đúng, đó là một giải pháp tốt hơn và nên hoàn thành với n-1 bước.
Feilong

1
@amoeba Tôi đã thêm triển khai tối thiểu của mình bằng Python. Tôi đã sửa đổi phần nhân toàn bộ ma trận, vì điều đó có thể tốn thời gian cho các ma trận lớn.
feilong

1
@amoeba Cụ thể cho các thành phần nguyên tắc, có thể tiết kiệm nhiều thời gian hơn bằng cách loại bỏ phần tìm kiếm tối đa và tối thiểu. Chúng ta có thể chỉ cần xoay các thành phần thứ 1 và thứ 2 (để làm cho thành phần thứ nhất có phương sai trung bình), và sau đó là thứ 2 và thứ 3, v.v. Chúng ta chỉ cần đảm bảo tổng phương sai của mỗi cặp lớn hơn mu.
feilong

2

XYσmax2σmin2Xμ2Yσmax2+σmin2μ2

cosθ

μ2=cos2θ(σmax2)+sin2θ(σmin2)

nhưng chưa chứng minh được phương trình này đến từ đâu; có lẽ nghĩ rằng nó là hiển nhiên mà không cần giải thích. Rõ ràng hay không, tôi tin rằng nó đáng để làm sáng tỏ - một cách nào đó. Câu trả lời của tôi trình bày một cách.

XYθXxx

minh họa của vòng quay

x Xx=xcosθxxxxyysinθ

x=x(xx)=xcosθysinθ

μ2X

μ2=x2=(xcosθysinθ)2=(x2cos2θ+y2sin2θ2xycosθsinθ)=cos2θx2+sin2θy22cosθsinθxy=0 (X and Y are uncorrelated)=cos2θ(σmax2)+sin2θ(σmin2)

cosθ


2
(cosθsinθsinθcosθ)(σmax200σmin2)(cosθsinθsinθcosθ),
amip

Và tôi nghĩ rằng giải thích hình học và tính toán "trực tiếp" của bạn (không có ma trận) dễ hiểu hơn và rất hữu ích để phát triển các trực giác đúng đắn.
amip

0

Nếu tôi diễn giải mọi thứ một cách chính xác, bạn có nghĩa là thành phần nguyên tắc đầu tiên (eigenvalue) giải thích hầu hết các phương sai trong dữ liệu. Điều này có thể xảy ra khi phương pháp nén của bạn là tuyến tính. Tuy nhiên, có thể có các phụ thuộc phi tuyến tính trong không gian tính năng của bạn.

TL / DR: PCA là phương pháp tuyến tính. Sử dụng Autoencoder (pca phi tuyến tính) để giảm kích thước. Nếu phần học máy được giám sát việc học thì chỉ cần theo dõi chức năng mất của bạn trong khi điều chỉnh các tham số (siêu) cho bộ mã hóa tự động. Bằng cách này, bạn sẽ kết thúc với một phiên bản nén dữ liệu gốc tốt hơn nhiều.

Đây là một ví dụ điển hình trong đó họ thực hiện tìm kiếm dạng lưới để tìm số lượng thành phần chính tối ưu để giữ (siêu tham số) bằng PCA. Cuối cùng, họ áp dụng Hồi quy logistic trên không gian chiều thấp hơn: http://scikit-learn.org/urdy/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py

Protip: Bộ tạo tự động không có giải pháp dạng đóng (afaik) vì vậy nếu ngữ cảnh của bạn đang truyền dữ liệu, điều này có nghĩa là bạn có thể liên tục cập nhật bộ mã hóa tự động (biểu diễn nén) và do đó có thể bù cho những thứ như khái niệm trôi. Với pca, bạn phải đào tạo lại chế độ hàng loạt theo thời gian khi dữ liệu mới xuất hiện.

Để cung cấp cho một số tính năng "trọng lượng" hơn, hãy xem chính quy (Tôi sẽ bắt đầu từ định mức https://en.wikipedia.org/wiki/Norm_(mathatures) ). Bạn cũng có thể ngạc nhiên khi hồi quy logistic tương tự như thế nào với perceptron.


Tôi không thấy cách này trả lời câu hỏi của OP; câu trả lời của bạn dường như hoàn toàn không liên quan đến câu hỏi.
amip

Vì vậy, tôi đã tự hỏi: có một cách đơn giản để chỉ phân chia phương sai của nó và chia sẻ nó với các PC có ít phương sai hơn? OP muốn làm giảm kích thước. Tôi đã đưa ra một giải pháp thay thế để giải quyết vấn đề của anh ấy, vì cuối cùng những gì OP muốn không đảm bảo sẽ mang lại hiệu suất tốt hơn trừ khi hiệu suất được đo lường. Làm việc trong không gian hilbert / không gian chuẩn không đảm bảo kết quả tốt hơn. Đo lường hiệu suất dẫn đến kết quả tốt hơn.
shuriken x màu xanh
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.