SVD,即奇异值分解(Singular Value Decomposition),是线性代数中一种重要的矩阵分解方法。
定义
对于任何给定的 m×nm×n 的实数矩阵 AA(其中 mm 是行数,nn 是列数),SVD分解可以表示为:
应用
-
数据降维:SVD 可以用于数据降维,尤其是在 PCA 中。通过保留最大的几个奇异值及其对应的左奇异向量和右奇异向量,可以近似原始数据矩阵。
-
推荐系统:在推荐系统中,SVD 可以用来分解用户-项目评分矩阵,以发现用户的潜在偏好和项目的隐含特征。
-
图像压缩:SVD 可以用于图像压缩,通过保留主要的奇异值和对应的向量,可以在保持图像质量的同时减少存储空间。
-
信号处理:在信号处理中,SVD 可以用于噪声降低和信号分离。
接下来手搓一个简易的svd
import numpy as np
def simple_svd(A):
# 计算A的协方差矩阵的特征值和特征向量
covariance_matrix = np.dot(A.T, A)
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
# 对特征值进行排序(从大到小),并获取对应的特征向量
sorted_indices = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_indices]
eigenvectors = eigenvectors[:, sorted_indices]
# 计算奇异值(特征值的平方根)
singular_values = np.sqrt(eigenvalues)
# 计算U和V
U = np.dot(A, eigenvectors)
V = eigenvectors
# 由于U应该是正交的,我们需要归一化它的列
U = U / np.linalg.norm(U, axis=0)[:, np.newaxis]
return U, singular_values, V
# 示例:创建一个矩阵A
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=float)
# 调用自定义SVD函数
U, S, V = simple_svd(A)
print("U matrix:\n", U)
print("Sigma (S) values:\n", S)
print("V matrix:\n", V)
每段代码的解释
计算协方差矩阵的特征值和特征向量
covariance_matrix = np.dot(A.T, A)
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
对特征值进行排序并获取对应的特征向量
sorted_indices = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_indices]
eigenvectors = eigenvectors[:, sorted_indices]
计算奇异值
什么是奇异值,有什么用
通过保留最大的几个奇异值及其对应的奇异向量,可以有效地减少数据的维度,同时保留数据中最重要的特征。
singular_values = np.sqrt(eigenvalues)
计算 U 和 V
U = np.dot(A, eigenvectors)
V = eigenvectors
np.dot(A, eigenvectors)
计算矩阵A
与其特征向量的点积,得到左奇异向量矩阵U
。V = eigenvectors
直接将特征向量矩阵作为右奇异向量矩阵V
。
计算了u,s,v后能干嘛
-
数据降维:
通过保留最大的几个奇异值及其对应的奇异向量,可以对数据进行降维处理。这在PCA(主成分分析)中非常有用,可以用于图像压缩、数据压缩和噪声降低等场景。
SVD(奇异值分解)的思想是将一个复数或实数矩阵分解为三个特定的矩阵,使得原始矩阵可以通过这三个矩阵的乘积来重构。
SVD的思想在于提供了一种将矩阵分解为更基本、更易于分析和处理的组成部分的方法。这种分解揭示了矩阵的内在结构,使得我们可以在不同的应用中利用这些结构,如数据降维、信号处理、机器学习等。SVD是一种强大的数学工具,因为它适用于任何矩阵,无论其是否是方阵,是否是满秩的