我是 slepc4py 和 petsc4py(以及一般的 SLEPc 和 PETSc)的新手,我有一些基本问题。如果这些问题在某个地方得到了回答,我深表歉意——我已经环顾了一段时间,运气不佳。如果您知道其中一个(或多个)问题的答案,我将非常感谢您的洞察力。或者,如果您可以向我指出一些我应该参考的资源,我也将不胜感激。
我正在尝试使用 petsc4py 和 slepc4py 为相对较大的数据集实现谱聚类。涉及的步骤如下(解释 Ulrike von Luxburg 的光谱聚类教程):
- 假设我们有一个由加权邻接矩阵 W 表示的相似图,计算非归一化图拉普拉斯算子,L = D - W,其中 D 是包含每个节点的度数的对角矩阵。
- 计算 L 的前 k 个特征向量。设 U 是包含这些向量作为列的矩阵。
- U 的每一行现在代表 k 维空间中的一个点。使用 k-means 算法对这些点进行聚类。
我的问题如下:
1. 组装 PETSc 稀疏矩阵的最佳方法是什么?我有一个文件,其中包含存储为 3 元组 (i, j, val) 的矩阵的非零条目。我尝试在 slepc4py 附带的 ex1.py 中的示例之后对矩阵组件进行建模,方法是执行以下操作:
A = PETSc.Mat()
A.create()
A.setSizes([max_i, max_j])
A.setUp()
for line in file:
# split line, etc
A[i,j] = val
A.assemble()
这花费了非常长的时间来完成。我更成功地从文件创建了一个 scipy 稀疏数组,然后使用 PETSc.Mat().createAIJ(scipy_mat) 从 scipy 矩阵创建一个 PETSc 矩阵。我以正确的方式接近这个吗?
2. 计算图拉普拉斯算子的最佳方法是什么?在相关说明中,一旦我加载了加权邻接矩阵,就不清楚我应该如何组装图拉普拉斯算子。在 Matlab 或 scipy 中,我会遍历行,将行中边缘的权重相加以获得对角元素等。这种想法是否适合 PETSc 矩阵,或者我应该以不同的方式解决这个问题?
3. 如何从特征向量创建 U 矩阵?按照 slepc4py 附带的示例,我能够为我的样本矩阵计算前 k 个特征值/特征向量。该示例显示了如何打印出特征值。在特征问题解决后如何使用特征向量就不太清楚了。在 Matlab 或 scipy 中创建一个以特征向量为列的矩阵很简单。是否可以将一堆 PETSc Vector 对象粘在一起来制作一个 PETSc 矩阵?我没有找到任何暗示它的东西,但我也找不到任何其他好的方法来做到这一点。
提前感谢您提供的任何帮助!
干杯,-罗伯