2013-07-02 3 views
3

Я много исследовал это, но не смог найти практическое решение этой проблемы. Я использую scipy для создания разреженной матрицы csr и хочу вычесть эту матрицу из эквивалентной матрицы всех. В scipy и numpy обозначениях, если матрица не разрежена, мы можем сделать это, просто написав 1 - MatrixVariable. Однако эта операция не выполняется, если матрица разрежена. Я мог только думать о следующем очевидном решении:Как вычислить (1 - SparseMatrix) огромную разреженную матрицу?

перебирать всю разреженную матрицу, установите все нулевые элементы 1 и все ненулевые элементы в 0.

Но это было бы создать матрицу, где большинство элементов 1, и только некоторые из них равны 0, что больше не является разреженным и потому что его огромный размер не может быть преобразован в плотный.

Что может быть альтернативным и эффективным способом сделать это?

Спасибо.

+0

Что вы хотите сделать с этой '1-матрицей'? Возможно, это может быть достигнуто без создания этого промежуточного результата. – YXD

ответ

0

Вы можете получить доступ к данным из вашей разреженной матрицы как 1D array так, что:

ss.data *= -1 
ss.data += 1 

будет работать как 1 - ss для всех ненулевых элементов в разреженной матрице.

+0

Спасибо, но мне нужно использовать значения всех элементов разреженной матрицы. Например: f = средний ((1-ss) * vector) – bitspersecond

+0

Но таким образом вы используете все элементы разреженной матрицы. Использование 'ss.data' - это один из способов получить доступ и изменить их ... –

+0

ohh okay, позвольте мне попробовать ... – bitspersecond

1

Ваша новая матрица не будет редка, потому что он будет иметь 1 S везде, так что вам потребуется плотный массив для хранения его:

new_mat = np.ones(sps_mat.shape, sps_mat.dtype) - sps_mat.todense() 

Это требует, чтобы ваша матрица помещается в памяти. Это фактически требует, чтобы он вписывался в память 3 раза. Если это проблема, вы можете сделать ее более эффективной, делая что-то вроде:

new_mat = sps_mat.todense() 
new_mat *= -1 
new_mat += 1 
+0

спасибо, но матрица слишком велика, чтобы преобразовать в плотную. – bitspersecond

+1

@Bhanu Ну, все дело в том, что ваша матрица больше не будет скудной. Если вы хотите использовать эту новую матрицу в общей настройке, нет простого способа сделать это. Если, с другой стороны, вы ищете какое-то конкретное приложение, то, возможно, есть способ обойти его. Но, не зная, для чего вы этого хотите, мы не можем помочь. – Jaime

+0

Да, это правда. Фактически, новая матрица будет просто похожей на разреженную, но вместо множества 0, она будет иметь много 1 и очень мало 0. Я пытаюсь вычислить псевдо-правдоподобие в RBM theano, см. Метод: «get_pseudo_likelihood_cost в [link] (http://deeplearning.net/tutorial/rbm.html) – bitspersecond