◎前置概念
◎LIL(list of lists)
◎CSR(compressed sparse row)
◎LIL + CSR
- 當我們在做資料檢索時,如tf-idf、term count中,會發現這些matrix中只含有少量的非0數值,若document、word數量及大時,將其矩陣完整的存下來會導致Memory占用過多,甚至不夠。
- 此時便可以使用稀疏矩陣,不將0數值也存下來。
- 使用numpy的lil_matrix配合tocsr,進行一系列運作
◎LIL(list of lists)
A = lil_matrix((4, 4)) A[0, 0] = 1 A[1, 2] = 1 A[1, 3] = 2 A[2, 3] = 1 print(A.data) print(A.rows)
- lil_matrix.data : 每個row中非0之值(column 0 至 column n)
- lil_matrix.rows : 為每個row中非0之值,其位置的column值(column 0 至 column n)
- 型態皆為list
[list([1.0]) list([1.0, 2.0]) list([1.0]) list([])] [list([0]) list([2, 3]) list([3]) list([])]
◎CSR(compressed sparse row)
B = A.tocsr() print(B.data) print(B.indices) print(B.indptr)
- tocsr().data : row-major,非0之值
- tocsr().indices : row-major,其值非0之column位置
- tocsr().indptr : 從0開始,row-major,包含其row及其之前row,累計的非0數值總數
- 型態皆為numpy.ndarray
[ 1. 1. 2. 1.] [0 2 3 3] [0 1 3 4 4]
◎LIL + CSR
- 創建(使用LIL) : CSR加入元素,會需要知道indptr,而indptr需要累加,因此會比LIL慢
- 運算(使用CSR) : 由於CSR型態將list轉為ndarray,ndarray的運算會比list快(原因)
留言
張貼留言