Matrix Norms¶
Compute vector and matrix norms using np.linalg.norm.
Vector Norms¶
1. L2 Norm (Euclidean)¶
import numpy as np
def main():
x = np.array([3, 4])
norm_l2 = np.linalg.norm(x)
print(f"x = {x}")
print(f"||x||_2 = {norm_l2}")
print(f"Manual: sqrt(3² + 4²) = {np.sqrt(3**2 + 4**2)}")
if __name__ == "__main__":
main()
2. L1 Norm (Manhattan)¶
import numpy as np
def main():
x = np.array([3, -4, 2])
norm_l1 = np.linalg.norm(x, ord=1)
print(f"x = {x}")
print(f"||x||_1 = {norm_l1}")
print(f"Manual: |3| + |-4| + |2| = {np.abs(x).sum()}")
if __name__ == "__main__":
main()
3. L∞ Norm (Max)¶
import numpy as np
def main():
x = np.array([3, -7, 2])
norm_inf = np.linalg.norm(x, ord=np.inf)
print(f"x = {x}")
print(f"||x||_∞ = {norm_inf}")
print(f"Manual: max(|3|, |-7|, |2|) = {np.abs(x).max()}")
if __name__ == "__main__":
main()
General p-Norm¶
1. Mathematical Form¶
\[\|x\|_p = \left( \sum_i |x_i|^p \right)^{1/p}\]
2. Different p Values¶
import numpy as np
def main():
x = np.array([1, 2, 3, 4])
print(f"x = {x}")
print()
for p in [1, 2, 3, 5, 10, np.inf]:
norm = np.linalg.norm(x, ord=p)
print(f"||x||_{p} = {norm:.4f}")
if __name__ == "__main__":
main()
3. Convergence to Max¶
As p → ∞, p-norm converges to max norm.
import numpy as np
def main():
x = np.array([1, 5, 2, 3])
max_val = np.abs(x).max()
print(f"x = {x}")
print(f"Max element: {max_val}")
print()
for p in [1, 2, 5, 10, 50, 100]:
norm = np.linalg.norm(x, ord=p)
print(f"p={p:3}: {norm:.6f}")
if __name__ == "__main__":
main()
Matrix Norms¶
1. Frobenius Norm¶
import numpy as np
def main():
A = np.array([[1, 2],
[3, 4]])
norm_fro = np.linalg.norm(A, 'fro')
print("A =")
print(A)
print(f"||A||_F = {norm_fro:.4f}")
print(f"Manual: sqrt(1² + 2² + 3² + 4²) = {np.sqrt(np.sum(A**2)):.4f}")
if __name__ == "__main__":
main()
2. Spectral Norm (2-norm)¶
Largest singular value.
import numpy as np
def main():
A = np.array([[1, 2],
[3, 4]])
norm_2 = np.linalg.norm(A, 2)
# Verify: largest singular value
s = np.linalg.svd(A, compute_uv=False)
print("A =")
print(A)
print(f"||A||_2 = {norm_2:.4f}")
print(f"Largest singular value: {s[0]:.4f}")
if __name__ == "__main__":
main()
3. Other Matrix Norms¶
import numpy as np
def main():
A = np.array([[1, -2, 3],
[-4, 5, -6]])
print("A =")
print(A)
print()
# Frobenius norm (default for matrices)
print(f"Frobenius: {np.linalg.norm(A, 'fro'):.4f}")
# Induced 2-norm (spectral)
print(f"Spectral (2): {np.linalg.norm(A, 2):.4f}")
# Induced 1-norm (max column sum)
print(f"1-norm: {np.linalg.norm(A, 1):.4f}")
# Induced inf-norm (max row sum)
print(f"∞-norm: {np.linalg.norm(A, np.inf):.4f}")
# Nuclear norm (sum of singular values)
print(f"Nuclear: {np.linalg.norm(A, 'nuc'):.4f}")
if __name__ == "__main__":
main()
Axis Parameter¶
1. Row Norms¶
import numpy as np
def main():
A = np.array([[1, 2, 3],
[4, 5, 6]])
# L2 norm of each row
row_norms = np.linalg.norm(A, axis=1)
print("A =")
print(A)
print(f"Row norms: {row_norms}")
if __name__ == "__main__":
main()
2. Column Norms¶
import numpy as np
def main():
A = np.array([[1, 2, 3],
[4, 5, 6]])
# L2 norm of each column
col_norms = np.linalg.norm(A, axis=0)
print("A =")
print(A)
print(f"Column norms: {col_norms}")
if __name__ == "__main__":
main()
3. Batch Norms¶
import numpy as np
def main():
# Batch of vectors (10 vectors, each length 5)
X = np.random.randn(10, 5)
# Norm of each vector
norms = np.linalg.norm(X, axis=1)
print(f"X shape: {X.shape}")
print(f"Norms shape: {norms.shape}")
print(f"Norms: {norms}")
if __name__ == "__main__":
main()
Applications¶
1. Normalization¶
import numpy as np
def main():
x = np.array([3, 4, 0])
# Unit vector
x_normalized = x / np.linalg.norm(x)
print(f"Original: {x}")
print(f"Normalized: {x_normalized}")
print(f"Norm of normalized: {np.linalg.norm(x_normalized):.10f}")
if __name__ == "__main__":
main()
2. Distance¶
import numpy as np
def main():
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# Euclidean distance
distance = np.linalg.norm(a - b)
print(f"a = {a}")
print(f"b = {b}")
print(f"||a - b|| = {distance:.4f}")
if __name__ == "__main__":
main()
3. Matrix Error¶
import numpy as np
def main():
A = np.array([[1, 2],
[3, 4]])
B = np.array([[1.1, 1.9],
[3.05, 4.1]])
# Frobenius error
error = np.linalg.norm(A - B, 'fro')
# Relative error
rel_error = error / np.linalg.norm(A, 'fro')
print(f"Absolute error: {error:.4f}")
print(f"Relative error: {rel_error:.4%}")
if __name__ == "__main__":
main()
Regularization¶
1. L2 Regularization¶
import numpy as np
def main():
np.random.seed(42)
# Model weights
w = np.random.randn(10)
# L2 regularization (weight decay)
lambda_reg = 0.01
l2_penalty = lambda_reg * np.linalg.norm(w) ** 2
print(f"Weights norm: {np.linalg.norm(w):.4f}")
print(f"L2 penalty: {l2_penalty:.4f}")
if __name__ == "__main__":
main()
2. L1 Regularization¶
import numpy as np
def main():
np.random.seed(42)
# Model weights
w = np.random.randn(10)
# L1 regularization (sparsity)
lambda_reg = 0.01
l1_penalty = lambda_reg * np.linalg.norm(w, 1)
print(f"Weights L1 norm: {np.linalg.norm(w, 1):.4f}")
print(f"L1 penalty: {l1_penalty:.4f}")
if __name__ == "__main__":
main()
3. Nuclear Norm¶
Low-rank regularization for matrices.
import numpy as np
def main():
np.random.seed(42)
# Matrix (e.g., recommendation matrix)
M = np.random.randn(5, 4)
# Nuclear norm = sum of singular values
nuclear_norm = np.linalg.norm(M, 'nuc')
# Verify with SVD
s = np.linalg.svd(M, compute_uv=False)
print(f"Nuclear norm: {nuclear_norm:.4f}")
print(f"Sum of singular values: {s.sum():.4f}")
if __name__ == "__main__":
main()
Summary Table¶
1. Vector Norms¶
| Norm | ord |
Formula |
|---|---|---|
| L1 | 1 |
\(\sum \|x_i\|\) |
| L2 | 2 or None |
\(\sqrt{\sum x_i^2}\) |
| L∞ | np.inf |
\(\max \|x_i\|\) |
| p-norm | p |
\((\sum \|x_i\|^p)^{1/p}\) |
2. Matrix Norms¶
| Norm | ord |
Description |
|---|---|---|
| Frobenius | 'fro' |
\(\sqrt{\sum_{ij} A_{ij}^2}\) |
| Spectral | 2 |
Largest singular value |
| Nuclear | 'nuc' |
Sum of singular values |
| 1-norm | 1 |
Max column sum |
| ∞-norm | np.inf |
Max row sum |
3. Choosing a Norm¶
- Distance: L2 (Euclidean)
- Sparsity: L1
- Matrix approximation error: Frobenius
- Matrix condition: Spectral (2-norm)