머신 러닝의 일반적인 전처리 단계는 차원 축소 + 미백입니다. 이는 PCA를 수행하고 구성 요소를 표준화하는 것을 의미합니다. 그럼에도 불구하고 나는 당신의 질문이 더 흥미 롭기 때문에 공식화 된 것에 집중할 것입니다.
하자 센터링 될 열의 행 변수 데이터 포인트와 데이터 매트릭스. PCA는 단일 값 분해 , 차원 축소를 수행하는 경우 구성 요소 만 유지합니다 . 이러한 구성 요소의 직교 "인자 회전"은 직교 행렬 을 선택하여 분해에 연결하는 것을 의미합니다.엑스n × d
X =U S V⊤≈유케이에스케이V⊤케이,
케이k × k아르 자형X ≈유케이에스케이V⊤케이=유케이R R⊤에스케이V⊤케이=n - 1−−−−−√유⊤케이아르 자형회전표준화 된 점수⋅아르 자형⊤에스케이V⊤케이/n - 1−−−−−√회전 하중⊤.
여기서 은 회전 된 표준화 된 구성 요소이며 두 번째 항은 회전 된 하중을 나타냅니다. 회전 후 각 구성 요소의 분산은 해당하는 로딩 벡터의 제곱의 합으로 제공됩니다. 회전하기 전에 단순히 입니다. 회전 후 다른 것입니다.
n - 1−−−−−√유케이아르 자형에스2나는/ (n-1)
이제 우리는 수학적인 관점에서 문제를 공식화 할 준비가 : 회전되지 않은 부하 주어진 , 회전 행렬 찾을 회전 부하가 그와 같은 은 각 열에 동일한 제곱합을 갖습니다.L =V케이에스케이/n - 1−−−−−√아르 자형L R
해결합시다. 회전 후의 열 제곱합은 의 대각선 요소와 같습니다. 이것은 의미가 있습니다. 회전은 이 공식에 따라 원래 의해 주어진 성분의 분산을 재분배합니다 . 우리는 그것들이 모두 그들의 평균값 가되도록 재분배 할 필요가있다 .
( L R)⊤L R =아르 자형⊤에스2n - 1R .
에스2나는/ (n-1)μ
나는 이것에 대한 폐쇄 형 솔루션이 있다고 생각하지 않으며 실제로 많은 다른 솔루션이 있습니다. 그러나 순차적 인 방식으로 솔루션을 쉽게 구축 할 수 있습니다.
- 첫 번째 구성 요소와 번째 구성 요소를 가져옵니다 . 첫 번째는 분산 이고 마지막은 분산 입니다.케이σ최대> μσ분< μ
- 첫 번째의 분산이 가되도록이 두 개만 회전하십시오 . 2D의 회전 행렬은 하나의 매개 변수 에만 의존 하며 방정식을 작성하고 필요한 쉽게 계산할 수 있습니다. 실제로 변환 후 첫 번째 PC는 여기서 즉시 얻습니다.μθθ
아르 자형2D= (코사인θ− 죄θ죄θ코사인θ)
코사인2θ ⋅σ최대+죄2θ ⋅σ분=코사인2θ ⋅σ최대+ ( 1 −코사인2θ ) ⋅σ분= μ ,
코사인2θ =μ -σ분σ최대−σ분.
- 첫 번째 구성 요소는 이제 분산 입니다.μ
- 가장 큰 분산을 가진 성분과 가장 작은 분산을 가진 성분을 취하여 다음 쌍으로 진행하십시오. 고토 # 2.
이렇게하면 2D 회전 순서에 따라 모든 분산이 균등하게 재분배됩니다 . 이 회전 행렬을 모두 곱하면 전체 됩니다.( k - 1 )아르 자형
예
다음의 행렬을 고려하십시오평균 분산은 입니다. 내 알고리즘은 다음과 같이 진행됩니다.에스2/ (n-1)
⎛⎝⎜⎜⎜10000060000삼00001⎞⎠⎟⎟⎟.
5
1 단계 : 그 PC1 그래서 회전 PC1 및 PC4는 분산 도착 . 결과적으로 PC4는 분산 얻습니다 .5(1) + ( 10 - 5 ) = 6
2 단계 : PC2가 분산 얻는다 그래서 회전 PC2 (새 최대 편차) 및 PC3 . 결과적으로 PC3은 분산 얻습니다 .5(3) + ( 6 - 5 ) = 4
3 단계 : PC4 (새로운 최대 분산) 및 PC3을 회전하여 PC4가 분산 얻습니다 . 결과적으로 PC3은 분산 얻습니다 .54 + ( 6 - 1 ) = 5
끝난.
이 알고리즘을 구현하는 Matlab 스크립트를 작성했습니다 (아래 참조). 이 입력 행렬의 회전 각도 순서는 다음과 같습니다.
48.1897 35.2644 45.0000
각 단계 후의 성분 차이 (행) :
10 6 3 1
5 6 3 6
5 5 4 6
5 5 5 5
최종 회전 행렬 (세 개의 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
그리고 마지막 행렬은 다음과 같습니다.( L R)⊤L R
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
코드는 다음과 같습니다.
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
@feilong에서 제공 한 Python 코드는 다음과 같습니다.
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
이 문제는 다음과 완전히 같습니다. 분산이 인 상관되지 않은 변수가 주어지면 동일한 분산을 갖는 변수를 산출하는 회전 (즉, 새로운 직교 기준)을 찾으십시오 (물론 더 이상 상관되지 않습니다).케이σ2나는케이