2015-03-04 5 views
0

Я пытаюсь построить матрицу биаджентности и найти ее собственные значения. Из-за того, как создается набор данных, столбцы и номера строк являются беспристрастными. Это заставляет размер матрицы взорваться. Как я мог очистить полностью пустые строки и столбцы от разреженной матрицы? Остальные строки и столбцы должны быть отредактированы условно.Уменьшите разреженную матрицу в python, созданную из списков несмежных координат

Предметная область - покупатели и продавцы и их покупки. Покупатели и продавцы представлены с помощью случайного целочисленного идентификатора. Эти идентификаторы недопустимы. Набор данных представляет собой список всех покупок в виде buyer_ID, seller_ID-списка в форме CSV.

вот мой код

from sympy import * 
import scipy 
import csv 
rows=[] 
cols=[] 
data=[] 
with open('dataset.txt', 'rt') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',')    
    next(reader, None) # skip the headers 
    for row in reader:  
     rows.append(int(row[0])) 
     cols.append(int(row[1])) 
     data.append(1.0) # values were absent in the list of edges 
print(len(rows)) 
print(len(set(rows))) 
print(len(cols)) 
print(len(set(cols))) 
edges_matrix = coo_matrix((data,(rows,cols))) 
print(edges_matrix.get_shape()) 
biajacency_matrix=bmat([[None,edges_matrix],[edges_matrix.transpose(),None]]) 
print(biajacency_matrix.get_shape()) 
scipy.sparse.linalg.eigen.eigsh(biajacency_matrix,3,which='LM') 

Есть 303987 строк в моем наборе, 50385 покупатели и продавцы 125854. Но поскольку идентификаторы имеют больший диапазон, созданная edge_matrix имеет размер (215115110, 215117581).

Моя биаяценция (очень редкая квадратная) матрица становится размером 430232691 , а функции собственных значений eigsh терпят неудачу с ошибкой памяти. Фактически большинство его столбцов и строк полностью пусто.

Как я могу легко вознаградить покупателей и продавцов, чтобы уменьшить размер матрицы биаджентности до 50385 + 125854 = 176249? Другими словами, оставить только строки, имеющие хотя бы одно значение.

Я мог бы сделать то же самое в базе данных, создав таблицу словаря и присоединившись к исходному набору данных для замены идентификаторов. Но может быть, это может быть сделано проще в Python?

РЕШЕНИЕ:

baj_m=biajacency_matrix.tocsr()[list(set(rows)),:][:,list(set(cols))] # drop all zero rows and columns 

ответ

0

Вот простой пример удаления как пустые строки и пустые столбцы из разреженной матрицы.

A=sparse.rand(100,100,format='csr') 
I=np.nonzero(A.sum(0))[1].A.flatten() 
J=np.nonzero(A.sum(1))[0].A.flatten() 

I и J являются индексы столбцов и строк, по меньшей мере, одно значение (или технически подводить! = 0, что то же самое для поплавков).

A 
<100x100 sparse matrix of type '<class 'numpy.float64'>' 
    with 100 stored elements in Compressed Sparse Row format> 

A[J,:][:,I] 
<64x62 sparse matrix of type '<class 'numpy.float64'>' 
    with 100 stored elements in Compressed Sparse Row format> 

Уменьшенная матрица имеет такое же количество ненулевых элементов, но в уменьшенной форме.

Это не полное решение для вашего случая, но я думаю, что это дает вам инструмент, который можно адаптировать.

Обратите внимание, что только некоторые из разреженных форматов позволяют индексировать это. К счастью, те, которые хороши для вычислений по собственным значениям, также реализуют индексирование.

+0

На самом деле известно, какие строки и столбцы отличны от нуля из-за способа создания матрицы. Эта информация хранится в строках и столбцах в моем примере. Это то, что вы используете в части A [J,:] [:, I]? Расчет I, J занимает некоторое время, я думаю, что это необходимо вообще. – Diego

+0

'I' и' J' - это только те столбцы и строки, которые я хочу сохранить. Неважно, как они получены. – hpaulj

+0

просто для того, чтобы сохранить это здесь, поскольку он обсуждает расширенный срез http://stackoverflow.com/questions/14491548/scipy-do-sparse-matrices-support-advanced-indexing – Diego