线性代数|机器学习-P31完成一个秩为1的矩阵
1. 大纲
- 给定一个秩为1的矩阵A,m行,n列,如果在矩阵A中给定
m+n-1个非零的值,请问如何填充这个矩阵A,使得矩阵A 填满? - 卷积和循环卷积矩阵,通过信号与系统中的卷积方式处理相关数据,求循环卷积矩阵的特征值和特征向量?
2. 填充秩1矩阵
2.1 举例
假设我们有一个矩阵A,我们定义其秩为1,,3行3列,具体组成如下:
A
=
[
3
4
5
6
a
22
a
23
9
a
32
a
33
]
;
R
a
n
k
(
A
)
=
1
\begin{equation} A=\begin{bmatrix} 3&4&5\\\\ 6&a_{22}&a_{23}\\\\ 9&a_{32}&a_{33} \end{bmatrix};\mathrm{Rank(A)=1} \end{equation}
A=
3694a22a325a23a33
;Rank(A)=1
- 因为我们知道矩阵A的秩为1,那么我们可以通过比例计算出其他值,具体如下:
a 22 = 6 ⋅ 4 3 = 8 ; a 23 = 6 ⋅ 5 3 = 10 ; a 32 = 9 ⋅ 4 3 = 12 ; a 33 = 9 ⋅ 5 3 = 15 ; \begin{equation} a_{22}=\frac{6\cdot4}{3}=8;a_{23}=\frac{6\cdot5}{3}=10;a_{32}=\frac{9\cdot4}{3}=12;a_{33}=\frac{9\cdot5}{3}=15; \end{equation} a22=36⋅4=8;a23=36⋅5=10;a32=39⋅4=12;a33=39⋅5=15;
2.2 二分图
我们根据给定的矩阵A,来绘制对应的二分图,二分图中没有形成闭环,所以可以填满矩阵A的值
,给定的非零值,任意四个组成的行列式为非零行列式

3. 循环卷积矩阵
循环卷积矩阵C,每一列元素一样,但是第i列通过移位得到第i+1列
C
=
[
2
5
1
0
0
2
5
1
1
0
2
5
5
1
0
2
]
\begin{equation} C=\begin{bmatrix} 2&5&1&0\\\\ 0&2&5&1\\\\ 1&0&2&5\\\\ 5&1&0&2 \end{bmatrix} \end{equation}
C=
2015520115200152
- 循环矩阵P表示如下:
P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; X a = [ x 1 x 2 x 3 x 4 ] ; [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ x 1 x 2 x 3 x 4 ] = [ x 2 x 3 x 4 x 1 ] \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};X_a=\begin{bmatrix} x_1\\\\ x_2\\\\ x_3\\\\ x_4 \end{bmatrix};\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} x_1\\\\ x_2\\\\ x_3\\\\ x_4 \end{bmatrix}=\begin{bmatrix} x_2\\\\ x_3\\\\ x_4\\\\ x_1 \end{bmatrix} \end{equation} P= 0001100001000010 ;Xa= x1x2x3x4 ; 0001100001000010 x1x2x3x4 = x2x3x4x1 - 我们发现,通过循环矩阵P可以将向量X中的元素进行元素循环。
P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; P 2 = [ 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 ] ; P 3 = [ 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 ] ; P 4 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = I ; \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};P^2=\begin{bmatrix} 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0\\\\ 0&1&0&0 \end{bmatrix};P^3=\begin{bmatrix} 0&0&0&1\\\\ 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0 \end{bmatrix};P^4=\begin{bmatrix} 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1 \end{bmatrix}=I; \end{equation} P= 0001100001000010 ;P2= 0010000110000100 ;P3= 0100001000011000 ;P4= 1000010000100001 =I; - 那么对于任意一个循环卷积矩阵来说,可以表示如下:

- 矩阵P的特征向量就是矩阵C的特征向量
- 矩阵P的特征值,特征向量
P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ 1 1 1 1 ] = [ 1 1 1 1 ] ⇒ λ 1 = 1 , v 1 = [ 1 1 1 1 ] ; \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix}=\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix}\Rightarrow \lambda_1=1,v_1=\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix};\end{equation} P= 0001100001000010 ; 0001100001000010 1111 = 1111 ⇒λ1=1,v1= 1111 ;
[ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ 1 − 1 1 − 1 ] = − 1 ⋅ [ 1 − 1 1 − 1 ] ⇒ λ 2 = − 1 , v 2 = [ 1 − 1 1 − 1 ] ; \begin{equation} \begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix}=-1\cdot\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix}\Rightarrow \lambda_2=-1,v_2=\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix};\end{equation} 0001100001000010 1−11−1 =−1⋅ 1−11−1 ⇒λ2=−1,v2= 1−11−1 ;
4. Python 代码numpy 版
- 代码,简单示意
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName :numpy_circustant.py
# @Time :2024/9/24 20:21
# @Author :Jason Zhang
import numpy as np
np.set_printoptions(suppress=True, precision=3)
class Eigenvalue():
def __init__(self, array):
self.array = array
self.value, self.vector = np.linalg.eig(self.array)
def __str__(self):
return f"array:\n{self.array}:\n eigenvalue:\n{self.value}\n,eigenveotr:\n{self.vector}"
class Circulant_Matrix():
def __init__(self, array):
self.array = array
def circulant(self):
N = np.size(self.array)
CM = np.array([np.roll(self.array, i) for i in range(N)])
my_cir = Eigenvalue(CM)
print(my_cir)
def get_circulant(self):
N1 = np.size(self.array)
Get_CM = np.array([np.roll(self.array, i) for i in range(N1)])
return Get_CM
if __name__ == "__main__":
run_code = 0
N = 5
# a = np.arange(4)
a = np.array([2, 5, 1, 0])
a_cm = Circulant_Matrix(a)
a_cm.circulant()
a_circulant = a_cm.get_circulant()
P = np.array([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0]])
P2 = P @ P
P3 = P2 @ P
print(f"P=\n{P}")
print(f"P2=\n{P2}")
print(f"P3=\n{P3}")
P_eigen = Eigenvalue(P)
P2_eigen = Eigenvalue(P2)
P3_eigen = Eigenvalue(P3)
print(f"P_eigen=\n{P_eigen}")
print(f"P2_eigen=\n{P2_eigen}")
print(f"P3_eigen=\n{P3_eigen}")
c = np.array([1, 2, 3, 4])
c_P = P @ c
c_P2 = P2 @ c
c_P3 = P3 @ c
print(f"c={c}")
print(f"c_P={c_P}")
print(f"c_P2={c_P2}")
print(f"c_P3={c_P3}")
print(f"a_circulant=\n{a_circulant}")
a_I = np.eye((4))
a_new = a_I * a[0] + P * a[1] + P2 * a[2] + P3 * a[3]
a_0 = a_I * a[0]
a_1 = P * a[1]
a_2 = P2 * a[2]
a_3 = P3 * a[3]
P4 = P3 @ P
print(f"a_I=\n{a_I}")
print(f"a_new=\n{a_new}")
print(f"a_circulant=\n{a_circulant}")
print(f"a_0=\n{a_0}")
print(f"a_1=\n{a_1}")
print(f"a_2=\n{a_2}")
print(f"a_3=\n{a_3}")
print(f"P4=\n{P4}")
m1 = np.array([3, 1, 2])
m2 = np.array([4, 6, 1])
m12_default = np.convolve(m1, m2)
m12_same = np.convolve(m1, m2, mode='same')
print(f"m12_default=\n{m12_default}")
print(f"m12_same=\n{m12_same}")
m1_circulant = Circulant_Matrix(m1)
get_m1_circulant = m1_circulant.get_circulant().T
m12_circulant = get_m1_circulant @ m2
print(f"m12_circulant ={m12_circulant}")
- 结果:
array:
[[2 5 1 0]
[0 2 5 1]
[1 0 2 5]
[5 1 0 2]]:
eigenvalue:
[ 8.+0.j 1.+5.j 1.-5.j -2.+0.j]
,eigenveotr:
[[-0.5+0.j -0.5-0.j -0.5+0.j 0.5+0.j ]
[-0.5+0.j -0. -0.5j -0. +0.5j -0.5+0.j ]
[-0.5+0.j 0.5+0.j 0.5-0.j 0.5+0.j ]
[-0.5+0.j 0. +0.5j 0. -0.5j -0.5+0.j ]]
P=
[[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
[1 0 0 0]]
P2=
[[0 0 1 0]
[0 0 0 1]
[1 0 0 0]
[0 1 0 0]]
P3=
[[0 0 0 1]
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
P_eigen=
array:
[[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
[1 0 0 0]]:
eigenvalue:
[-1.+0.j 0.+1.j 0.-1.j 1.+0.j]
,eigenveotr:
[[-0.5+0.j 0. -0.5j 0. +0.5j -0.5+0.j ]
[ 0.5+0.j 0.5+0.j 0.5-0.j -0.5+0.j ]
[-0.5+0.j -0. +0.5j -0. -0.5j -0.5+0.j ]
[ 0.5+0.j -0.5+0.j -0.5-0.j -0.5+0.j ]]
P2_eigen=
array:
[[0 0 1 0]
[0 0 0 1]
[1 0 0 0]
[0 1 0 0]]:
eigenvalue:
[ 1. -1. 1. -1.]
,eigenveotr:
[[ 0.707 0.707 0. 0. ]
[ 0. 0. -0.707 -0.707]
[ 0.707 -0.707 0. 0. ]
[ 0. 0. -0.707 0.707]]
P3_eigen=
array:
[[0 0 0 1]
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]:
eigenvalue:
[-1.+0.j 0.+1.j 0.-1.j 1.+0.j]
,eigenveotr:
[[-0.5+0.j 0. -0.5j 0. +0.5j -0.5+0.j ]
[ 0.5+0.j -0.5+0.j -0.5-0.j -0.5+0.j ]
[-0.5+0.j -0. +0.5j -0. -0.5j -0.5+0.j ]
[ 0.5+0.j 0.5+0.j 0.5-0.j -0.5+0.j ]]
c=[1 2 3 4]
c_P=[2 3 4 1]
c_P2=[3 4 1 2]
c_P3=[4 1 2 3]
a_circulant=
[[2 5 1 0]
[0 2 5 1]
[1 0 2 5]
[5 1 0 2]]
a_I=
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
a_new=
[[2. 5. 1. 0.]
[0. 2. 5. 1.]
[1. 0. 2. 5.]
[5. 1. 0. 2.]]
a_circulant=
[[2 5 1 0]
[0 2 5 1]
[1 0 2 5]
[5 1 0 2]]
a_0=
[[2. 0. 0. 0.]
[0. 2. 0. 0.]
[0. 0. 2. 0.]
[0. 0. 0. 2.]]
a_1=
[[0 5 0 0]
[0 0 5 0]
[0 0 0 5]
[5 0 0 0]]
a_2=
[[0 0 1 0]
[0 0 0 1]
[1 0 0 0]
[0 1 0 0]]
a_3=
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
P4=
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
m12_default=
[12 22 17 13 2]
m12_same=
[22 17 13]
m12_circulant =[25 24 17]
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)