티스토리 뷰

교육/AIFFEL(대전)1기

[E08] CSR Matrix

무엇보다_빛나는_샤트 2022. 2. 17. 00:13

2021.2.26 16:07

 

안녕하세요

프로그래밍을 배우는 빛나는 샤트입니다.

 

먼저 CSR Matrix 개념을 이해하게 도와준 @vg-rlo님께 감사함을 표합니다.

 

추천시스템을 구축하다 보면 만나게 되는 개념인 CSR Matrix이다.

 

CSR Matrix?

Matrix는 알아! 행렬이잖아.

앞에 CSR은 뭘까....?

 

뜻은 바로 Compressed Spared Row이다.

압축된 Sparsed 행?

 

뭔지 잘 모르겠지만 행을 압축하는 것 같다.

압축? 알짜 내용만 알고 싶은 건가?

라는 생각이 든다.

 

그럼 Sparsed는 뭘까?

 

Sparse(희소): 수학에서는 대부분이 0으로 나타내진다.

쉽게 예시를 보면서 설명하면,

출처: https://ko.wikipedia.org/wiki/희소행렬

즉, 희소행렬이란 행렬의 값이 대부분 0인 상태인 행렬을 말한다!

 

마지막으로 정리!

Compressed Spared Row는 희소한 상태의 행을 압축! 했다고 이해하자(일단 넘어가)

 

1. 왜 압축하지?

추천 시스템 모델을 만들기 위해서는 Matrix Factorization을 해야 하는데

Matrix Factorization 알아보기: [Exploration] E08 영화 추천 시스템 (tistory.com)

 

[Exploration] E08 영화 추천 시스템

2021.2.19 16:50 안녕하세요 프로그래밍을 배우는 빛나는 샤트입니다. AIFFEL 대전 1기 Explortaion 8. 영화 추천 시스템 *프로젝트 소개: 추천 시스템을 이용해 내가 좋아하는 아티스트(영화)와 관련된

shinest-programming.tistory.com

예시: 영화 추천 시스템

아래처럼 사용자와 영화가 행과 열로 이루어진 행렬로 나타낼 수 있는데

만약 영화개수가 5만개 있다고 해보자. 하지만 사용자 A는 5개만 시청했다.

사용자 A 는 5개의 열(영화)에 대해서만 값이 있고 나머지는 0이다. (희소 행렬)

이는 굉장한 성능 저하를 일으킨다. 이를 해결하기 위해 압축을 하는 것!!

 

2. 하는 방법?

출처:  https://rfriend.tistory.com/551

 

[code 구현]

import numpy as np
from scipy.sparse import csr_matrix

data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
row = np.array([0, 0, 1, 1, 1, 3, 3, 4])
col = np.array([1, 3, 1, 2, 3, 0, 3, 1])

csr_mat3 = csr_matrix((data, (row, col)), shape=(5, 4))

print('data:', csr_mat3.data)        # data: [1 2 3 4 5 6 7 8]
print('indptr:', csr_mat3.indptr)    # indptr: [0 2 5 5 7 8] 
print('indices:', csr_mat3.indices)  # indices: [1 3 1 2 3 0 3 1]

print(csr_mat3)
  # (0, 1)  1
  # (0, 3)  2
  # (1, 1)  3
  # (1, 2)  4
  # (1, 3)  5
  # (3, 0)  6
  # (3, 3)  7
  # (4, 1)  8

scipy.sparse에서 crs_matrix를 불러온다.

csr_mat3 = csr_matrix((변경할 행렬, (행, 열)), 모양=(값,값))으로 표현하며 의미는

 

csr_matrix((data, (row, col)), shape=(5, 4))의 코드 의미는 아래와 같다.

data = [1,2,3,4,5,6,7,8]를 CSR 행렬(형태=(5,4))로 변형해라 (행=[0,0,1,1,1,3,3,4], 열=[1,3,1,2,3,0,3,1])
data안의 인자는 새로운 행과 열 번호를 받아 재배치되며 비어있는 값은 0으로 처리한다.

 

자세한 설명은 아래와 같다.

 

csr_matrix의 출력해보면 아래와 같은데

1은 (0,1)
2는 (0,3)
3은 (1,1)
4는 (1,2)
5는 (1,3)
6은 (3,0)
7은 (3,3)
8은 (4,1)


여기서 2행에는 어떤 값도 할당되지 않아 모두 0이 된 것을 확인할 수 있다.

재배열한 행렬은 아래와 같다.

[[0,1,0,2,0],
[0,3,4,5,0],
[0,0,0,0,0],
[6,0,0,7,0],
[0,8,0,0,0]]

 

indptr은 '행을 기준으로 했을 때 행별로 '0'이 아닌 원소가 처음 시작하는 위치의 배열'이므로 아래와 같이 구할 수 있다.

 

row col
----------0
0 1
0 3
----------2
1 1
1 2
1 3
----------5
----------5
3 0
3 3
----------7
4 1
----------8

 

위 그림과 같이 [0,2,5,5,7,8]로 나온 것을 알 수 있다. (코드 결과와 동일) 여기서 2행은 모두 0이기 때문에 5가 반복되었다.

 

 

 

당신의 빛나는 코딩을 응원합니다.

 

피드백은 항상 환영합니다.

LIST
댓글