SVD และ PCA มีข้อมูลขนาดใหญ่ได้อย่างไร


29

ฉันมีชุดข้อมูลขนาดใหญ่ (ประมาณ 8GB) ฉันต้องการใช้การเรียนรู้ของเครื่องเพื่อวิเคราะห์ ดังนั้นฉันคิดว่าฉันควรใช้ SVD แล้ว PCA เพื่อลดมิติข้อมูลเพื่อประสิทธิภาพ อย่างไรก็ตาม MATLAB และ Octave ไม่สามารถโหลดชุดข้อมูลขนาดใหญ่ดังกล่าวได้

เครื่องมือใดที่ฉันสามารถใช้เพื่อทำ SVD ด้วยข้อมูลจำนวนมาก


สวัสดีและยินดีต้อนรับสู่ DS! บางทีคุณอาจอธิบายรายละเอียดเล็กน้อยบนชุดข้อมูลของคุณ คุณมีกี่แถวและคอลัมน์? สิ่งนี้อาจส่งผลกระทบต่อโซลูชันที่เป็นไปได้
S. Kolassa - Reinstate Monica

23711341 แถวและ 8 คอลัมน์ ฉันพยายามลบ 1-2 คอลัมน์ ดูเหมือนว่าพวกเขาจะไม่เกี่ยวข้องกับปัญหาของฉัน
David S.

คุณควรสุ่มแถวก่อนคอลัมน์ที่นี่ มีเหตุผลที่คุณไม่สามารถสุ่มตัวอย่างแถวเพื่อลดขนาดข้อมูลหรือไม่ ฉันสมมติว่าแถวที่นี่เกี่ยวข้องกับผู้ใช้หรือบางอย่าง
cwharland

ขออภัยถ้าฉันไม่ได้ทำให้ตัวเองชัดเจน เป้าหมายของฉันคือการทำ PCA ฉันคิดว่า SVD ในข้อมูลตัวอย่างไม่สามารถช่วยฉันในการทำ PCA ใช่ไหม
David S.

PCA มักจะนำมาใช้โดยการคำนวณ SVD บนเมทริกซ์ความแปรปรวนร่วม การคำนวณเมทริกซ์ความแปรปรวนร่วมนั้นเป็นงานคู่ขนานที่น่าอับอายดังนั้นจึงควรปรับขนาดตามจำนวนเรคคอร์ดได้อย่างง่ายดาย
Anony-Mousse

คำตอบ:


41

ก่อนอื่นการลดขนาดจะถูกนำมาใช้เมื่อคุณมีหลายมิติร่วมกันและต้องการลดขนาดของปัญหาด้วยการหมุนจุดข้อมูลไปสู่พื้นฐานมุมฉากใหม่และใช้แกนที่มีความแปรปรวนมากที่สุดเท่านั้น ด้วยตัวแปร 8 ตัว (คอลัมน์) พื้นที่ของคุณอยู่ในระดับต่ำอยู่แล้วการลดจำนวนตัวแปรต่อไปจึงไม่น่าจะแก้ปัญหาทางเทคนิคกับขนาดหน่วยความจำ แต่อาจส่งผลต่อคุณภาพของชุดข้อมูลเป็นจำนวนมาก ในกรณีที่เป็นรูปธรรมของคุณมีแนวโน้มมากขึ้นที่จะดูการเรียนรู้ออนไลน์วิธีการ การพูดอย่างคร่าวๆแทนที่จะทำงานกับชุดข้อมูลทั้งหมดวิธีการเหล่านี้มีส่วนเล็ก ๆ ของพวกเขา (มักเรียกว่า "ชุดเล็ก") ในแต่ละครั้งและสร้างแบบจำลองเพิ่มขึ้นทีละส่วน (ส่วนตัวแล้วฉันชอบตีความคำว่า "ออนไลน์" เป็นการอ้างอิงถึงแหล่งข้อมูลที่ยาวอย่างไม่สิ้นสุดจากอินเทอร์เน็ตเช่นฟีด Twitter ซึ่งคุณไม่สามารถโหลดชุดข้อมูลทั้งหมดได้ในครั้งเดียว)

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

มีการสังเกตมากเกินไป (n >> m)

เมื่อคุณมีข้อสังเกตมากเกินไปแต่จำนวนของตัวแปรที่มีตั้งแต่ขนาดเล็กถึงปานกลางคุณสามารถสร้างเมทริกซ์ความแปรปรวนขึ้นเรื่อย ๆ อันที่จริง PCA ทั่วไปประกอบด้วยการสร้างเมทริกซ์ความแปรปรวนร่วมของขนาดm x mและใช้การสลายตัวของค่าเอกพจน์กับมัน ด้วยm = 1,000 ตัวแปรชนิด float64 เมทริกซ์ความแปรปรวนร่วมมีขนาด 1,000 * 1,000 * 8 ~ 8Mb ซึ่งเหมาะกับหน่วยความจำและอาจใช้กับ SVD ได้อย่างง่ายดาย ดังนั้นคุณจึงต้องการเพียงเพื่อสร้างเมทริกซ์ความแปรปรวนร่วมโดยไม่ต้องโหลดชุดข้อมูลทั้งหมดลงในหน่วยความจำ - งานเวไนยสวย

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

มีตัวแปรมากเกินไป (n << m)

ในอีกทางหนึ่งบางครั้งเมื่อคุณมีตัวแปรมากเกินไปเมทริกซ์ความแปรปรวนร่วมนั้นจะไม่เข้ากับหน่วยความจำ เช่นถ้าคุณทำงานกับภาพ 640x480 ทุกการสังเกตมีตัวแปร 640 * 480 = 307200 ซึ่งส่งผลให้เมทริกซ์ความแปรปรวนร่วม 703Gb! นั่นไม่ใช่สิ่งที่คุณต้องการเก็บไว้ในหน่วยความจำของคอมพิวเตอร์หรือในหน่วยความจำของคลัสเตอร์ ดังนั้นเราต้องลดขนาดโดยไม่ต้องสร้างเมทริกซ์ความแปรปรวนร่วมเลย

วิธีการโปรดของฉันสำหรับการทำมันเป็นแบบสุ่มฉาย ในระยะสั้นหากคุณมีชุดXขนาดn x เมตรคุณสามารถคูณด้วยบางเบาบางเมทริกซ์แบบสุ่มRขนาดเมตร x k (กับk << ม. ) และได้รับเมทริกซ์ใหม่X'ที่มีขนาดเล็กกว่ามากn x kมีคุณสมบัติใกล้เคียงกับคุณสมบัติดั้งเดิมโดยประมาณ ทำไมมันทำงาน ทางที่ดีคุณควรจะรู้ว่าจุดมุ่งหมาย PCA ในการค้นหาการตั้งค่าของแกนมุมฉาก (องค์ประกอบหลัก) และโครงการข้อมูลของคุณบนแรกkของพวกเขา. ปรากฎว่าเวกเตอร์สุ่มเบาบางเกือบจะตั้งฉากและดังนั้นจึงอาจใช้เป็นพื้นฐานใหม่

และแน่นอนว่าคุณไม่จำเป็นต้องคูณชุดข้อมูลทั้งหมดXด้วยR - คุณสามารถแปลการสังเกตทุกxเป็นพื้นฐานใหม่แยกจากกันหรือในชุดมินิ

นอกจากนี้ยังมีขั้นตอนวิธีการที่เรียกว่าค่อนข้างคล้ายสุ่ม SVD ฉันไม่ได้มีประสบการณ์จริงใด ๆ กับมัน แต่คุณสามารถค้นหาโค้ดตัวอย่างที่มีคำอธิบายที่นี่


ในฐานะที่เป็นบรรทัดล่างนี่คือรายการตรวจสอบสั้น ๆ สำหรับการลดมิติข้อมูลของชุดข้อมูลขนาดใหญ่:

  1. หากคุณมีหลายมิติ (ตัวแปร) ไม่มากนักเพียงแค่ใช้อัลกอริทึมการเรียนรู้ออนไลน์
  2. หากมีข้อสังเกตมากมาย แต่มีตัวแปรจำนวนปานกลาง (เมทริกซ์ความแปรปรวนร่วมพอดีกับหน่วยความจำ) ให้สร้างเมทริกซ์ทีละน้อยและใช้ SVD ปกติ
  3. หากจำนวนตัวแปรสูงเกินไปให้ใช้อัลกอริทึมแบบเพิ่มหน่วย

3
โดยรวมแล้วฉันชอบคำตอบของคุณ แต่ประโยคเปิดไม่ถูกต้อง PCA ไม่เหมาะสำหรับหลาย ๆ มิติที่มีความแปรปรวนต่ำ ค่อนข้างเหมาะสำหรับหลาย ๆ มิติที่มีความแปรปรวนแบบสหสัมพันธ์ สำหรับชุดข้อมูลที่กำหนดความแปรปรวนอาจสูงในทุกมิติ แต่ตราบใดที่มีความแปรปรวนร่วมสูง PCA ยังคงสามารถลดมิติที่สำคัญได้
bogatron

1
@batatron: จับได้ดีขอบคุณ ในความเป็นจริงฉันหมายถึงความแปรปรวนสูง / ต่ำในบางมิติซึ่งอาจไม่ใช่แบบดั้งเดิม เช่นในภาพนี้ขนาดเหล่านี้ถูกกำหนดโดยลูกศร 2 ตัวไม่ใช่แกน x / y ดั้งเดิม PCA พยายามค้นหาแกนใหม่เหล่านี้และเรียงลำดับตามค่าความแปรปรวนตามแต่ละแกน อย่างไรก็ตามในขณะที่คุณชี้ให้เห็นมันเป็นถ้อยคำที่ไม่ดีดังนั้นฉันพยายามที่จะปฏิรูปความคิดของฉัน หวังว่าตอนนี้มันชัดเจนยิ่งขึ้น
แฟน

นั่นทำให้รู้สึกถึงฉัน +1
bogatron

7

ไม่รำคาญ

กฎข้อแรกของการเขียนโปรแกรมซึ่งใช้กับวิทยาศาสตร์ข้อมูล: ให้ทุกอย่างทำงานด้วยปัญหาการทดสอบขนาดเล็ก

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

นอกจากนี้คุณไม่ต้องการใช้ svd กับคอลัมน์เพียง 8 คอลัมน์: คุณใช้มันเมื่อคุณมีคอลัมน์จำนวนมาก


1
+1 สำหรับคุณไม่ต้องการใช้ svd กับเพียง 8 คอลัมน์: คุณใช้มันเมื่อคุณมีคอลัมน์จำนวนมาก
S. Kolassa - Reinstate Monica

6

PCA มักจะนำมาใช้โดยการคำนวณ SVD บนเมทริกซ์ความแปรปรวนร่วม

การคำนวณเมทริกซ์ความแปรปรวนร่วมนั้นเป็นงานคู่ขนานที่น่าอายดังนั้นมันจึงปรับขนาดเชิงเส้นตามจำนวนของเร็กคอร์ดและไม่สำคัญที่จะแจกจ่ายบนเครื่องหลายเครื่อง!

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

สิ่งต่าง ๆ จะแตกต่างกันเมื่อคุณมีตัวแปรจำนวนมาก แต่สำหรับระบบ 8 GB คุณควรจะสามารถรัน PCA ในหน่วยความจำสูงสุดถึง 20,000 ภาพในไลบรารี BLAS แต่คุณอาจพบปัญหาที่ PCA ไม่ใช่ทุกสิ่งที่เชื่อถือได้อีกต่อไปเพราะมีหลายองศาอิสระ ในคำอื่น ๆ มันทับได้อย่างง่ายดาย ฉันเห็นคำแนะนำว่ามีอย่างน้อย 10 * d * d บันทึก (หรือเป็น d ^ 3) ดังนั้นสำหรับ 10,000 ส่วนข้อมูลคุณควรมีอย่างน้อยหนึ่งพันล้านรายการ (จาก 10,000 ส่วน ... นั่นเป็นจำนวนมาก!) เพื่อให้ผลลัพธ์มีความน่าเชื่อถือทางสถิติ


1

แม้ว่าคุณอาจพบเครื่องมือบางอย่างที่จะช่วยให้คุณสามารถทำได้บนเครื่องเดียว แต่คุณกำลังเข้าสู่ช่วงที่ควรพิจารณาเครื่องมือ "ข้อมูลขนาดใหญ่" เช่น Spark โดยเฉพาะอย่างยิ่งถ้าคุณคิดว่าชุดข้อมูลของคุณอาจเติบโต Spark มีส่วนประกอบที่เรียกว่า MLlib ซึ่งรองรับ PCA และ SVD เอกสารที่มีตัวอย่าง


1

เรานำ SVD ไปใช้กับชุดข้อมูลขนาดใหญ่โดยใช้ PySpark เรายังเปรียบเทียบความสอดคล้องกันในแพ็คเกจต่างๆ นี่คือลิงค์


0

ฉันจะแนะนำไพ ธ อนถ้าคุณประเมินไฟล์อย่างเกียจคร้านคุณจะมีหน่วยความจำขนาดเล็กมากและจำนวนมาก / scipy ทำให้คุณสามารถเข้าถึงเครื่องมือทั้งหมดของ Octave / Matlab ได้

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