인프런 커뮤니티 질문&답변

anchornandary님의 프로필 이미지
anchornandary

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

희소행렬의 이해

CSR 구현 시 0이 아닌 데이터의 row가 비규칙적으로 존재할 때?

작성

·

297

1

안녕하세요 선생님!

CSR 형식이 행 위치 배열 내에 있는 고유한 값의 시작 위치만 다시 별도의 위치 배열로 갖는 변환 방식이라고 설명해주셨는데, 0이 아닌 데이터의 row가 비규칙적으로 존재할 때는 CSR 방식을 쓸 수가 없나요? 쓸 수 있다면, 행위치 배열의 고유값 시작 인덱스 배열 뿐만 아니라 각 고유값이 무슨 값인지(몇번 째 행인지)에 대한 정보도 다른 곳에 저장되어 있는건지 궁금합니다!

 

예를들어, COO 방식으로 구현 시 행위치 배열이 [0, 0, 5,5,5,5,6,6,6,6,6] 일 때, CSR 방식에서는 행위치 배열의 고유값 시작 인덱스 배열이 [0, 2, 6] 일텐데 해당 정보만으로는 3행으로 이루어진 밀집행렬로 유추할 위험이 있을 것 같아서요!

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

음, 생각을 해보니, 강의의 설명이 연속적인 Non-zero행의 인덱스를 가정하고 설명하다보니, 비연속적인 non-zero행의 인덱스의 경우에는 잘 매칭되지 않는군요.

CSR 행 압축 인덱스는 개별 행별로 몇개의 NON-ZERO값이 있는지를 나타내는 메커니즘으로 만들어 집니다.

행이 7행이 있으면 8개의 요소를 가지게 됩니다. 행별로 몇개의 Non-Zero값이 있는 지는 행 압축 인덱스 앞뒤 요소값의 차이에 기반하여 계산됩니다.

그러니까 0 ~6 사이의 7개의 행이 있다면 CSR 행 압축 인덱스는 8개로 만들어 지는데,

0행에 2개, 5행에 4개, 6행에 5개의 Non-Zero값이 있다면 CSR 행압축 인덱스는 아래와 같이

[0, 2, 2, 2, 2, 6, 11, 12] 와 같이 8개로 만들어 집니다.

먼저 0행에 2개 표시는 [0, 2, 2, 2, 2, 2, 6, 11] 에서 1번 인덱스 요소값 2에서 0번 인덱스 요소값인 0을 빼어서 2로 계산됩니다.

다음으로 1행에 0개 표시는 2번 인덱스 요소값 2에서 1번 인덱스 요소값 2를 빼어서 0으로 계산됩니다.

2행에 0개 표시는 3번 인덱스 요소값인 2에서 2번 인덱스 요소값인 2를 빼어서 0으로 계산됩니다.

3행의 0개 표시는 4번 인덱스 요소값인 2에서 3번 인덱스 요소값인 2를 빼어서 0으로 계산됩니다.

4행의 0개 표시는 5번 인덱스 요소값인 2에서 4번 인덱스 요소값이 2를 빼어서 0으로 계산됩니다.

5행의 4개 표시는 6번 인덱스 요소값이 6에서 5번 인덱스 요소값인 2를 빼어서 4로 계산됩니다.

6행의 5개 표시는 7번 인덱스 요소값인 11에서 6번 인덱스 요소값인 6을 빼어서 5로 계산됩니다.

연속적인 non-zero행의 인덱스로 설명드리는게 더 쉬울 것 같아서 강의 설명을 그렇게 했는데, 비연속적인 non-zero행이 인덱스까지 감안해서 강의 설명을 좀 보충해야 할 것 같습니다.

좋은 질문 감사합니다.

anchornandary님의 프로필 이미지
anchornandary

작성한 질문수

질문하기