如何区分Python或Matlab是否错误?

如何区分Python或Matlab是否错误?,python,matlab,svd,eigenvalue,eigenvector,Python,Matlab,Svd,Eigenvalue,Eigenvector,我正在尝试使用SVD和特征分解进行一些使用动态模式分解的数据分析。我遇到了一个简单的问题,即从Matlab和Python获得不同的结果。我很困惑,不知道为什么Python会给我错误的结果/矩阵值,但一切看起来(我认为)都是正确的 因此,这次我没有使用真实数据,而是查看大型数据集,而是生成了数据。我将尝试在特征分解后查看特征值图。我还对数据使用延迟嵌入,因为我将使用一个仅为(2x100)的数据向量,所以我将执行一种Hankel矩阵,以10个延迟来丰富数据 全部清除;全部关闭;clc; 数据=lin

我正在尝试使用SVD和特征分解进行一些使用动态模式分解的数据分析。我遇到了一个简单的问题,即从Matlab和Python获得不同的结果。我很困惑,不知道为什么Python会给我错误的结果/矩阵值,但一切看起来(我认为)都是正确的

因此,这次我没有使用真实数据,而是查看大型数据集,而是生成了数据。我将尝试在特征分解后查看特征值图。我还对数据使用延迟嵌入,因为我将使用一个仅为(2x100)的数据向量,所以我将执行一种Hankel矩阵,以10个延迟来丰富数据

全部清除;全部关闭;clc;
数据=linspace(1100);
data2=linspace(2101);
数据=[数据;数据2];
numDelays=10;
relTol=10^-6;
%%为DMD创建第一个和第二个快照矩阵。是否有缺少的列
%没有使用数据。
disp('构造数据矩阵:')
X=零((numDelays+1)*大小(数据,1),大小(数据,2)-(numDelays+1));
Y=零(尺寸(X));
对于i=1:numDelays+1
X(1+(i-1)*大小(数据,1):i*大小(数据,1),:)=。。。
数据(:,(i):大小(数据,2)-(numDelays+1)+(i-1));
Y(1+(i-1)*大小(数据,1):i*大小(数据,1),:)=。。。
数据(:,(i+1):大小(数据,2)-(numDelays+1)+(i));
结束
[U,S,V]=svd(X);
r=查找(诊断>诊断(1,1)*重新选择,1,'last');
disp(['DMD子空间维数:',num2str(r)])
U=U(:,1:r);
S=S(1:r,1:r);
V=V(:,1:r);
Atil=(U'*Y)*V*(S^-1);
[what,lambda]=eig(Atil);
φ=(Y*V)*(S^-1)*什么;
Keigs=diag(λ);
tt=linspace(0,2*pi,101);
图形
情节(真实的(凯格斯),意象的(凯格斯),‘ro’)
等等
地块(cos(tt)、sin(tt),“--”)
将scipy.io导入为sc
导入数学为m
将numpy作为np导入
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
导入系统
从numpy导入点、乘、对角、幂、π、exp、sin、cos、cosh、tanh、real、imag
从scipy.linalg导入expm、sinm、cosm、分数矩阵、svd、eig、inv
def dmd(X、Y、relTol):
U2,Sig2,Vh2=输入矩阵的奇异值分解(X,假)#奇异值分解
S=np.zeros((Sig2.shape[0],Sig2.shape[0])#基于S的对角线创建带零的S矩阵
np.fill_对角线(S,Sig2)#用非零值填充S矩阵的对角线
r=np.count_非零(np.diag(S)>S[0,0]*relTol)#秩截断
U=U2[:,:r]
Sig=diag(Sig2)[:r,:r]#GOOD=)
V=Vh2.conj().T[:,:r]
Atil=dot(dot(dot(U.conj().T,Y),V),inv(Sig))#构建一个平铺图
打印(Atil)
mu,W=eig(Atil)
φ=点(点(点(Y,V),inv(Sig)),W)#构建DMD模式
返回μ,Phi
data=np.array([(np.linspace(1100100)),(np.linspace(2101100))]
Data=np.array(数据)
#########选择延迟次数###########
#可观察(特征点坐标)。设置为零仅表示
#将使用实验观测值。
numDelays=10
relTol=10**-6
##########为DMD创建数据矩阵###############
#为DMD创建第一个和第二个快照矩阵。是否有缺少的列
#没有使用数据。
X=np.zero(((numDelays+1)*data.shape[0],data.shape[1]-(numDelays+1)))
Y=np.零(X.形)
对于范围内的i(1,numDelays+2):
X[0+(i-1)*Data.shape[0]:i*Data.shape[0],:]=Data[:,(i):Data.shape[1]-(numDelays+1)+(i-0)]
Y[0+(i-1)*Data.shape[0]:i*Data.shape[0],:]=Data[:,(i+0):Data.shape[1]-(numDelays+1)+(i)]
Keigs,Phi=dmd(X,Y,relTol)
tt=np.linspace(0,2*np.pi,101)
plt.图()
plt.plt(np.cos(tt),np.sin(tt),'--')
plt.plot(Keigs.real,Keigs.imag,'ro')
产品名称(“DMD特征值”)
plt.xlabel(r'Real$\lambda$)
plt.ylabel(r'virtual$\lambda$)
#plt.axes().set_aspect('equal')
plt.show()
在matlab和python中,我得到的特征值都位于单位圆上(正如预期的那样),我得到的正好是一个,位于1

所以当我看SVD中的矩阵时,问题来了,它们似乎有不同的值。唯一相同的矩阵是“S”或“Sig”矩阵。其余部分将不同于数字或+/-符号。我最感兴趣的是Atil矩阵。 在matlab中,它看起来像, [1.0157,-0.3116;7.91229e-4,0.9843] 看起来像是蟒蛇, [1.0,-4.508e-15;-4.439e-18,1.0]


由于数值误差,这可能看起来有点不对劲,但当我查看实际数据时,这些数据不同,这会打乱我的分析。

非方矩阵的奇异值在U和V中不是唯一的。即使你有一个非零、非退化奇异值的方矩阵,U和V中的奇异向量在符号因子下也是唯一的。

此外,Matlab(LAPACK+BLAS)和scipy.linalg.svd可能会使用不同的svd算法。
这可能导致您所经历的差异

所以特征向量不是唯一的,所以在这个分析中,当我进行特征分解时,特征值是不同的。当我的意思不同时,Matlab中的虚部是+而Python中的虚部是-。当绘制在单位圆上时,这将翻转我的特征值。这与V矩阵如何翻转符号值有关。有什么方法可以避免这种情况吗?从我的角度来看,你需要确保他们使用完全相同的算法和相同的参数选择。我将研究Python的不同svd实现(查看scipy.sparse.linalg.svd和其他),并尝试匹配Matlab的实现。