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 V ⊤ ≈ U k S k V ⊤ k , k k × k R X ≈ U k S k V ⊤ k = U k R R ⊤ S k V ⊤ k = √n×d
X=USV⊤≈UkSkV⊤k,
kk×kR√X≈UkSkV⊤k=UkRR⊤SkV⊤k=n−1−−−−−√U⊤kRRotatedstandardized scores⋅R⊤SkV⊤k/n−1−−−−−√Rotated 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)n−1−−−−−√UkRs2i/(n−1)
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/n−1−−−−−√RLR
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=R⊤S2n−1R.
s2i/(n−1)μ
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:
- kσmax>μσmin<μ
- μθθ
R2D=(cosθ−sinθsinθcosθ)
cos2θ⋅σmax+sin2θ⋅σmin=cos2θ⋅σmax+(1−cos2θ)⋅σmin=μ,
cos2θ=μ−σminσmax−σmin.
- μ
- 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.
(k−1)R
Thí dụ
S2/(n−1)
⎛⎝⎜⎜⎜10000060000300001⎞⎠⎟⎟⎟.
5
51+(10−5)=6
53+(6−5)=4
54+(6−1)=5
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σ2ik