Матрично-векторное умножение в методе Compressed Sparse Row в Pyspark - PullRequest
1 голос
/ 21 апреля 2019

Может ли кто-нибудь помочь мне с тем, как реализовать умножение матрицы на вектор в методе Compressed Sparse Row (CSR) в Pyspark & ​​Python?

y = A * X

Где представлено Aв формате CSR в трех матрицах Val, RowPtr и Col.Также X - это вектор.

Matrix A - это разреженная матрица, которая хранится в CSR с использованием трех массивов:

Val[N]: содержит значение ненулевых элементов

RowPtr[N]: содержит диапазон индекса строки ненулевых элементов (последний элемент в RowPtr - размер массива Val)

Col[N]: содержит индекс столбца ненулевых элементов

Вы можете обратиться к здесь и здесь , чтобы узнать больше о представлении матрицы CSR.

Алгоритм выглядит следующим образом:

Умножитьматрица (хранится с помощью метода Compressed Sparse Row) с вектором d[N]:

for (k = 0; k < N; k = k + 1)
    result[i] = 0;

for (i = 0; i < N; i = i + 1)
{  
    for (k = RowPtr[i]; k < RowPtr[i+1]; k = k + 1)
    {  
        result[i] = result[i] + Val[k]*d[Col[k]];
    }  
}


n = len(dense_matrix)

# res = dense X csr
csr_row = 0 # Current row in CSR matrix
for i in range(n):
start, end = row_ptr[i], row_ptr[i + 1]
for j in range(start, end):
    col, csr_value = col_idx[j], csr_values[j]
    for k in range(n):
    dense_value = dense_matrix[k][csr_row]
    res[k][col] += csr_value * dense_value
csr_row += 1

print res
...