การแก้ระบบสมการเชิงเส้นโดยใช้เมทริกซ์และ Python

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

ระบบสมการเชิงเส้นใน ML

งานมาตรฐานที่วิธี ML แก้ไขโดยทั่วไปสามารถแสดงได้ดังนี้:

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

ดังที่เราจำได้จากคณิตศาสตร์ ฟังก์ชันเส้นสามารถแสดงเป็น:

นี่คือตัวอย่างมิติเดียว และสำหรับ 2 มิติขึ้นไป:

ตอนนี้หากเราถือว่า x1, x2 และอื่นๆ ของเราเป็นคุณลักษณะของเราและ f เป็นค่าเป้าหมาย เราสามารถเขียนชุดข้อมูลการเรียนรู้เริ่มต้นของเราใหม่ให้อยู่ในรูปของสมการเชิงเส้น:

และตอนนี้ โดยพื้นฐานแล้ว เราแค่ต้องเขียนมันเป็นระบบสมการเชิงเส้น แล้วแก้มัน:

หลังจากแก้ไขแล้ว เราจะได้ค่าเฉพาะ a1, a2 … (หรือที่เรียกว่าน้ำหนัก) ซึ่งเราจะใช้ในฟังก์ชันเชิงเส้นของเราเพื่อค้นหาค่าเป้าหมายที่ไม่รู้จัก (f) ที่มีค่าคุณลักษณะที่ทราบ (x) และฟังก์ชันสุดท้ายที่มีน้ำหนักจากการคำนวณคือสิ่งที่เรียกว่า โมเดล ML

บันทึกสดจริง

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

วิศวกร ML ยังคงจัดการกับระบบสมการเชิงเส้น แต่อยู่ในระดับที่แตกต่างกัน แทนที่จะแก้ฟังก์ชันค่าเป้าหมายโดยตรงของสมการคุณลักษณะ เราจะแก้สมการที่ช่วยเราลดสิ่งที่เรียกว่าข้อผิดพลาด (ระยะห่างระหว่างค่าเป้าหมายจริงกับค่าที่คำนวณตามน้ำหนักที่กำหนด) เช่น. ถ้าเราใช้ MSE ตามมาตรฐานแบบยุคลิด:

ฉันจะเขียนเพิ่มเติมเกี่ยวกับการถดถอยเชิงเส้นและการปรับฟังก์ชันข้อผิดพลาดให้เหมาะสมในภายหลัง และสำหรับตอนนี้ เรามาลืมเรื่องนี้เสียก่อน และกลับสู่ระบบสมการ และวิธีการใช้เมทริกซ์เพื่อแก้ปัญหาเหล่านั้น

รูปแบบเมทริกซ์ของระบบสมการเชิงเส้น

แล้วเมทริกซ์เกี่ยวข้องกับระบบสมการเชิงเส้นอย่างไร? สมมติว่าเรามีระบบสมการเชิงเส้นที่ต้องแก้ดังนี้:

ตอนนี้เรามาสร้างเมทริกซ์ของน้ำหนัก (ตัวเลขเหล่านั้นก่อน x1…3 ของเรา) และเวกเตอร์สองตัว — X และค่าเป้าหมาย Y:

ดังที่เราทราบ "เมทริกซ์สามารถคูณได้" นั่นคือสาเหตุที่การเขียนสิ่งต่อไปนี้ในรูปของเมทริกซ์ (เวกเตอร์) ก็เหมือนกับการเขียนระบบสมการเชิงเส้นเริ่มต้นของเรา:

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

การหาคำตอบโดยใช้เมทริกซ์ผกผัน

พีชคณิตเชิงเส้นช่วยให้เราหาคำตอบในรูปแบบเมทริกซ์ได้อย่างง่ายดาย:

โดยที่ w แปลกๆ ที่มี -1 นี้เรียกว่า เมทริกซ์ผกผัน สามารถพบได้ง่ายด้วย Python และ X vector หลังจากคูณเมทริกซ์กลับด้านด้วย Y:

ที่นี่เราพบ w_inv โดยใช้วิธี np.linalg.inv และเมทริกซ์ w_inv คูณด้วย Y (ซึ่งเป็นเวกเตอร์) เพื่อให้ได้ผลลัพธ์ X เวกเตอร์ สคริปต์นี้ให้สิ่งต่อไปนี้แก่เรา:

[[1.]
 [2.]
 [3.]]

ซึ่งเป็นเวกเตอร์ X ที่คำนวณได้:

วิธีการกำจัดแบบเกาส์เซียน

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

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

กระบวนการแปลงหากทำหลายครั้งและอนุญาตให้ทำสิ่งต่อไปนี้:

  • คูณแถวใด ๆ ด้วยตัวเลขใดก็ได้ (ยกเว้นศูนย์แน่นอน)
  • เพิ่มแถวใด ๆ ลงในแถวอื่น ๆ
  • สลับแถวใดก็ได้

อีกสิ่งหนึ่งที่วิธีเกาส์เซียนขอให้เราทำคือการผนวกเวกเตอร์ Y ของเราเข้ากับเมทริกซ์ w ของเราเพื่อให้ได้เมทริกซ์แบบขยาย:

ตอนนี้เรามาดูกันเพื่อให้ได้รูปแบบสามเหลี่ยมสุดท้าย ก่อนอื่น เรามาสลับแถวแรกและแถวสุดท้ายกัน:

ทีนี้ลองลบแถวแรกคูณด้วย 4 จากแถวที่สาม:

ต่อไปเราจะเพิ่มแถวแรกเข้าไปในแถวที่สอง:

ดี เราต้องทำสิ่งสุดท้ายเพื่อให้ได้รูปสามเหลี่ยม — รับ 0 โดยที่เรามี -6 เพื่อให้บรรลุเป้าหมายนี้ เราจะต้องคูณแถวที่สองด้วย 6/8 และเพิ่มลงในแถวที่สาม:

นี่คือรูปแบบสุดท้ายของเมทริกซ์ เนื่องจากเรามีศูนย์อยู่ใต้เส้นทแยงมุม (นี่คือรูปแบบสามเหลี่ยมที่เราค้นหา) อย่างที่เราจำได้ เมทริกซ์นี้แสดงถึงเวกเตอร์ w สำหรับ X และเวกเตอร์ Y ทางด้านขวา ดังนั้นเราจึงสามารถเขียนระบบที่อัปเดตตามรูปแบบเมทริกซ์ใหม่:

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

ใน Python scipy สามารถใช้เพื่อรับเมทริกซ์สามเหลี่ยมที่ปรับให้เหมาะสม:

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

สรุป

เราสามารถเขียนระบบสมการเชิงเส้นใดๆ ในรูปแบบเมทริกซ์ได้ และจากนั้นเราสามารถใช้การแปลงเมทริกซ์เพื่อค้นหาคำตอบของระบบได้ เช่น การใช้เมทริกซ์ผกผัน: