티스토리 뷰
2021.2.26 16:07
안녕하세요
프로그래밍을 배우는 빛나는 샤트입니다.
먼저 CSR Matrix 개념을 이해하게 도와준 @vg-rlo님께 감사함을 표합니다.
추천시스템을 구축하다 보면 만나게 되는 개념인 CSR Matrix이다.
CSR Matrix?
Matrix는 알아! 행렬이잖아.
앞에 CSR은 뭘까....?
뜻은 바로 Compressed Spared Row이다.
압축된 Sparsed 행?
뭔지 잘 모르겠지만 행을 압축하는 것 같다.
압축? 알짜 내용만 알고 싶은 건가?
라는 생각이 든다.
그럼 Sparsed는 뭘까?
Sparse(희소): 수학에서는 대부분이 0으로 나타내진다.
쉽게 예시를 보면서 설명하면,
즉, 희소행렬이란 행렬의 값이 대부분 0인 상태인 행렬을 말한다!
마지막으로 정리!
Compressed Spared Row는 희소한 상태의 행을 압축! 했다고 이해하자(일단 넘어가)
1. 왜 압축하지?
추천 시스템 모델을 만들기 위해서는 Matrix Factorization을 해야 하는데
Matrix Factorization 알아보기: [Exploration] E08 영화 추천 시스템 (tistory.com)
예시: 영화 추천 시스템
아래처럼 사용자와 영화가 행과 열로 이루어진 행렬로 나타낼 수 있는데
만약 영화개수가 5만개 있다고 해보자. 하지만 사용자 A는 5개만 시청했다.
사용자 A 는 5개의 열(영화)에 대해서만 값이 있고 나머지는 0이다. (희소 행렬)
이는 굉장한 성능 저하를 일으킨다. 이를 해결하기 위해 압축을 하는 것!!
2. 하는 방법?
[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가 반복되었다.
당신의 빛나는 코딩을 응원합니다.
피드백은 항상 환영합니다.
'교육 > AIFFEL(대전)1기' 카테고리의 다른 글
AIFFEL(대전) [Fundamental] 3-2 파이썬(Python) 제어문(if, while, for) (0) | 2022.02.17 |
---|---|
AIFFEL(대전) [Fundamental] 3-1 파이썬(Python) 변수와 함수 그리고 반환(return) (0) | 2022.02.17 |
[E08] Explicit Dataset(명시적) VS Implicit Dataset(암묵적) (0) | 2022.02.17 |
[Exploration] E08 영화 추천 시스템 (0) | 2022.02.17 |
AIFFEL(대전) [Exploration]2장 머신러닝 데이터 분류하기 (0) | 2022.02.17 |
- Total
- Today
- Yesterday
- Python
- 인공지능교육
- 광주
- 광주AI
- 대전 인공지능
- 양정연SLAM
- Slam
- 모두의 연구소
- 해커톤
- 자율주행로봇
- 도전
- AIFFEL후기
- 인공지능
- 인공지능 교육
- ros
- 광주인공지능사관학교
- AIFFEL
- 자율주행기술
- 멋쟁이사자처럼
- 서빙로봇
- SLAM강의
- 모두의연구소
- 멘탈관리
- SLAM공부
- 배달로봇
- AIFFEL인공지능과정
- 아이펠
- 실내자율주행
- IT
- AIFFEL교육
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |