【数据处理】奇异值分解(SVD) 数据降噪的python实现

本文介绍了奇异值分解(SVD)的基本概念,包括特征值分解和奇异值分解的原理,并通过Python展示了如何利用SVD进行数据降噪。通过对一维信号数据的处理,展示如何确定保留的奇异值阶数,从而过滤噪声,实现数据的简化和压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【数据处理】奇异值分解(SVD) 数据降噪的python实现

一、特征值分解

(参考资料【1】)对称矩阵不同的特征值对应的特征向量两两正交,假设存在一个 m ∗ m m*m mm的满秩对称矩阵 A A A,其具有 m m m个不同的特征值分别为: λ i , i = 1 , ⋯   , m {\lambda _i},i = 1, \cdots ,m λi,i=1,,m,每个特征值对应的特征向量为: x i , i = 1 , ⋯   , m {x_i},i = 1, \cdots ,m xi,i=1,,m。存在如下关系:

A x i = λ i x i A{x_i} = {\lambda _i}{x_i} Axi=λixi

进而存在:

A U = U Λ AU = U\Lambda AU=UΛ
其中: U = [ x 1 , x 2 , ⋯   , x m ] U = \left[ { {x_1},{x_2}, \cdots ,{x_m}} \right] U=[x1,x2,,xm] Λ = [ λ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ λ m ] \Lambda = \left[ {\begin{matrix} { {\lambda _1}}& \cdots &0\\ \vdots & \ddots & \vdots \\ 0& \cdots &{ {\lambda _m}} \end{matrix}} \right] Λ=

### 基于SVD信号降噪方法 奇异值分解SVD)是一种强大的线性代数工具,广泛应用于数据压缩、图像处理以及信号降噪等领域。通过保留较大的奇异值并忽略较小的奇异值,可以有效声成分。 以下是基于Python实现SVD信号进行降噪的具体代码: #### 示例代码 ```python import numpy as np import matplotlib.pyplot as plt def add_noise(signal, noise_factor=0.1): """向原始信号添加随机高斯声""" noisy_signal = signal + noise_factor * np.random.normal(size=len(signal)) return noisy_signal def svd_denoise(noisy_signal, k=None): """ 使用SVD对带信号进行 参数: noisy_signal (numpy.ndarray): 输入的含信号. k (int): 要保留的最大奇异值数量,默认为None表示自动选择. 返回: denoised_signal (numpy.ndarray): 后的信号. """ # 将一维信号转换为二维矩阵形式以便应用SVD matrix_form = np.expand_dims(noisy_signal, axis=0) # 进行奇异值分解 U, s, VT = np.linalg.svd(matrix_form, full_matrices=False) if k is None: # 自动选择k:累积能量占比达到95%以上的最小奇异值数目 total_energy = np.sum(s ** 2) cumulative_energy = np.cumsum(s ** 2) / total_energy k = np.argmax(cumulative_energy >= 0.95) + 1 # 截断奇异值及其对应的U和VT分量 s_truncated = np.diag(s[:k]) U_truncated = U[:, :k] VT_truncated = VT[:k, :] # 重构信号 reconstructed_matrix = U_truncated @ s_truncated @ VT_truncated denoised_signal = np.squeeze(reconstructed_matrix) return denoised_signal # 创建一个简单的正弦波作为干净信号 clean_signal = np.sin(np.linspace(0, 10, 100)) # 添加声到清洁信号中 noisy_signal = add_noise(clean_signal, noise_factor=0.3) # 对带信号执行SVD操作 denoised_signal = svd_denoise(noisy_signal) # 可视化结果 plt.figure(figsize=(12, 8)) plt.plot(clean_signal, label="Clean Signal", color='green') plt.plot(noisy_signal, label="Noisy Signal", linestyle="--", alpha=0.7, color='red') plt.plot(denoised_signal, label="Denoised Signal", color='blue', linewidth=2) plt.legend() plt.title("Signal Denoising using SVD") plt.xlabel("Time") plt.ylabel("Amplitude") plt.show() ``` 上述代码实现了以下几个功能: - `add_noise` 函数用于生成带有随机高斯声的信号[^1]。 - `svd_denoise` 是核心函数,它接受输入的一维信号,并利用SVD对其进行降噪。如果未指定参数 \( k \),则会根据累计能量比例自动选取合适的截断阈值[^2]。 - 最终通过可视化展示原信号、加信号信号的效果对比[^3]。 #### 注意事项 为了获得最佳效果,在实际应用过程中可能需要调整声因子或手动设置 \( k \) 的取值范围来优化性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值