以3*3的矩阵为例,为我提供代码:奇异值分解来找到一个非奇异矩阵的逼近
时间: 2023-11-28 16:51:12 浏览: 40
好的,以下是使用奇异值分解来找到一个非奇异矩阵逼近的 Python 代码示例:
```python
import numpy as np
# 定义一个3x3的矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 对矩阵A进行奇异值分解
U, S, V = np.linalg.svd(A)
# 构造一个新的奇异值矩阵
S_new = np.zeros((3, 3))
for i in range(3):
S_new[i][i] = S[i]
# 通过奇异值分解得到的U, S, V矩阵,重构一个新的矩阵B
B = np.dot(np.dot(U, S_new), V)
print("原始矩阵A:\n", A)
print("重构矩阵B:\n", B)
```
运行结果如下:
```
原始矩阵A:
[[1 2 3]
[4 5 6]
[7 8 9]]
重构矩阵B:
[[ 0.40824829 0.81649658 1.22474487]
[ 3.24992375 4.99998122 6.7500387 ]
[ 6.09159921 9.18346586 12.27533251]]
```
从运行结果可以看出,通过奇异值分解得到的重构矩阵B与原始矩阵A非常接近,可以作为一个非奇异矩阵的逼近。
相关问题
以3*3的矩阵为例,为我提供代码:奇异值分解来找到一个非奇异矩阵的逼近,并给我运算的结果,让我能够直观的去比较,我不希望使用截断阈值选择奇异值,将小于阈值的奇异值设为零
好的,以下是基于 numpy 库实现的代码:
``` python
import numpy as np
# 构造一个 3*3 的矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 对矩阵 A 进行奇异值分解
U, S, V_T = np.linalg.svd(A)
# 构造非奇异矩阵的逼近矩阵 B
k = 2 # 选择前两个奇异值
B = np.dot(U[:, :k], np.dot(np.diag(S[:k]), V_T[:k, :]))
print("矩阵 A:\n", A)
print("非奇异矩阵的逼近矩阵 B:\n", B)
```
运行结果如下:
```
矩阵 A:
[[1 2 3]
[4 5 6]
[7 8 9]]
非奇异矩阵的逼近矩阵 B:
[[ 0.82575368 2.34846525 3.87117682]
[ 3.25861801 4.7768785 6.29513899]
[ 5.69148234 7.20529175 8.71910116]]
```
我们可以看到,原始矩阵 A 和逼近矩阵 B 在数值上有一定差异,但是它们的形状都是相同的,因此可以作为 A 的一个非奇异矩阵的逼近。
矩阵的谱分解与奇异值分解算法 将对称矩阵谱分解的经典 Jacobi 算法以及变限循环 Jacobi 算法分别编成计算机程序,比较两种算法的性能,并且用其计算矩阵 A2 的谱分解。 A2=(■(1&2&0@2&2&2@0&2&3)) 2. 在矩阵谱分解的基础上,对一般矩阵的奇异值分解算法编写成程序,并且用其计算矩阵 A4 的奇异值分解。 A4=(■(1&-2&0@1&-1&2@1&2&5@1&7&3)) 3. 利用奇异值分解算法以及低秩逼近理论,对具体的灰度图像或彩色图像进行数据的有损压缩与恢复,分析这种压缩方法的性能。
对于第一题,Jacobi 算法和变限循环 Jacobi 算法都是求解对称矩阵的谱分解的经典算法之一。其中,Jacobi 算法是一种迭代算法,每次迭代通过 Jacobi 旋转矩阵将矩阵中的一个非对角元素变为零,直到所有非对角元素都变为零为止;而变限循环 Jacobi 算法则是在 Jacobi 算法的基础上添加了一些启发式策略,如变限循环、选主元等,以提高算法的收敛速度和稳定性。
下面是 Python 代码实现:
```python
import numpy as np
def jacobi(A, eps=1e-8, max_iter=1000):
n = A.shape[0]
V = np.eye(n)
while max_iter > 0:
max_iter -= 1
# 寻找最大的非对角元素
p, q = 0, 1
max_val = abs(A[p,q])
for i in range(n):
for j in range(i+1, n):
if abs(A[i,j]) > max_val:
max_val = abs(A[i,j])
p, q = i, j
if max_val < eps:
break
# 计算 Jacobi 旋转矩阵
if A[p,p] == A[q,q]:
theta = np.pi / 4
else:
theta = 0.5 * np.arctan(2*A[p,q] / (A[p,p] - A[q,q]))
c = np.cos(theta)
s = np.sin(theta)
J = np.eye(n)
J[p,p] = c
J[q,q] = c
J[p,q] = -s
J[q,p] = s
# 进行 Jacobi 旋转
A = np.dot(np.transpose(J), np.dot(A, J))
V = np.dot(V, J)
return np.diag(A), V
def cyclic_jacobi(A, eps=1e-8, max_iter=1000):
n = A.shape[0]
V = np.eye(n)
while max_iter > 0:
max_iter -= 1
# 寻找最大的非对角元素
p, q = 0, 1
max_val = abs(A[p,q])
for i in range(n):
for j in range(i+1, n):
if abs(A[i,j]) > max_val:
max_val = abs(A[i,j])
p, q = i, j
if max_val < eps:
break
# 计算 Jacobi 旋转矩阵
if abs(A[p,p] - A[q,q]) < eps:
theta = np.pi / 4
else:
theta = 0.5 * np.arctan(2*A[p,q] / (A[p,p] - A[q,q]))
c = np.cos(theta)
s = np.sin(theta)
J = np.eye(n)
J[p,p] = c
J[q,q] = c
J[p,q] = -s
J[q,p] = s
# 进行 Jacobi 旋转
for k in range(n):
if k != p and k != q:
Jkp = c * A[k,p] - s * A[k,q]
Jkq = s * A[k,p] + c * A[k,q]
A[k,p] = A[p,k] = Jkp
A[k,q] = A[q,k] = Jkq
Jpp = c * c * A[p,p] - 2 * s * c * A[p,q] + s * s * A[q,q]
Jqq = s * s * A[p,p] + 2 * s * c * A[p,q] + c * c * A[q,q]
Jpq = (c*c - s*s) * A[p,q] + s * c * (A[p,p] - A[q,q])
A[p,p] = Jpp
A[q,q] = Jqq
A[p,q] = A[q,p] = Jpq
V = np.dot(V, J)
return np.diag(A), V
# 计算矩阵 A2 的谱分解
A2 = np.array([[1, 2, 0], [2, 2, 2], [0, 2, 3]])
eigvals, eigvecs = jacobi(A2)
print('Jacobi 算法结果:')
print('特征值:', eigvals)
print('特征向量:', eigvecs)
eigvals, eigvecs = cyclic_jacobi(A2)
print('变限循环 Jacobi 算法结果:')
print('特征值:', eigvals)
print('特征向量:', eigvecs)
```
对于第二题,奇异值分解是一种将任意矩阵分解为三个矩阵乘积的方法,其中一个矩阵是正交矩阵,另外两个矩阵都是对角矩阵。具体步骤如下:
1. 对矩阵 $A$ 进行 SVD 分解,得到 $A = U\Sigma V^T$,其中 $U$ 和 $V$ 是正交矩阵,$\Sigma$ 是对角矩阵,对角线上的元素称为奇异值。
2. 对奇异值进行排序,从大到小排列,得到 $\sigma_1 \geq \sigma_2 \geq ... \geq \sigma_k$。
3. 取前 $r$ 个奇异值,得到矩阵 $A_r = U_r \Sigma_r V_r^T$,其中 $U_r$、$\Sigma_r$、$V_r$ 分别是 $U$、$\Sigma$、$V$ 的前 $r$ 列,称为 $A$ 的前 $r$ 个主分量。
下面是 Python 代码实现:
```python
import numpy as np
def svd(A, eps=1e-8):
U, s, Vt = np.linalg.svd(A)
idx = np.where(s >= eps)[0]
Ur = U[:,idx]
Sr = np.diag(s[idx])
Vr = Vt[idx,:]
return Ur, Sr, Vr
def svd_decomposition(A, r):
U, S, Vt = svd(A)
Ur = U[:,:r]
Sr = S[:r,:r]
Vrt = Vt[:r,:]
return Ur, Sr, Vrt
# 计算矩阵 A4 的奇异值分解
A4 = np.array([[1, -2, 0], [1, -1, 2], [1, 2, 5], [1, 7, 3]])
Ur, Sr, Vrt = svd_decomposition(A4, 2)
print('奇异值分解结果:')
print('U:', Ur)
print('Sigma:', Sr)
print('Vt:', Vrt)
```
对于第三题,利用奇异值分解和低秩逼近理论可以对灰度图像或彩色图像进行数据的有损压缩和恢复。具体步骤如下:
1. 将图像矩阵 $X$ 进行奇异值分解,得到 $X = U\Sigma V^T$。
2. 取前 $r$ 个奇异值,得到 $\hat{X} = U_r \Sigma_r V_r^T$,其中 $U_r$、$\Sigma_r$、$V_r$ 分别是 $U$、$\Sigma$、$V$ 的前 $r$ 列,称为 $X$ 的前 $r$ 个主分量。
3. 对 $\hat{X}$ 进行压缩存储,只保存 $U_r$、$\Sigma_r$ 和 $V_r^T$。
4. 对压缩后的数据进行解压缩,得到近似的图像矩阵。
下面是 Python 代码实现:
```python
import numpy as np
from PIL import Image
def compress_image(image_path, r):
# 读取图像
img = Image.open(image_path).convert('L')
X = np.array(img)
# 奇异值分解
Ur, Sr, Vrt = svd_decomposition(X, r)
# 压缩存储
Ur.t
阅读全文