我的问题是:我正在尝试通过(截断的)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的变化。 / p>
如果我能够象征性地计算协方差矩阵并在事后指定一个,那么这很容易做到。但是,对于大型矩阵,这不是一个合理的选择。另一种方法是找到一种方法来跟踪numpy.linalg.eigh()返回的每个特征向量。不幸的是,numpy似乎正在对它们进行重新排序,以便始终首先列出最小的特征值;这意味着,当我改变a时,特征向量会被无法预测地重新排序,并且点积numpy.dot(v,z * w ^ 0.5)不再将相同的系数分配给相同的特征向量。
有解决方法吗?
(这是ASKSAGE的一个交叉帖子。我的实施是使用Sage,但由于问题不是Sage特定的,因为这里似乎有更多活动,我以为我会重新发布。如果交叉发布,我很抱歉不接受;若是,请删除此。)
编辑:根据下面的对话,我看到我需要添加有关此问题性质的更多详细信息。
Karhunen-Loeve变换背后的想法是在频谱上分解随机过程R(x),如下所示:
R(x)= \ sum_ {i} Z_i \ lambda_i ^ {1/2} \ phi ^ {(i)}(x),
其中每个Z_i是i.i.d.具有标准正态分布的随机变量,每个\ phi ^ {(i)}(x)是由协方差矩阵的特征向量的解决定的x的非随机函数,并且每个\ lambda_i是与之相关联的对应特征值。 \披^ {(I)}。
为了证明R对参数a的依赖性,我需要能够唯一地为每个\ phi ^ {(i)}分配系数Z_i。无论我如何进行此分配,因为所有Z都是相同分布的,但分配需要是唯一的,并且它不能取决于\ lambda_i的相应值,因为这将取决于参数a。
分析解决方案很简单:只计算任意a的特征向量和特征值,通过指定我的Z选择R的特定实现,并观察R的实现如何依赖于a。 (对于玩具模型,R通常会随着增加而变得更快。)
这里的问题是如何以数字方式实现这一点。 Numpy在计算时显然会扰乱特征向量,因此没有办法对它们进行唯一标记。我猜这样做的唯一方法是深入挖掘底层代码并专门实现某种类型的任意标记函数。
简单地说明问题:我需要一种方法来排序由numpy产生的特征向量,它不依赖于相关特征值的大小。
有办法做到这一点吗?
更新 我已经设法找到了这个问题的部分答案,但我需要做更多的研究以获得完整的答案。看起来我将不得不为此实现我自己的算法。
对于我正在考虑的类型的矩阵,Lanczos算法(对于给定的初始向量选择)是确定性的,并且步骤不依赖于我的参数的选择。这给了我一个对称的三对角矩阵来解决特征值。
分而治之可能在这里起作用。似乎我可以实现它的一个版本,这将允许我跟踪独立于相关特征值的特征向量。至少,“划分”部分可以以确定性的,与参数无关的方式实现,但我需要更多地了解算法的“征服”部分以确定。
答案 0 :(得分:1)
经过一番研究,我已经设法找到了这个问题的两个部分答案。
首先,对于没有零特征向量的真实对称矩阵(可能还需要指定非简并),生成一个算法来解决特征对问题应该是可行的,该算法以固定顺序生成特征对独立于矩阵的选择。给定一个恒定的起始向量,Lanczos algorithm将以确定的方式为任意实对称矩阵产生三对角矩阵。 divide-and-conquer algorithm的“除”部分同样是确定性的,这意味着迭代次数依赖于矩阵元素值的算法的唯一部分是“征服”部分,解决了世俗方程式:
1+ \ sum_j ^ m w_j ^ 2 /(d_j- \ lambda)= 0
因此,对于每个2x2块,问题归结为如何以实际上不依赖于原始矩阵的值的方式对世俗方程的两个根进行排序。
第二个部分解决方案更容易实现,但更容易失败。回想起来,这也很明显。
相同矩阵的两个不同的特征向量将始终彼此正交。因此,如果特征向量作为单个参数a的函数平滑地变化,那么:
v_i(a).v_j(a + da)= \ delta_ {ij} + O(da)
因此,当参数a变化时,这给出了特征向量之间的自然映射。
这类似于David Zwicker和jorgeca提出的测量特征向量对之间的全局距离的想法,但更容易实现。然而,在特征向量快速变化的区域或参数a的变化太大的情况下,这种情况的实现将容易失败。
此外,在特征值的交叉处发生的问题很有意思,因为在每次这样的交叉处,系统变得简并。然而,在跨越简并的允许特征向量集合中,将有两个满足点积条件并且可以用作跨越简并的基础,从而保持映射。
当然,这是假设将特征向量视为参数空间上的平滑连续函数是正确的,正如jorgeca所指出的那样,我不确定是否可以假设。
答案 1 :(得分:0)
如果我理解你正在寻找由实数变量t的连续函数的条目给出的矩阵A(t)的特征值\ lambda(t)。
我建议你查阅书籍:
[1] R. Bathia:矩阵分析,Springer。第六章?
[2] T. Kato:线性算子扰动理论的简短介绍,第二章的定理5.2。
[3] D. Hinrichsen,A。Pritchard:数学系统理论,Vol。 1,推论4.1.19。