Я пытаюсь построить матрицу биаджентности и найти ее собственные значения. Из-за того, как создается набор данных, столбцы и номера строк являются беспристрастными. Это заставляет размер матрицы взорваться. Как я мог очистить полностью пустые строки и столбцы от разреженной матрицы? Остальные строки и столбцы должны быть отредактированы условно.Уменьшите разреженную матрицу в 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
На самом деле известно, какие строки и столбцы отличны от нуля из-за способа создания матрицы. Эта информация хранится в строках и столбцах в моем примере. Это то, что вы используете в части A [J,:] [:, I]? Расчет I, J занимает некоторое время, я думаю, что это необходимо вообще. – Diego
'I' и' J' - это только те столбцы и строки, которые я хочу сохранить. Неважно, как они получены. – hpaulj
просто для того, чтобы сохранить это здесь, поскольку он обсуждает расширенный срез http://stackoverflow.com/questions/14491548/scipy-do-sparse-matrices-support-advanced-indexing – Diego