Pandas & NumPy Academy · บทเรียน

ภาพรวมค่าเฉพาะและ SVD

คำนวณค่าเฉพาะและเวกเตอร์เฉพาะด้วย np.linalg.eig และทำความเข้าใจว่า SVD เป็นพื้นฐานของการลดมิติด้วย PCA อย่างไร

บทเรียน 4 จาก 413 ขั้นตอน

ภาพรวมค่าเฉพาะและ SVD เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ค่าลักษณะเฉพาะและเวกเตอร์ลักษณะเฉพาะคืออะไร

เวกเตอร์ลักษณะเฉพาะของเมทริกซ์จัตุรัส A คือเวกเตอร์ v ที่ไม่ใช่ศูนย์และเป็นไปตาม A @ v = lambda * v — การคูณด้วย A จะทำได้เพียงปรับขนาดของ v แต่ไม่เปลี่ยนทิศทาง สเกลาร์ lambda เรียกว่า ค่าลักษณะเฉพาะที่สอดคล้องกับ v ค่าลักษณะเฉพาะแสดงให้เห็น “ตัวคูณการยืด” โดยธรรมชาติของการแปลงเชิงเส้น: ค่าลักษณะเฉพาะเท่ากับ 2 หมายความว่าเมทริกซ์ทำให้ความยาวในทิศทางของเวกเตอร์ลักษณะเฉพาะเพิ่มเป็นสองเท่า ส่วนค่าลักษณะเฉพาะที่เป็นลบจะกลับทิศทาง

import numpy as np

A = np.array([[3.0, 1.0],
              [0.0, 2.0]])

eigenvalues, eigenvectors = np.linalg.eig(A)
print('Eigenvalues:', eigenvalues)
print('Eigenvectors (columns):')
print(eigenvectors)

การคำนวณค่าลักษณะเฉพาะด้วย np.linalg.eig()

np.linalg.eig(A) คืนค่าทูเพิล (eigenvalues, eigenvectors) โดย ค่าลักษณะเฉพาะเป็นอาร์เรย์หนึ่งมิติ ส่วน เวกเตอร์ลักษณะเฉพาะเป็นอาร์เรย์สองมิติที่แต่ละคอลัมน์คือเวกเตอร์ลักษณะเฉพาะหนึ่งตัว สำหรับเมทริกซ์สมมาตรที่เป็นจำนวนจริง เช่น เมทริกซ์ความแปรปรวนร่วม ค่าลักษณะเฉพาะจะเป็นจำนวนจริงเสมอ และเวกเตอร์ลักษณะเฉพาะจะตั้งฉากกัน — ให้ใช้ np.linalg.eigh(A) กับเมทริกซ์สมมาตร เนื่องจากทำงานได้เร็วกว่าและรับประกันว่าจะคืนค่าจริง

import numpy as np

# Symmetric matrix -> use eigh for efficiency and real eigenvalues
A = np.array([[4.0, 2.0],
              [2.0, 3.0]])

vals, vecs = np.linalg.eigh(A)
print('Eigenvalues (real):', vals)
print('Eigenvectors (orthonormal columns):')
print(vecs)

# Verify: A @ v = lambda * v for each eigenvector
for i in range(len(vals)):
    lhs = A @ vecs[:, i]
    rhs = vals[i] * vecs[:, i]
    print(f'v{i} check:', np.allclose(lhs, rhs))

ค่าลักษณะเฉพาะและคุณสมบัติของเมทริกซ์

ค่าลักษณะเฉพาะบอกคุณสมบัติสำคัญของเมทริกซ์ ดีเทอร์มิแนนต์เท่ากับผลคูณของค่าลักษณะเฉพาะทั้งหมด: det(A) = product(eigenvalues) ส่วน เทรซ (ผลรวมของสมาชิกบนแนวทแยง) เท่ากับผลรวมของค่าลักษณะเฉพาะ: trace(A) = sum(eigenvalues) เมทริกซ์จะเป็นเมทริกซ์บวกแน่นอน (ค่าลักษณะเฉพาะทั้งหมด > 0) ก็ต่อเมื่อค่าลักษณะเฉพาะทั้งหมดเป็นบวก ซึ่งเป็นคุณสมบัติสำคัญของเมทริกซ์ความแปรปรวนร่วมที่ถูกต้องและปัญหาการหาค่าที่เหมาะที่สุดแบบนูน

import numpy as np

A = np.array([[4.0, 2.0],
              [2.0, 3.0]])

vals, _ = np.linalg.eigh(A)
print('Eigenvalues:', vals)
print('Product (should = det):', np.prod(vals))
print('np.linalg.det:', np.linalg.det(A))
print('Sum (should = trace):', np.sum(vals))
print('np.trace:', np.trace(A))
print('Positive definite:', np.all(vals > 0))

ภาพรวมการแยกค่าเอกฐาน (SVD)

การแยกค่าเอกฐาน (SVD) แยกเมทริกซ์ A ใด ๆ ออกได้ ไม่ใช่เฉพาะเมทริกซ์จัตุรัส โดยเขียนเป็น A = U @ S @ V.T เมื่อ U และ V เป็นเมทริกซ์ตั้งฉาก และ S เป็นเมทริกซ์แนวทแยงที่มีค่าเอกฐานไม่เป็นลบอยู่บนแนวทแยง SVD เป็นการแยกตัวประกอบเมทริกซ์ที่มีความทั่วไปสูงสุดและมีเสถียรภาพเชิงตัวเลขสูง ใช้เป็นพื้นฐานของ PCA การบีบอัดภาพ ระบบแนะนำ และการคำนวณเมทริกซ์ผกผันเทียม np.linalg.svd(A) คืนค่า U, s (ค่าเอกฐานแบบอาร์เรย์หนึ่งมิติ) และ Vh (ทรานสโพสของ V)

import numpy as np

A = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])

U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('U shape:', U.shape)
print('s (singular values):', s)
print('Vh shape:', Vh.shape)

# Reconstruct A
A_reconstructed = U @ np.diag(s) @ Vh
print('Reconstruction correct:', np.allclose(A, A_reconstructed))

ค่าเอกฐานและอันดับของเมทริกซ์

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

import numpy as np

# Full-rank matrix
A = np.random.rand(5, 3)
U, s, Vh = np.linalg.svd(A, full_matrices=False)
print('Singular values:', np.round(s, 4))
print('Rank (non-zero sv):', np.linalg.matrix_rank(A))
print('Condition number:', s[0] / s[-1])

# Rank-deficient matrix
B = np.array([[1.0, 2.0], [2.0, 4.0], [3.0, 6.0]])
_, sb, _ = np.linalg.svd(B, full_matrices=False)
print('Rank-deficient sv:', np.round(sb, 8))

SVD และ PCA: ความเชื่อมโยง

การวิเคราะห์องค์ประกอบหลัก (PCA) สามารถทำได้โดยตรงด้วย SVD หลังจากปรับศูนย์เมทริกซ์ข้อมูล X แล้ว (ลบค่าเฉลี่ยของแต่ละคอลัมน์) เวกเตอร์เอกฐานด้านขวาใน Vh คือองค์ประกอบหลัก และค่าเอกฐานยกกำลังสอง (หารด้วย n-1) คือความแปรปรวนที่อธิบายได้ PCA ของ Sklearn ใช้วิธีนี้โดยตรง การเข้าใจความเชื่อมโยงนี้ช่วยให้คุณนำ PCA ไปเขียนหรือปรับแต่งได้ตั้งแต่ต้นสำหรับการลดมิติ

import numpy as np

np.random.seed(0)
X = np.random.randn(100, 4)

# Center the data
X_centered = X - X.mean(axis=0)

# SVD-based PCA
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)

# Variance explained by each component
var_explained = (s ** 2) / (X.shape[0] - 1)
total_var = var_explained.sum()
print('Variance explained ratio:', np.round(var_explained / total_var, 3))

# Project onto top 2 principal components
X_pca = X_centered @ Vh[:2].T
print('Reduced shape:', X_pca.shape)

การประมาณเมทริกซ์อันดับต่ำด้วย SVD

SVD ช่วยให้ทำการประมาณเมทริกซ์อันดับต่ำได้ โดยเก็บเฉพาะค่าเอกฐานและเวกเตอร์ลำดับต้น ๆ จำนวน k แล้วสร้างค่าประมาณของเมทริกซ์เดิมขึ้นใหม่ วิธีนี้เป็นพื้นฐานของการบีบอัดภาพและการกรองร่วมเพื่อสร้างคำแนะนำ SVD แบบตัดทอน U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :] ให้ค่าประมาณอันดับ k ที่ดีที่สุดในแง่กำลังสองน้อยที่สุด (ทฤษฎีบท Eckart-Young)

import numpy as np

np.random.seed(1)
A = np.random.rand(20, 15)

U, s, Vh = np.linalg.svd(A, full_matrices=False)

# Rank-3 approximation
k = 3
A_approx = U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :]

error = np.linalg.norm(A - A_approx, 'fro')
total = np.linalg.norm(A, 'fro')
print(f'Approximation error: {error/total:.3f} (fraction of total)')
print(f'Top-3 singular values capture {(s[:3]**2).sum()/(s**2).sum():.1%} of variance')

การแยกเมทริกซ์ด้วยค่าลักษณะเฉพาะเทียบกับ SVD: ควรใช้แบบใด

ใช้การแยกเมทริกซ์ด้วยค่าลักษณะเฉพาะ (np.linalg.eig หรือ eigh) เมื่อมีเมทริกซ์สมมาตรแบบจัตุรัสและต้องการทำความเข้าใจแกนหลักของเมทริกซ์ เช่น เมทริกซ์ความแปรปรวนร่วมใน PCA หรือเมทริกซ์การเปลี่ยนสถานะมาร์คอฟ ใช้SVD (np.linalg.svd) เมื่อเมทริกซ์ของคุณไม่ใช่เมทริกซ์จัตุรัส หรือต้องการเสถียรภาพเชิงตัวเลขสูงสุด SVD มีอยู่เสมอ แต่การแยกเมทริกซ์ด้วยค่าลักษณะเฉพาะอาจให้จำนวนเชิงซ้อนสำหรับเมทริกซ์ที่ไม่สมมาตร

import numpy as np

# Non-symmetric matrix: eigenvalues may be complex
A = np.array([[0.0, -1.0],
              [1.0,  0.0]])
vals, _ = np.linalg.eig(A)
print('Eigenvalues (complex for rotation):', vals)

# SVD always gives real singular values
_, s, _ = np.linalg.svd(A)
print('Singular values (always real):', s)

ทฤษฎีบทสเปกตรัมสำหรับเมทริกซ์สมมาตร

ทฤษฎีบทสเปกตรัมระบุว่าเมทริกซ์สมมาตรที่เป็นจำนวนจริง A ทุกเมทริกซ์สามารถแยกได้เป็น A = Q @ diag(eigenvalues) @ Q.T โดย Q เป็นเมทริกซ์ตั้งฉาก (Q.T = Q⁻¹) นั่นหมายความว่าเมทริกซ์สมมาตรสามารถทำให้เป็นเมทริกซ์แนวทแยงได้เสมอ โดยมีค่าลักษณะเฉพาะเป็นจำนวนจริงและมีเวกเตอร์ลักษณะเฉพาะที่ตั้งฉากกัน เมทริกซ์ความแปรปรวนร่วม เมทริกซ์เคอร์เนลใน SVM และเมทริกซ์เฮสเซียนในการหาค่าที่เหมาะที่สุด ล้วนเป็นเมทริกซ์สมมาตร ทำให้ทฤษฎีบทนี้มีประโยชน์อย่างกว้างขวางในทฤษฎีการเรียนรู้ของเครื่อง

import numpy as np

A = np.array([[5.0, 2.0, 1.0],
              [2.0, 3.0, 0.0],
              [1.0, 0.0, 4.0]])

vals, Q = np.linalg.eigh(A)
print('Eigenvalues:', np.round(vals, 4))

# Reconstruct A = Q @ diag(vals) @ Q.T
A_reconstructed = Q @ np.diag(vals) @ Q.T
print('Reconstruction correct:', np.allclose(A, A_reconstructed))
print('Q is orthogonal:', np.allclose(Q.T @ Q, np.eye(3)))

ภาคปฏิบัติ: การวนซ้ำกำลังเพื่อหาค่าลักษณะเฉพาะเด่น

เมื่อจำเป็นต้องใช้เพียงค่าลักษณะเฉพาะที่มากที่สุดและเวกเตอร์ลักษณะเฉพาะของค่านั้น การวนซ้ำกำลังมีประสิทธิภาพมากกว่าการคำนวณค่าลักษณะเฉพาะทั้งหมด เริ่มจากเวกเตอร์สุ่ม แล้วคูณด้วย A และทำให้เป็นมาตรฐานซ้ำ ๆ วิธีนี้จะลู่เข้าสู่เวกเตอร์ลักษณะเฉพาะเด่น นี่คือวิธีที่อัลกอริทึม PageRank รุ่นแรกของ Google ใช้ NumPy ทำให้การวนซ้ำแต่ละครั้งเป็นเพียงการคูณเมทริกซ์กับเวกเตอร์หนึ่งครั้งด้วย @

import numpy as np

A = np.array([[4.0, 1.0, 2.0],
              [1.0, 3.0, 0.0],
              [2.0, 0.0, 2.0]])

v = np.random.rand(3)
for _ in range(50):
    v = A @ v
    v = v / np.linalg.norm(v)

eigenvalue_approx = v @ A @ v
print('Dominant eigenvector:', np.round(v, 4))
print('Approx eigenvalue:', round(eigenvalue_approx, 4))

# Verify with eigh
vals, vecs = np.linalg.eigh(A)
print('True max eigenvalue:', round(vals[-1], 4))

การใช้ np.linalg.svd ในกระบวนการประมวลผลจริง

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

import numpy as np

np.random.seed(7)
X_train = np.random.randn(200, 50)
X_test = np.random.randn(40, 50)

# Fit on training data
X_mean = X_train.mean(axis=0)
X_centered = X_train - X_mean
U, s, Vh = np.linalg.svd(X_centered, full_matrices=False)

# Choose k to capture 90% variance
cumvar = np.cumsum(s**2) / (s**2).sum()
k = np.searchsorted(cumvar, 0.9) + 1
print(f'Components to capture 90% variance: {k}')

# Transform test data using the same Vh
X_test_reduced = (X_test - X_mean) @ Vh[:k].T
print('Reduced test shape:', X_test_reduced.shape)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า np.linalg.eig()/eigh() ใช้คำนวณค่าลักษณะเฉพาะและเวกเตอร์ลักษณะเฉพาะ ซึ่งแสดงทิศทางการยืดโดยธรรมชาติของเมทริกซ์ np.linalg.svd() แยกเมทริกซ์ใด ๆ ออกเป็น U ค่าเอกฐาน และ Vh ทำให้สามารถใช้ PCA และการประมาณเมทริกซ์อันดับต่ำได้ และค่าเอกฐานใช้วัดความแปรปรวนที่แต่ละองค์ประกอบครอบคลุม รวมทั้งกำหนดอันดับของเมทริกซ์ บทถัดไป เราจะเรียนรู้การจัดการชุดข้อมูลขนาดใหญ่ด้วยการอ่านไฟล์ CSV แบบแบ่งเป็นส่วน ๆ

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

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

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “ภาพรวมค่าเฉพาะและ SVD” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ภาพรวมค่าเฉพาะและ SVD” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ภาพรวมค่าเฉพาะและ SVD”

คำนวณค่าเฉพาะและเวกเตอร์เฉพาะด้วย np.linalg.eig และทำความเข้าใจว่า SVD เป็นพื้นฐานของการลดมิติด้วย PCA อย่างไร คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ภาพรวมค่าเฉพาะและ SVD” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคูณเมทริกซ์ด้วย np.matmul และ @
  2. ดีเทอร์มิแนนต์ เมทริกซ์ผกผัน และทรานสโพส
  3. การแก้ระบบสมการเชิงเส้น
  4. ภาพรวมค่าเฉพาะและ SVD
← กลับไปที่ Pandas & NumPy Academy