Seberapa besar sebuah vektor? Pertanyaan itu muncul di banyak pekerjaan sehari-hari: jarak dua lokasi di peta, ukuran galat antara prediksi dan nilai sebenarnya, atau batasan pada bobot sebuah model. Ukuran formalnya disebut norm, dan NumPy menghitungnya lewat np.linalg.norm dari submodul np.linalg (lihat Chapter Pengenalan numpy.linalg). Satu fungsi melayani beberapa jenis norm sekaligus lewat parameter ord.

Norm L2: Panjang Euclidean #

Norm L2 adalah panjang vektor menurut teorema Pythagoras: akar dari jumlah kuadrat seluruh komponennya. Bentuk inilah pilihan default np.linalg.norm:

python
import numpy as np

v = np.array([3.0, 4.0])
print(np.linalg.norm(v))
manual = np.sqrt((v**2).sum())
print(manual)
print(np.array_equal(np.linalg.norm(v), manual))

w = np.array([1.5, -2.0, 3.5])
print(np.linalg.norm(w))
print(np.array_equal(np.linalg.norm(w), np.sqrt((w**2).sum())))

Output yang Dihasilkan:

text
5.0
5.0
True
4.301162633521313
True

Bedah baris demi baris:

  1. Baris 4 (np.linalg.norm(v)): tanpa ord, NumPy menghitung L2: sqrt(9 + 16) = 5.0.
  2. Baris 5-6 (manual): rumus L2 ditulis eksplisit — kuadratkan tiap elemen, jumlahkan, akarkan — dan menghasilkan 5.0 juga.
  3. Baris 7 (np.array_equal(...)): True berarti kedua nilai sama persis sampai bit terakhir, bukan sekadar mendekati.
  4. Baris 9-11 (w): norm bekerja pada dimensi berapa pun; untuk w hasilnya 4.301162633521313 dan tetap identik dengan perhitungan manual.

Untuk perbandingan hasil float secara umum — misalnya antara dua rumus yang urutan operasinya berbeda — np.isclose tetap pilihan yang lebih aman daripada kesetaraan mutlak.

Norm L1 dan Linf: Parameter ord #

Parameter ord mengganti definisi norm. Dua pilihan yang paling sering dipakai selain L2: ord=1 menjumlahkan nilai mutlak semua komponen, dan ord=np.inf mengambil nilai mutlak terbesar:

python
import numpy as np

v = np.array([3.0, 4.0])
print(np.linalg.norm(v, 1))
print(np.linalg.norm(v, np.inf))
print(np.linalg.norm(v, 2))

Output yang Dihasilkan:

text
7.0
4.0
5.0

Bedah baris demi baris:

  1. Baris 4 (ord=1): |3| + |4| = 7.0 — norm L1.
  2. Baris 5 (ord=np.inf): max(|3|, |4|) = 4.0 — norm Linf.
  3. Baris 6 (ord=2): menuliskan default secara eksplisit; hasil tetap 5.0.

Tabel berikut merangkum ketiganya:

ordNamaRumus untuk vektor vNilai untuk [3, 4]Lazim dipakai untuk
1Norm L1sum(abs(v))7.0total deviasi absolut
2 (default)Norm L2sqrt(sum(v**2))5.0jarak Euclidean
np.infNorm Linfmax(abs(v))4.0deviasi terbesar satu komponen

Norm Matriks: Frobenius #

Untuk input 2-D, default np.linalg.norm bukan “panjang kolom” melainkan norm Frobenius: akar jumlah kuadrat seluruh elemen matriks. Anggap saja norm L2 yang diterapkan seolah seluruh elemen matriks diratakan menjadi satu vektor panjang:

python
import numpy as np

A = np.array([[1.0, 2.0],
              [3.0, 4.0]])
print(np.linalg.norm(A))
print(np.sqrt((A**2).sum()))
print(np.array_equal(np.linalg.norm(A), np.sqrt((A**2).sum())))
print(np.linalg.norm(A, "fro"))

Output yang Dihasilkan:

text
5.477225575051661
5.477225575051661
True
5.477225575051661

Bedah baris demi baris:

  1. Baris 5 (np.linalg.norm(A)): default untuk matriks adalah Frobenius: sqrt(1 + 4 + 9 + 16) = sqrt(30) = 5.477225575051661.
  2. Baris 6-7: rumus manual sqrt((A**2).sum()) memberi nilai yang sama persis; True menegaskannya.
  3. Baris 8 ("fro"): string "fro" menuliskan pilihan Frobenius secara eksplisit — hasilnya identik dengan baris 5.

Norm matriks lain juga tersedia lewat ord: ord=2 memberi norm spektral (nilai singular terbesar, terkait Chapter Singular Value Decomposition), sedangkan ord=1 dan ord=np.inf pada matriks berarti jumlah kolom terbesar dan jumlah baris terbesar.

Studi Kasus: Jarak Dua Titik #

Pemakaian norm yang paling sering terasa langsung adalah jarak. Jarak Euclidean antara dua titik adalah norm L2 dari selisih keduanya — tanpa perlu rumus terpisah:

python
import numpy as np

gudang_a = np.array([2.0, 3.0])
gudang_b = np.array([5.0, 7.0])
selisih = gudang_b - gudang_a
print(selisih)
print(np.linalg.norm(selisih))

Output yang Dihasilkan:

text
[3. 4.]
5.0

Bedah baris demi baris:

  1. Baris 5 (selisih = gudang_b - gudang_a): pengurangan array bekerja elemen-demi-elemen dan menghasilkan vektor perpindahan [3. 4.].
  2. Baris 7 (np.linalg.norm(selisih)): panjang vektor perpindahan itu adalah jarak 5.0 — vektor yang sama persis dengan contoh pada bagian pertama bab ini.

Pola “norm dari selisih” dipakai di banyak tempat:

  • Galat prediksi: np.linalg.norm(prediksi - aktual) sebagai ukuran kesalahan total sebuah model.
  • Regularisasi: L1 mendorong bobot model menjadi nol persis, L2 mendorong seluruh bobot tetap kecil.
  • Deteksi anomali: titik dengan norm deviasi terbesar dari rata-rata menjadi kandidat data tidak lazim.