在哪种情况下会使用另一个矩阵而不是单位矩阵来寻找特征值?



scipy.linalg.eigh函数可以取两个矩阵作为参数:一个是矩阵a,我们将从中找到特征值和特征向量;另一个是矩阵b,它是可选的,如果它是空的,就选它作为单位矩阵。在什么情况下会有人想使用这个b矩阵?

更多的上下文:我正试图使用pyRiemann包中的xdawn协方差。这使用了scipy.linalg.eigh函数和一个协方差矩阵a和一个基线协方差矩阵b。您可以在这里找到实现。这会产生一个错误,因为在我的情况下,b矩阵不是正确定性的,因此不能在scipy.linalg.eigh函数中使用。然而,去掉这个矩阵,只使用单位矩阵解决了这个问题,并产生了相对不错的结果……问题是我并不真正明白我改变了什么,也许我正在做一些我不应该做的事情。

这是我正在使用的pyRiemann包中的代码(修改以避免使用包中其他部分定义的函数):

# X are samples (EEG data), y are labels
# shape of X is (1000, 64, 2459)
# shape of y is (1000,)
from scipy.linalg import eigh
Ne, Ns, Nt = X.shape
tmp = X.transpose((1, 2, 0))
b = np.matrix(sklearn.covariance.empirical_covariance(tmp.reshape(Ne, Ns * Nt).T))
for c in self.classes_:
# Prototyped response for each class
P = np.mean(X[y == c, :, :], axis=0)
# Covariance matrix of the prototyper response & signal
a = np.matrix(sklearn.covariance.empirical_covariance(P.T))
# Spatial filters
evals, evecs = eigh(a, b)
# and I am now using the following, disregarding the b matrix:
# evals, evecs = eigh(a)

如果A和B都是对称矩阵,这并不一定意味着inv(A)*B一定是对称矩阵。因此,如果我必须解决Ax= Bx的广义特征值问题,那么我将使用eig(a,B)而不是eig(inv(a)*B),这样对称性就不会丢失。

一个实际应用是从M (d²x/dt²)= Kx形式的微分方程中找到动态机械系统的固有频率,其中M是一个正定矩阵,称为质量矩阵,K是刚度矩阵,x是位移矢量,d²x/dt²是加速度矢量,加速度矢量是位移矢量的二阶导数。为了求出固有频率,可以用x0 sin(ωt)代替x,其中ω是固有频率。方程化简为Kx = ω²Mx。现在,可以使用eig(inv(K)*M),但这可能会破坏生成矩阵的对称性,所以我将使用eig(K,M)代替。

A - lambda B x则表示x与协方差矩阵不在同一基中。

如果矩阵不是定正的这就意味着存在可以被b翻转的向量

希望对你有帮助。

相关内容

  • 没有找到相关文章

最新更新