我正试图转换基于马哈拉诺比斯距离的方法,该方法适用于图像到我的代码,必须处理时间序列。这是Matlab代码,其中用户传递图像作为输入,然后首先重塑它,然后计算平均值,协方差矩阵及其逆(他使用图像大小):
function out = rxd(X)
% X input size = (126, 150, 204)
sizes = size(X);
X = reshape(X, [sizes(1)*sizes(2), sizes(3)]);
% X input size = (18900, 204)
M = mean(X);
% M size = (1, 204)
C = cov(X);
% M size = (204, 204)
Q = inv(C);
% M size = (204, 204)
这是我的代码,在这里我用Python实现了第一部分。我没有图像,而是一个时间序列,其形状为(24230,30),这就是为什么我避免了重塑部分:
import os
import numpy as np
X = np.load('dataset.npy')
# dataset shape: (24230, 30)
# 1. Calculate the mean of the matrix
M = np.mean(X, axis=0) # shape = (30,)
# 2. Calculate the Covariance matrix
C = np.cov(X) #shape = (24230, 24230)
# 3. Calculate the inverse of the Covariance matrix
Q = np.linalg.inv(C) #Error
如果我试着运行它,我得到错误:
LinAlgError:奇异矩阵
有什么问题吗?我注意到Matlab输出的唯一区别是平均形状,但我不明白我的转换是否错了。
忽略MATLAB的一切,你的协方差矩阵C
不能被反转;根据定义,这意味着矩阵C
是"奇异的",因此有Singular Matrix
误差。(所以这不是关于代码,而是关于数据)。
如果你想计算这个矩阵的逆,伪逆函数np.linalg.pinv
可以做到这一点;但是一定要明白你为什么这么做。