ยังไม่ชัดเจนสำหรับฉันว่าสิ่งที่คุณถามคือสิ่งที่คุณต้องการจริง ๆ : ขั้นตอนทั่วไปในการเรียนรู้ของเครื่องคือการลดขนาดและฟอกสีฟันซึ่งหมายถึงการทำ PCA และสร้างมาตรฐานให้กับองค์ประกอบ แต่ฉันจะยังคงให้ความสำคัญกับคำถามของคุณเนื่องจากเป็นสูตรที่น่าสนใจมากกว่า
ปล่อย X เป็นศูนย์กลาง n × dเมทริกซ์ข้อมูลที่มีจุดข้อมูลในแถวและตัวแปรในคอลัมน์ PCA จะเท่ากับการสลายตัวของค่าเอกฐาน
X =U S V⊤≈ยูkSkV⊤k,
สถานที่เพื่อลดขนาดเราเก็บไว้เท่านั้น
kส่วนประกอบ orthogonal "การหมุนตัวประกอบปัจจัย" ขององค์ประกอบเหล่านี้แสดงถึงการเลือกมุมฉาก
k × k มดลูก
R และเสียบเข้าไปในการสลายตัว:
X ≈ยูkSkV⊤k=ยูkR R⊤SkV⊤k=n - 1-----√ยู⊤kRหมุนคะแนนมาตรฐาน⋅R⊤SkV⊤k/n - 1-----√โหลดแบบหมุน⊤.
ที่นี่
n - 1-----√ยูkRเป็นส่วนประกอบมาตรฐานที่หมุนได้และคำศัพท์ที่สองแสดงถึงการโหลดแบบหมุนเวียนที่ย้าย ความแปรปรวนของแต่ละองค์ประกอบหลังจากการหมุนถูกกำหนดโดยผลรวมของกำลังสองของเวกเตอร์การโหลดที่สอดคล้องกัน ก่อนการหมุน
s2ผม/ (n-1). หลังจากหมุนมันเป็นอย่างอื่น
ตอนนี้เราพร้อมที่จะกำหนดปัญหาในแง่คณิตศาสตร์แล้ว: รับโหลดที่ไม่ได้รับการป้องกัน L =VkSk/n - 1-----√หาเมทริกซ์การหมุน R เช่นที่โหลดหมุน L Rมีผลรวมกำลังสองเท่ากันในแต่ละคอลัมน์
มาแก้กัน ผลรวมของคอลัมน์ของช่องสี่เหลี่ยมหลังจากการหมุนจะเท่ากับองค์ประกอบในแนวทแยงของ
( L R)⊤L R =R⊤S2n - 1ร .
สิ่งนี้สมเหตุสมผล: การหมุนเพียงแค่กระจายความแปรปรวนของส่วนประกอบซึ่งได้รับมาจากเดิม s2ผม/ (n-1)ระหว่างพวกเขาตามสูตรนี้ เราจำเป็นต้องแจกจ่ายต่อให้พวกเขาเหล่านั้นทั้งหมดเท่ากับมูลค่าเฉลี่ยของพวกเขาμ.
ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาแบบปิดนี้และอันที่จริงมีวิธีแก้ปัญหาที่แตกต่างกันมากมาย แต่วิธีการแก้ปัญหาสามารถสร้างได้อย่างง่ายดายตามลำดับ:
- ใช้องค์ประกอบแรกและ kองค์ประกอบที่ คนแรกมีความแปรปรวนσสูงสุด> μ และอันสุดท้ายมีความแปรปรวน σmin<μ.
- หมุนสองอันนี้เท่านั้นเพื่อให้ความแปรปรวนของอันแรกเท่ากับ μ. เมทริกซ์การหมุนใน 2D ขึ้นอยู่กับพารามิเตอร์เดียวเท่านั้นθ และง่ายในการเขียนสมการและคำนวณความจำเป็น θ. อันที่จริง
R2D=(cosθ−sinθsinθcosθ)
และหลังจากการแปลงพีซีเครื่องแรกจะได้รับความแปรปรวน cos2θ⋅σmax+sin2θ⋅σmin=cos2θ⋅σmax+(1−cos2θ)⋅σmin=μ,
จากที่เราได้รับทันที cos2θ=μ−σminσmax−σmin.
- องค์ประกอบแรกเสร็จสิ้นแล้วมันมีความแปรปรวน μ.
- ดำเนินการต่อไปยังคู่ถัดไปนำส่วนประกอบที่มีความแปรปรวนที่ใหญ่ที่สุดและอันที่มีความแปรปรวนน้อยที่สุด ไปที่ # 2
สิ่งนี้จะกระจายผลต่างทั้งหมดเท่า ๆ กันตามลำดับ (k−1)การหมุนแบบ 2 มิติ การคูณเมทริกซ์การหมุนเหล่านี้ทั้งหมดเข้าด้วยกันจะให้ผลโดยรวมR.
ตัวอย่าง
พิจารณาดังต่อไปนี้ S2/(n−1) เมทริกซ์:
⎛⎝⎜⎜⎜10000060000300001⎞⎠⎟⎟⎟.
ความแปรปรวนเฉลี่ยคือ
5. อัลกอริทึมของฉันจะดำเนินการดังนี้:
ขั้นตอนที่ 1: หมุน PC1 และ PC4 เพื่อให้ PC1 ได้รับความแปรปรวน 5. เป็นผลให้ PC4 ได้รับความแปรปรวน1+(10−5)=6.
ขั้นตอนที่ 2: หมุน PC2 (ความแปรปรวนสูงสุดใหม่) และ PC3 เพื่อให้ PC2 ได้รับความแปรปรวน 5. เป็นผลให้ PC3 ได้รับความแปรปรวน3+(6−5)=4.
ขั้นตอนที่ 3: หมุน PC4 (ความแปรปรวนสูงสุดใหม่) และ PC3 เพื่อให้ PC4 ได้รับความแปรปรวน 5. เป็นผลให้ PC3 ได้รับความแปรปรวน4+(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
และสุดท้าย (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
นี่คือรหัส:
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
นี่คือรหัสใน Python ให้บริการโดย @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 ตัวแปรที่ไม่เกี่ยวข้องกับความแปรปรวน σ2iหาการหมุน (เช่นพื้นฐานมุมฉากใหม่) ที่จะให้ผล k ตัวแปรที่มีความแปรปรวนเท่ากัน (แต่แน่นอนว่าไม่ได้ไม่เกี่ยวข้องกันอีกต่อไป)