性能问题,使用亲和矩阵聚类,特征值

BBD*_*Sys 5 python numpy image-processing linear-algebra

我试图在图像上使用谱聚类.我首先计算亲和度矩阵,然后尝试获得特征向量.但是,在7056x7056矩阵上,eig()调用时间过长.关于如何改进这个的任何建议?也许我应该使用不同形式的亲和力?

import matplotlib.pyplot as plt
import numpy as np

Img = plt.imread("twoObj.bmp")
Img2 = Img.flatten()
(n,) = Img2.shape
A = np.subtract.outer(Img2, Img2)
V,D = np.linalg.eig(A)
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 4

一种快速且简单的优化方法是使用np.linalg.eigh. (np.linalg.eigvalsh如果您只想要特征值。)

因为你有一个对称矩阵(假设你取绝对值),所以你可以“告诉”numpy 以这种方式使用更有效的算法。

import numpy as np
x = np.random.random(1000)
A = np.subtract.outer(x, x)
A = np.abs(A)
w, v = np.linalg.eigh(A)
Run Code Online (Sandbox Code Playgroud)

比较时间,eigh需要约 5.3 秒,而eig需要约 23.4 秒。

等的性能np.linalg.eig将很大程度上取决于 numpy 链接到的库。使用高度优化的 blas 库(例如 ATLAS 或 Intel 的 MKL)可以产生非常显着的差异,尤其是在这种情况下。

另外,根据 numpy 的构建方式(例如 fortran 编译器是否可用)scipy.linalg.eigh等可能会更快。scipy 和 numpy 也有可能与不同的 blas 库链接,尽管这种情况不太可能发生。