我的问题是这样的:我正在尝试通过(截断的)Karhunen-Loeve变换对随机过程进行频谱分解,但是我的协方差矩阵实际上是一个1参数矩阵矩阵,我需要一种方法来估算/可视化我的随机过程取决于此参数。为此,我需要一种跟踪numpy.linalg.eigh()产生的特征向量的方法。
为了让您了解我的问题,这里有一个示例玩具问题:假设我有一组点{xs},并且随机过程R的协方差C(x,y)= 1 /(1 + a *(xy) ^ 2),取决于参数a。对于[0,1]范围内的网格点的随机样本和给定的a(例如a = 1)选择,我可以填充协方差矩阵并使用以下方法实现Karhunen-Loeve变换:
num_x = 1000
xs = numpy.array([numpy.random.uniform() for i in range(num_x)])
z=numpy.random.standard_normal(num_x)
a0=1
def cov(x,y,a=a0): return 1/(1+a*(x-y)^2)
cov_m = numpy.array(map(lambda y: map(lambda x: cov(x,y),xs),xs))
w,v=numpy.linalg.eigh(cov_m)
R=numpy.dot(v,z*w^0.5)
这将使我认识到R的值是在每个随机网格点xs上定义的值。但是,我需要做的是-对于特定的实现(这意味着我的网格xs和我的随机系数z的特定选择)-跟踪R如何相对于我的协方差函数中的参数a发生变化。
如果我可以用符号方式计算协方差矩阵并在事后指定a,那么这将很容易做到。但是,对于大型矩阵,这不是一个可行的选择。另一种方法是找到一种方法来跟踪numpy.linalg.eigh()返回的每个特征向量。不幸的是,numpy似乎正在对它们进行重新排序,以便始终总是首先列出最小的特征值。这意味着,当我改变a时,特征向量将发生不可预测的重新排序,并且点积numpy.dot(v,z * w ^ 0.5)不再为相同的特征向量分配相同的系数。
有没有解决的办法?
江户川乱折腾
翻翻过去那场雪
相关分类