2016-09-24 3 views
1

Когда разреженная матрица генерируется scipy.sparse.rand, она может быть единственной. Фактически, приведенный ниже код вызывает ошибку "RuntimeError: superlu failure (singular matrix?) at line 100 in file scipy/sparse/linalg/dsolve/SuperLU/SRC/dsnode_bmod.c".Генерировать неособенную разреженную матрицу в Python

dim = 20000 
ratio = 0.000133 

A = scipy.sparse.rand(dim,dim,ratio) 
inv_sparse = scipy.sparse.linalg.inv(A) 

Есть ли способ генерации неособенной разреженной матрицы?

Я действительно хочу сравнить производительность (время процесса) scipy.sparse.linalg.inv с np.linalg.inv. Вот почему мне нужна генерация случайной разреженной матрицы, которая не является сингулярной.

+1

Комментарии здесь могут помочь http://math.stackexchange.com/questions/449396/getting-non-singular-invertible-matrix-from-a-singular-one вы также можете просто проверить определитель, а затем сделать инверсию ... Или сгенерировать их и обрабатывать исключения ... Возможно, заранее создавайте случаи, которые, как известно, являются неособенными. – tenCupMaximum

+1

Является ли он сингулярным, потому что 2 или более строк или столбцов равны нулю? Это возможно, если плотность достаточно низкая. – hpaulj

+2

Попробуйте добавить 'sparse.eye (A.shape [0])' к нему. – hpaulj

ответ

2

Плотность ratio = 0.000133 вашей матрицы очень низкая. Это означает, что около одного элемента из 7518 не является нулевым. Следовательно, вероятность того, что каждый член будет равен нулю, составляет около 7517/7518.

Каждая строка состоит из 20000 независимых терминов. Таким образом, вероятность того, что строка будет равна нулю, равна (7517/7518)^20000 = 6,99%. Следовательно, вероятность того, что строка не равна нулю, равна 1- (7517/7518)^20000 = 93,0%.

Затем матрица выполнена из 20000 рядов. Строки можно считать независимыми. Следовательно, вероятность того, что матрица не содержит нулевых строк, равна (1- (7517/7518)^20000)^20000 = (93,0%)^20000. Эта вероятность очень низкая.

Поскольку матрица, вероятно, содержит нулевую строку, она часто является единственной.

Кроме того, из-за ограниченной точности чисел с плавающей запятой программы часто рассматривают плохо сконструированные матрицы как сингулярные. Действительно, в таких случаях вычисленный обратный будет очень неточным и бессмысленным.

Наконец, чтобы сравнить обратную функцию, лучше использовать матрицы, которые, как известно, обратимы ... По крайней мере, вы можете попытаться увеличить плотность, чтобы вероятность нулевой строки стала очень низкой.

Смежные вопросы