ทำไม LIK ของ Scikit-Learn LDA จึงทำงานไม่ถูกต้องและมันคำนวณ LDA ผ่าน SVD ได้อย่างไร


26

ฉันใช้การวิเคราะห์เชิงเส้นตรง (LDA) จากไลบรารี่การscikit-learnเรียนรู้ของเครื่องจักร (Python) สำหรับการลดมิติข้อมูลและอยากรู้เกี่ยวกับผลลัพธ์เล็กน้อย ฉันสงสัยว่าตอนนี้สิ่งที่ LDA scikit-learnกำลังทำอยู่เพื่อให้ผลลัพธ์ดูแตกต่างจากเช่นวิธีการด้วยตนเองหรือ LDA ที่ทำใน R มันจะดีถ้ามีใครให้ข้อมูลเชิงลึกที่นี่

สิ่งที่สำคัญที่สุดคือการscikit-plotแสดงให้เห็นถึงความสัมพันธ์ระหว่างตัวแปรสองตัวที่ควรมีความสัมพันธ์ 0

สำหรับการทดสอบฉันใช้ชุดข้อมูลของ Iris และตัวจำแนกเชิงเส้น 2 ตัวแรกมีลักษณะดังนี้:

IMG-1 LDA ผ่าน scikit เรียนรู้

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้สอดคล้องกับผลลัพธ์ที่พบในเอกสาร scikit-Learn ที่นี่

ตอนนี้ฉันผ่าน LDA ทีละขั้นตอนและได้ประมาณการที่แตกต่างกัน ฉันลองวิธีที่แตกต่างกันเพื่อค้นหาว่าเกิดอะไรขึ้น:

IMG-2 LDA บนข้อมูลดิบ (ไม่มีการจัดกึ่งกลางไม่มีมาตรฐาน)

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือแนวทางทีละขั้นตอนถ้าฉันสร้างมาตรฐาน (การทำให้เป็นมาตรฐาน z-score; ความแปรปรวนของหน่วย) ข้อมูลก่อน ฉันทำสิ่งเดียวกันโดยมีค่าเฉลี่ยอยู่กึ่งกลางเท่านั้นซึ่งควรนำไปสู่ภาพการฉายภาพแบบเดียวกัน (และสิ่งที่มันทำ)

IMG-3 LDA ทีละขั้นตอนหลังจากการกำหนดค่าเฉลี่ยกึ่งกลางหรือกำหนดมาตรฐาน

ป้อนคำอธิบายรูปภาพที่นี่

IMG-4 LDA ใน R (การตั้งค่าเริ่มต้น)

LDA ใน IMG-3 ที่ฉันจัดกึ่งกลางข้อมูล (ซึ่งจะเป็นวิธีที่ต้องการ) ก็ดูเหมือนกันกับที่ฉันพบในโพสต์โดยคนที่ทำ LDA ใน R ป้อนคำอธิบายรูปภาพที่นี่


รหัสสำหรับการอ้างอิง

ฉันไม่ต้องการวางรหัสทั้งหมดที่นี่ แต่ฉันได้อัปโหลดเป็นสมุดบันทึก IPythonที่นี่แบ่งออกเป็นหลายขั้นตอนที่ฉันใช้ (ดูด้านล่าง) สำหรับการฉาย LDA

  1. ขั้นตอนที่ 1: การคำนวณ d มิติเวกเตอร์เฉลี่ย
    mi=1nixDinxk
  2. ขั้นตอนที่ 2: การคำนวณเมทริกซ์การกระจาย

    2.1 เมทริกซ์กระจายภายในคลาสถูกคำนวณโดยสมการต่อไปนี้:S W = c i = 1 S i = c i = 1 n xD ฉัน ( x - m i )SW

    SW=i=1cSi=i=1cxDin(xmi)(xmi)T

    2.2 เมทริกซ์กระจายระหว่างคลาสคำนวณโดยสมการต่อไปนี้: โดยที่คือค่าเฉลี่ยโดยรวมSB

    SB=i=1cni(mim)(mim)T
    m
  3. ขั้นตอนที่ 3 การแก้ปัญหาค่าลักษณะเฉพาะทั่วไปสำหรับเมทริกซ์SW1SB

    3.1 การเรียงลำดับไอเก็นผู้ชำนาญการโดยการลดค่าลักษณะเฉพาะ

    3.2 การเลือกeigenvector kกับค่าลักษณะเฉพาะที่ใหญ่ที่สุด การรวมสองไอคิวนิวเดอเรเตอร์เข้ากับค่าไอควิชันสูงสุดเพื่อสร้างมิติไอเกนวีคมิติเมทริกซ์d×kW

  4. ขั้นตอนที่ 5: การแปลงตัวอย่างลงในพื้นที่ย่อยใหม่

    y=WT×x.

ฉันไม่ได้ไปผ่านที่จะมองหาที่แตกต่างกัน แต่คุณสามารถดูว่าสิ่งที่ scikit เรียนรู้ที่จะทำในแหล่งที่มา
Dougal

ดูเหมือนว่าพวกเขายังเป็นมาตรฐาน (อยู่ตรงกลางแล้วปรับขนาดโดยการหารด้วยส่วนเบี่ยงเบนมาตรฐาน) สิ่งนี้ฉันคาดหวังว่าผลลัพธ์จะคล้ายกับผลลัพธ์ในแผน 3 (และ R) ของฉัน ... hmm

แปลก: พล็อตที่คุณได้รับพร้อม scikit (และพล็อตที่แสดงในเอกสารประกอบ) ไม่สมเหตุสมผล LDA ให้ผลการคาดการณ์ที่มีศูนย์สหสัมพันธ์อยู่เสมอ แต่เห็นได้ชัดว่ามีความสัมพันธ์ที่ดีมากระหว่างการคาดคะเนของ Scikit บนแกนที่แยกแยะได้ 1 และ 2
อะมีบาพูดว่า Reinstate Monica

@ameoba ใช่ฉันก็คิดเช่นกัน สิ่งที่แปลกก็คือพล็อตเดียวกันที่ฉันแสดงให้ scikit อยู่ในเอกสารตัวอย่าง: scikit-learn.org/stable/auto_examples/decomposition/ ......นั่นทำให้ฉันคิดว่าการใช้ scikit นั้นถูกต้อง แต่มันมีบางสิ่งที่แปลก เกี่ยวกับฟังก์ชั่น LDA

@SebastianRaschka: ใช่ฉันสังเกตเห็น มันแปลกจริง ๆ อย่างไรก็ตามโปรดสังเกตว่าการแปลง LDA แรกของคุณเอง (ไม่ใช่ scikit) ก็แสดงให้เห็นถึงความสัมพันธ์ที่ไม่เป็นศูนย์และด้วยเหตุนี้บางสิ่งก็ต้องผิดด้วยเช่นกัน คุณจัดกึ่งกลางข้อมูลหรือไม่ การฉายบนแกนที่สองดูเหมือนจะไม่มีค่าเฉลี่ย
อะมีบาพูดว่า Reinstate Monica

คำตอบ:


20

อัปเดต:ด้วยการสนทนานี้scikit-learnได้รับการอัปเดตและทำงานอย่างถูกต้องในขณะนี้ รหัสที่มา LDA มันสามารถพบได้ที่นี่ ปัญหาเดิมเกิดจากข้อผิดพลาดเล็กน้อย (ดูการสนทนา GitHub นี้ ) และคำตอบของฉันไม่ได้ชี้ไปที่มันอย่างถูกต้อง (ขอโทษสำหรับความสับสนที่เกิดขึ้น) ในฐานะที่เป็นทั้งหมดที่ไม่ได้เรื่องอีกต่อไป (ได้รับการแก้ไขข้อผิดพลาด) ผมแก้ไขคำตอบของฉันที่จะมุ่งเน้นไปที่วิธีการ LDA จะสามารถแก้ไขได้ผ่านทาง SVD scikit-learnซึ่งเป็นขั้นตอนวิธีการเริ่มต้นใน


หลังจากกำหนดเมทริกซ์การกระจัดกระจายภายในและระหว่างคลาสและการคำนวณ LDA มาตรฐานดังที่ระบุไว้ในคำถามของคุณคือการใช้ eigenvectorsเป็นแกนจำแนก ( ดูเช่นที่นี่ ) อย่างไรก็ตามแกนเดียวกันสามารถคำนวณได้ในวิธีที่แตกต่างกันเล็กน้อยโดยใช้ประโยชน์จากไวท์เทนนิ่งเมทริกซ์:ΣWΣBΣW1ΣB

  1. Compute1/2} นี่คือการเปลี่ยนแปลงการฟอกสีฟันด้วยความเคารพต่อความแปรปรวนร่วมในระดับชั้นเรียน (ดูคำตอบที่เชื่อมโยงของฉันสำหรับรายละเอียด)ΣW1/2

    โปรดทราบว่าถ้าคุณมีการสลายตัวไอดังนั้น\ โปรดทราบว่ามีการคำนวณเดียวกันโดยทำ SVD ของพูลภายในคลาสข้อมูล:-1/2}ΣW=USUΣW1/2=US1/2UXW=ULVΣW1/2=UL1U

  2. ค้นหา eigenvectors ของให้เราเรียกพวกเขา *ΣW1/2ΣBΣW1/2A

    โปรดทราบอีกครั้งว่าเราสามารถคำนวณได้โดยการทำ SVD ของ data-ระหว่างคลาสที่ถูกแปลงด้วยนั่นคือระหว่างข้อมูลในคลาสที่ขาวขึ้นตามระดับภายใน แปรปรวนXBΣW1/2

  3. จำแนกแกนจะได้รับโดยคือโดยแกนหลักของข้อมูลเปลี่ยนเปลี่ยนอีกครั้งAΣW1/2A

    แน่นอนถ้าเป็นของเมทริกซ์ข้างต้นแล้วและทวีคูณจากทางซ้ายโดยและกำหนดเราได้รับทันที :a

    ΣW1/2ΣBΣW1/2a=λa,
    ΣW1/2a=ΣW1/2a
    ΣW1ΣBa=λa.

โดยสรุป LDA นั้นเทียบเท่ากับการฟอกสีเมทริกซ์ของค่าเฉลี่ยของคลาสด้วยความเคารพต่อความแปรปรวนร่วมในระดับเดียวกันทำ PCA ตามค่าเฉลี่ยของชั้นเรียนและเปลี่ยนแกนหลักที่เป็นผลลัพธ์กลับเข้าไปในพื้นที่เดิม

สิ่งนี้ชี้ให้เห็นเช่นในองค์ประกอบของการเรียนรู้ทางสถิติหัวข้อ 4.3.3 ในscikit-learnวิธีนี้เป็นวิธีเริ่มต้นในการคำนวณ LDA เนื่องจาก SVD ของเมทริกซ์ข้อมูลมีเสถียรภาพมากกว่าการสลายตัว eigen ของเมทริกซ์ความแปรปรวนร่วม

โปรดทราบว่าเราสามารถใช้การแปลงไวท์เทนนิ่งแทนและทุกอย่างจะยังคงเหมือนเดิม ในใช้ (แทนที่จะเป็นและ มันใช้งานได้ดี (ตรงกันข้ามกับสิ่งที่เขียนไว้ในคำตอบของฉัน) L - 1 UU L - 1 UΣW1/2scikit-learn L1UUL1U


1
ขอบคุณสำหรับคำตอบที่ดีนี้ ฉันขอขอบคุณที่คุณใช้เวลาเขียนมันอย่างดี บางทีคุณสามารถพูดถึงมันในการสนทนากับ GitHub; ฉันแน่ใจว่าจะเป็นประโยชน์ในการแก้ไข LDA ใน sci-kit รุ่นถัดไป

@SebastianRaschka: ฉันไม่มีบัญชีใน GitHub แต่ถ้าคุณต้องการคุณสามารถให้ลิงค์ไปยังกระทู้นี้ได้
อะมีบาพูดว่า Reinstate Monica

@amoeba: ตำรามักจะอธิบาย LDA ในขณะที่คุณไม่ได้ - ค่าการสลายตัวของ eigenvalue\ อยากรู้อยากเห็นการใช้งาน LDA จำนวนหนึ่งที่ฉันรู้จักใช้วิธีการที่แตกต่างกัน แกนของพวกเขาจะเวกเตอร์ไปยังหมายถึงการเรียนเปลี่ยนกับ1} โซลูชัน LDA ของคุณเป็นพื้นฐานแบบเวกเตอร์เหล่านี้ LDA ของ Scikit-learn ให้ผลลัพธ์เหมือนกับการใช้งานเหล่านี้ดังนั้นฉันจึงไม่คิดว่ามีข้อผิดพลาดเกิดขึ้นจริง Σ - 1 WΣW1ΣBΣW1
kazemakase

สำหรับการอ้างอิงนี่คือการใช้งานที่ฉันกำลังพูดถึง: sourceforge.net/p/mlpy/code/ci/default/tree/mlpy/da.py#l24 github.com/sccn/BCILAB/blob/master/code/machine_learning / … mathworks.com
kazemakase

2
@kazemakase: ดีแน่นอนถ้ามีเพียงสองชั้นแล้วมีอันดับ 1 และทุกอย่างที่ช่วยลดความยุ่งยากมากเป็นเพียงวิคเตอร์ของจะได้รับจากโดยที่หมายถึงคลาส ฉันเดาว่าเป็นสิ่งที่คุณหมายถึงก่อนหรือไม่ สิ่งนี้ได้รับการกล่าวถึงเป็นอย่างดีเช่นในตำราเรียน ML ของบิชอปมาตรา 4.1.4 แต่การทำให้เป็นมาตรฐานของคลาสมากขึ้นนั้นจำเป็นต้องมีการวิเคราะห์ไอเก็น (Ibid., 4.1.6) นอกจากนี้รหัส scikit ของ (ว่าที่เราจะคุยที่นี่!) ไม่ใช้ SVD สองจริง Σ - 1 W Σ B Σ - 1 W ( μ 1 - μ 2 ) μ iΣBΣW1ΣBΣW1(μ1μ2)μi
อะมีบาพูดว่า Reinstate Monica

3

เพียงเพื่อปิดคำถามนี้ปัญหาที่หารือกับ LDA ได้รับการแก้ไขใน scikit เรียนรู้0.15.2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.