หมุนส่วนประกอบ PCA เพื่อปรับความแปรปรวนในแต่ละองค์ประกอบให้เท่ากัน


9

ฉันกำลังพยายามลดมิติข้อมูลและเสียงรบกวนของชุดข้อมูลด้วยการแสดง PCA บนชุดข้อมูลและทิ้งพีซีสองสามเครื่องล่าสุด หลังจากนั้นฉันต้องการใช้อัลกอริทึมการเรียนรู้ของเครื่องบางอย่างบนพีซีที่เหลืออยู่ดังนั้นฉันจึงต้องการทำให้ข้อมูลเป็นมาตรฐานด้วยการทำให้ความแตกต่างของพีซีให้เท่ากัน

วิธีง่ายๆวิธีหนึ่งก็คือทำให้ค่าความแปรปรวนเป็นค่าหน่วย อย่างไรก็ตามพีซีเครื่องแรกมีความแปรปรวนจากชุดข้อมูลดั้งเดิมมากกว่าชุดข้อมูลต่อไปนี้และฉันยังต้องการให้ "น้ำหนัก" มากขึ้น ดังนั้นฉันสงสัยว่า: มีวิธีง่าย ๆ ในการแยกความแปรปรวนและแบ่งปันกับพีซีที่มีความแปรปรวนน้อยกว่าหรือไม่

อีกวิธีหนึ่งคือการแมปพีซีกลับไปยังพื้นที่คุณลักษณะดั้งเดิม แต่ในกรณีนั้นมิติข้อมูลจะเพิ่มขึ้นเป็นค่าดั้งเดิม

ฉันเดาว่าจะดีกว่าที่จะเก็บคอลัมน์ผลลัพธ์ไว้เป็นมุมฉาก แต่ก็ไม่จำเป็นในตอนนี้


1
ไม่ ... varimax เพิ่มผลรวมของผลต่างยกกำลังสองของการโหลดสูงสุดดังนั้นจึงพยายามทำให้ไม่เท่ากันเท่าที่จะทำได้ นอกจากนี้ทำไมคุณต้องการทำให้ส่วนประกอบเท่ากัน? จุดทั้งหมดคือการจับการเปลี่ยนแปลงมากที่สุดเท่าที่เป็นไปได้ในองค์ประกอบน้อยที่สุด

2
การปรับคะแนนองค์ประกอบให้เป็นมาตรฐานนั้นแตกต่างจากหน่วยที่ไม่เหมาะกับคุณหรือไม่? แล้วทำไม? คุณต้องการผลลัพธ์แบบใด - คอลัมน์ผลลัพธ์ควรไม่เกี่ยวข้องกับความแปรปรวนที่เท่ากันหรือไม่
ttnphns

2
จากคำอธิบายของคุณดูเหมือนว่าคุณต้องการเพียงแค่ "ทรงกลม" ข้อมูล (ลดมิติ) มันมักจะทำตามขั้นตอนก่อนการประมวลผลในการเรียนรู้ของเครื่อง เพื่อให้บรรลุเป้าหมายคุณเพียงแค่ดำเนินการ PCA เลือกส่วนประกอบบางส่วนและสร้างมาตรฐาน ฉันเดาว่าเป็นไปได้ที่จะพบการหมุนมุมฉาก (เช่น varimax) ที่หมุนส่วนประกอบที่ได้มาตรฐานเช่นที่พวกเขายังคงไม่ได้เกี่ยวข้อง แต่อธิบายถึงความแปรปรวนจำนวนเดียวกัน นั่นเป็นคำถามที่น่าสนใจฉันต้องคิดเกี่ยวกับมัน แต่ฉันไม่เคยเห็นสิ่งนี้ทำแน่นอนไม่ได้อยู่ในการเรียนรู้ของเครื่อง
อะมีบา

2
"วิธีการเรียนรู้ของเครื่อง" ที่คุณต้องการใช้หลังจาก PCA คืออะไร สิ่งนี้อาจเกี่ยวข้อง
อะมีบา

1
โปรดทราบว่าหากคุณหมุนพีซีมาตรฐานของคุณระยะทางจะไม่เปลี่ยนแปลงเลย! ดังนั้นมันจึงไม่สำคัญสำหรับอัลกอริทึมที่อิงตามระยะทาง
อะมีบา

คำตอบ:


10

ยังไม่ชัดเจนสำหรับฉันว่าสิ่งที่คุณถามคือสิ่งที่คุณต้องการจริง ๆ : ขั้นตอนทั่วไปในการเรียนรู้ของเครื่องคือการลดขนาดและฟอกสีฟันซึ่งหมายถึงการทำ PCA และสร้างมาตรฐานให้กับองค์ประกอบ แต่ฉันจะยังคงให้ความสำคัญกับคำถามของคุณเนื่องจากเป็นสูตรที่น่าสนใจมากกว่า


ปล่อย X เป็นศูนย์กลาง n×dเมทริกซ์ข้อมูลที่มีจุดข้อมูลในแถวและตัวแปรในคอลัมน์ PCA จะเท่ากับการสลายตัวของค่าเอกฐาน

X=USVUkSkVk,
สถานที่เพื่อลดขนาดเราเก็บไว้เท่านั้น kส่วนประกอบ orthogonal "การหมุนตัวประกอบปัจจัย" ขององค์ประกอบเหล่านี้แสดงถึงการเลือกมุมฉากk×k มดลูก R และเสียบเข้าไปในการสลายตัว:
XUkSkVk=UkRRSkVk=n1UkRRotatedstandardized scoresRSkVk/n1Rotated loadings.
ที่นี่ n1UkRเป็นส่วนประกอบมาตรฐานที่หมุนได้และคำศัพท์ที่สองแสดงถึงการโหลดแบบหมุนเวียนที่ย้าย ความแปรปรวนของแต่ละองค์ประกอบหลังจากการหมุนถูกกำหนดโดยผลรวมของกำลังสองของเวกเตอร์การโหลดที่สอดคล้องกัน ก่อนการหมุนsi2/(n1). หลังจากหมุนมันเป็นอย่างอื่น

ตอนนี้เราพร้อมที่จะกำหนดปัญหาในแง่คณิตศาสตร์แล้ว: รับโหลดที่ไม่ได้รับการป้องกัน L=VkSk/n1หาเมทริกซ์การหมุน R เช่นที่โหลดหมุน LRมีผลรวมกำลังสองเท่ากันในแต่ละคอลัมน์

มาแก้กัน ผลรวมของคอลัมน์ของช่องสี่เหลี่ยมหลังจากการหมุนจะเท่ากับองค์ประกอบในแนวทแยงของ

(LR)LR=RS2n1R.
สิ่งนี้สมเหตุสมผล: การหมุนเพียงแค่กระจายความแปรปรวนของส่วนประกอบซึ่งได้รับมาจากเดิม si2/(n1)ระหว่างพวกเขาตามสูตรนี้ เราจำเป็นต้องแจกจ่ายต่อให้พวกเขาเหล่านั้นทั้งหมดเท่ากับมูลค่าเฉลี่ยของพวกเขาμ.

ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาแบบปิดนี้และอันที่จริงมีวิธีแก้ปัญหาที่แตกต่างกันมากมาย แต่วิธีการแก้ปัญหาสามารถสร้างได้อย่างง่ายดายตามลำดับ:

  1. ใช้องค์ประกอบแรกและ kองค์ประกอบที่ คนแรกมีความแปรปรวนσmax>μ และอันสุดท้ายมีความแปรปรวน σmin<μ.
  2. หมุนสองอันนี้เท่านั้นเพื่อให้ความแปรปรวนของอันแรกเท่ากับ μ. เมทริกซ์การหมุนใน 2D ขึ้นอยู่กับพารามิเตอร์เดียวเท่านั้นθ และง่ายในการเขียนสมการและคำนวณความจำเป็น θ. อันที่จริง
    R2D=(cosθsinθsinθcosθ)
    และหลังจากการแปลงพีซีเครื่องแรกจะได้รับความแปรปรวน
    cos2θσmax+sin2θσmin=cos2θσmax+(1cos2θ)σmin=μ,
    จากที่เราได้รับทันที
    cos2θ=μσminσmaxσmin.
  3. องค์ประกอบแรกเสร็จสิ้นแล้วมันมีความแปรปรวน μ.
  4. ดำเนินการต่อไปยังคู่ถัดไปนำส่วนประกอบที่มีความแปรปรวนที่ใหญ่ที่สุดและอันที่มีความแปรปรวนน้อยที่สุด ไปที่ # 2

สิ่งนี้จะกระจายผลต่างทั้งหมดเท่า ๆ กันตามลำดับ (k1)การหมุนแบบ 2 มิติ การคูณเมทริกซ์การหมุนเหล่านี้ทั้งหมดเข้าด้วยกันจะให้ผลโดยรวมR.


ตัวอย่าง

พิจารณาดังต่อไปนี้ S2/(n1) เมทริกซ์:

(10000060000300001).
ความแปรปรวนเฉลี่ยคือ 5. อัลกอริทึมของฉันจะดำเนินการดังนี้:
  1. ขั้นตอนที่ 1: หมุน PC1 และ PC4 เพื่อให้ PC1 ได้รับความแปรปรวน 5. เป็นผลให้ PC4 ได้รับความแปรปรวน1+(105)=6.

  2. ขั้นตอนที่ 2: หมุน PC2 (ความแปรปรวนสูงสุดใหม่) และ PC3 เพื่อให้ PC2 ได้รับความแปรปรวน 5. เป็นผลให้ PC3 ได้รับความแปรปรวน3+(65)=4.

  3. ขั้นตอนที่ 3: หมุน PC4 (ความแปรปรวนสูงสุดใหม่) และ PC3 เพื่อให้ PC4 ได้รับความแปรปรวน 5. เป็นผลให้ PC3 ได้รับความแปรปรวน4+(61)=5.

  4. เสร็จสิ้น

ฉันเขียนสคริปต์ 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 ตัวแปรที่ไม่เกี่ยวข้องกับความแปรปรวน σi2หาการหมุน (เช่นพื้นฐานมุมฉากใหม่) ที่จะให้ผล k ตัวแปรที่มีความแปรปรวนเท่ากัน (แต่แน่นอนว่าไม่ได้ไม่เกี่ยวข้องกันอีกต่อไป)


ฉันเดาว่าสำหรับองค์ประกอบสองคู่ใด ๆ (คะแนนของพวกเขา) มุมการหมุนจะเท่ากับ 45 องศาเพื่อสร้างความแปรปรวนให้เท่ากัน อย่างไรก็ตามฉันไม่สามารถจินตนาการถึงวิธีการทำงานทั้งหมดด้วย 3+ ส่วนประกอบคู่กัน
ttnphns

1
@feilong ฉันคิดว่าการทำให้ความแตกต่างของส่วนประกอบในแต่ละครั้งเท่ากันนั้นเป็นอัลกอริธึมที่ไม่ดีมาก สิ่งที่ฉันแนะนำคือการเลือกการหมุนเพื่อให้ความแปรปรวนขององค์ประกอบหนึ่งเท่ากับความแปรปรวนทั่วโลก จากนั้นองค์ประกอบนี้ "เสร็จสิ้น" และสามารถจัดการกับส่วนที่เหลือ สิ่งนี้รับประกันได้ว่าจะทำให้ผลต่างทั้งหมดเท่ากันในขั้นตอนที่ จำกัด ดูความคิดเห็นก่อนหน้าของฉันสำหรับตัวอย่าง
อะมีบา

1
@ amoeba คุณพูดถูกนั่นเป็นทางออกที่ดีกว่าและควรทำตามขั้นตอน n-1
feilong

1
@ amoeba ฉันได้เพิ่มการใช้งานขั้นต่ำโดยใช้ Python ฉันแก้ไขส่วนที่คูณเมทริกซ์ทั้งหมดซึ่งอาจใช้เวลานานสำหรับเมทริกซ์ขนาดใหญ่
feilong

1
@amoeba โดยเฉพาะสำหรับส่วนประกอบหลักเป็นไปได้ที่จะประหยัดเวลาได้มากขึ้นโดยการลบส่วนที่ค้นหาค่าสูงสุดและต่ำสุด เราสามารถหมุนส่วนประกอบที่ 1 และ 2 (เพื่อให้องค์ประกอบที่ 1 มีความแปรปรวนเฉลี่ย) จากนั้นก็เป็นองค์ประกอบที่ 2 และ 3 และต่อไปเรื่อย ๆ muเราก็ต้องให้แน่ใจว่าความแปรปรวนรวมของแต่ละคู่มีขนาดใหญ่กว่า
feilong

2

ในคำตอบที่ชาญฉลาดและครอบคลุมของเขา @amoeba ได้แสดงให้เห็นว่าเป็นส่วนหนึ่งของคำตอบ - วิธีที่เราสามารถหมุนตัวแปรที่ไม่เกี่ยวข้องสองตัว (เช่นองค์ประกอบหลักเช่น) เพื่อให้บรรลุความแปรปรวนที่ต้องการสำหรับพวกเขา . ขอตัวแปรมุมฉากX และ Y มีความแปรปรวน σmax2 (ใหญ่กว่า) และ σmin2(เล็กกว่า) ตามลำดับ หมุนไปเรื่อย ๆX จะได้รับการแปรปรวนลดลงโดยพลการ μ2 (ในขณะที่ Yดังนั้นจะกลายเป็นความแปรปรวน σmax2+σmin2μ2)

@amoeba แสดงสูตรที่เราสามารถคำนวณมุมการหมุนได้ cosθ:

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

แต่ไม่ได้แสดงให้เห็นว่าสมการนี้มาจากไหน อาจคิดว่ามันชัดเจนโดยไม่มีคำอธิบาย ชัดเจนหรือไม่ฉันเชื่อว่ามันคุ้มค่าที่จะอธิบาย - บางวิธี คำตอบของฉันนำเสนอทางเดียว

ดังนั้นเรามีรูปวงรีข้อมูลที่เป็นศูนย์กลางในพื้นที่ของตัวแปรที่ไม่เกี่ยวข้อง X และ Y. เราต้องหมุนแกนตามมุมθ. จุดข้อมูลในคลาวด์ (เช่นแสดงเป็นจุดสีเขียวบนภาพ) ด้วยX ประสานงาน x จะมีพิกัดนี้เป็น x หลังจากการหมุน

ภาพประกอบของการหมุน

สังเกตว่าเส้นโครงของพิกัดนั้น x บากบนแกนหมุนX ได้รับจาก x=xcosθ(cathetus เป็นด้านตรงข้ามมุมฉากและมุมระหว่างพวกเขา) สังเกตด้วยว่าx น้อยกว่า x โดยการตัดความยาว xx คำนวณได้จากการประสานงาน y: ysinθ(cathetus อื่นและด้านตรงข้ามมุมฉาก) และดังนั้น

x=x(xx)=xcosθysinθ

เรารู้ (ดูจุดเริ่มต้น) ความแปรปรวน (หรือผลบวกของกำลังสอง) ของตัวแปรสองตัวและความแปรปรวน (ผลรวมของกำลังสอง) μ2 ของ X. จากนั้นจะเป็นดังนี้:

μ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θ, ตามที่ @amoeba แสดงขึ้นและทำการหมุน


2
+1 ฉันไม่คิดว่ามันชัดเจน (ไม่ใช่) แต่ฉันคิดว่ามันง่ายต่อการตรวจสอบ :-) เราสามารถแสดงด้วยพีชคณิตโดยตรงเขียนลง (ตามคำตอบของฉัน)
(cosθsinθsinθcosθ)(σmax200σmin2)(cosθsinθsinθcosθ),
และคำนวณองค์ประกอบบนซ้ายของผลิตภัณฑ์ แน่นอนว่ามีเหตุผลแบบเดียวกันที่แสดงออกมาแตกต่างกัน ขอบคุณ!
อะมีบา

และฉันคิดว่าคำอธิบายทางเรขาคณิตและการคำนวณ "โดยตรง" ของคุณ (ไม่มีเมทริกซ์) นั้นง่ายต่อการเข้าใจและมีประโยชน์มากในการพัฒนาสัญชาติญาณที่เหมาะสม
อะมีบา

0

ถ้าฉันตีความสิ่งต่าง ๆ ได้อย่างถูกต้องคุณหมายถึงองค์ประกอบหลักตัวแรก (eigenvalue) อธิบายความแปรปรวนส่วนใหญ่ในข้อมูล สิ่งนี้อาจเกิดขึ้นเมื่อวิธีการบีบอัดของคุณเป็นแบบเชิงเส้น อย่างไรก็ตามอาจมีการขึ้นต่อกันแบบไม่เชิงเส้นในพื้นที่คุณลักษณะของคุณ

TL / DR: PCA เป็นวิธีการเชิงเส้น ใช้ Autoencoders (ไม่ใช่เชิงเส้น PCA) สำหรับการลดขนาด หากส่วนการเรียนรู้ของเครื่องได้รับการดูแลการเรียนรู้จากนั้นเพียงแค่ตรวจสอบฟังก์ชั่นการสูญเสียของคุณในขณะที่ปรับพารามิเตอร์ (ไฮเปอร์) สำหรับเครื่องสร้างรหัสอัตโนมัติ ด้วยวิธีนี้คุณจะได้รับข้อมูลต้นฉบับที่ถูกบีบอัดที่ดียิ่งขึ้น

นี่คือตัวอย่างของ scikit ที่พวกเขาทำการค้นหากริดเพื่อค้นหาจำนวนองค์ประกอบหลักที่เหมาะสมที่จะเก็บ (พารามิเตอร์ไฮเปอร์) โดยใช้ PCA ในที่สุดพวกเขาก็ใช้การถดถอยโลจิสติกในพื้นที่มิติด้านล่าง: http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py

Protip: ตัวเข้ารหัสอัตโนมัติไม่มีโซลูชันแบบปิด (afaik) ดังนั้นหากบริบทของคุณคือการส่งกระแสข้อมูลหมายความว่าคุณสามารถอัปเดต autoencoder ของคุณอย่างต่อเนื่อง ด้วย pca คุณจะต้องฝึกฝนโหมดแบทช์ใหม่เป็นครั้งคราวเมื่อมีข้อมูลใหม่เข้ามา

เพื่อให้คุณสมบัติบางอย่าง "น้ำหนัก" มากขึ้นดูการทำให้เป็นปกติ (ฉันจะเริ่มจากบรรทัดฐานhttps://en.wikipedia.org/wiki/Norm_(mathematics ) คุณอาจประหลาดใจว่าการถดถอยแบบลอจิสติกที่คล้ายกันนั้นมีผลกับ perceptron อย่างไร


ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามของ OP อย่างไร คำตอบของคุณดูเหมือนจะไม่เกี่ยวข้องกับคำถามทั้งหมด
อะมีบา

ดังนั้นฉันสงสัยว่า: มีวิธีง่าย ๆ ในการแยกความแปรปรวนและแบ่งปันกับพีซีที่มีความแปรปรวนน้อยกว่าหรือไม่ OP ต้องการลดขนาด ฉันเสนอทางเลือกอื่นเพื่อแก้ปัญหาของเขาเนื่องจากท้ายที่สุดสิ่งที่ OP ต้องการไม่รับประกันว่าจะส่งผลให้มีประสิทธิภาพที่ดีขึ้นเว้นแต่ว่าจะวัดประสิทธิภาพ การทำงานในพื้นที่ฮิลแบร์ต / พื้นที่ปกตินั้นไม่ได้รับประกันผลลัพธ์ที่ดีกว่า การวัดประสิทธิภาพนำไปสู่ผลลัพธ์ที่ดีกว่า
shuriken x blue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.