우노
[Python] scipy.sparse.random Matrix 생성 방법 본문
- python의 SciPy 라이브러리를 활용하면 특정 density를 가진 sprase random matrix를 만들 수 있습니다.
- reference
Prameters
scipy.sparse.random(m, n, density=0.01, format='coo', dtype=None, random_state=None, data_rvs=None)
- m, n
- 행렬의 크기
- density
- 행렬의 밀도
- dtype
- 반환 된 행렬 값의 유형
- random_state
- 난수 시드
- data_rvs
- 확률 분포 지정
Sparse random matrix 생성
Scipy.sparse 모듈을 사용하여 sprase random matrix를 만드는 간단한 예를 몇 가지 살펴 보겠습니다.
우선, 시작하는 데 필요한 Python 모듈을 먼저 로드하겠습니다.
import scipy.sparse as sparse import scipy.stats as stats import numpy as np
크기 5 × 5, 밀도 0.25인 sparse random matrix를 생성하겠습니다.
Scipy의 sparse.random 함수는, 기본적으로 COO 형식의 sparse random matrix를 만듭니다.
또한, 요소 값은 기본적으로 0과 1 사이의 균일 분포에서 생성합니다.
# 랜덤 시드 생성 np.random.seed(42) # 크기 5 × 5, 밀도 0.25인 sparse matrix 생성 A = sparse.random(5, 5, density=0.25)
print(A) #(3, 1) 0.3042422429595377 #(1, 3) 0.5247564316322378 #(0, 0) 0.43194501864211576 #(3, 4) 0.2912291401980419 #(1, 2) 0.6118528947223795 #(4, 1) 0.13949386065204183 print(A.toarray()) #[[0.43194502 0. 0. 0. 0. ] # [0. 0. 0.61185289 0.52475643 0. ] # [0. 0. 0. 0. 0. ] # [0. 0.30424224 0. 0. 0.29122914] # [0. 0.13949386 0. 0. 0. ]]
Sparse random matrix 생성 - 0과 1로만 요소값 생성
위에서 말했듯이, Scipy의 sparse.random 함수는 기본적으로 0과 1 사이의 균일 분포에서 요소값을 생성합니다.
하지만, 확률 분포를 수동으로 지정할 수도 있습니다.
"data_rvs" 인수에 np.ones를 지정해, 요소값이 0과 1만 있는 sparse random matrix를 만들어 보겠습니다.
A = sparse.random(5, 5, density=0.25, data_rvs=np.ones) print(A.toarray()) #[[1. 1. 0. 0. 1.] # [0. 0. 0. 0. 1.] # [0. 1. 0. 0. 0.] # [0. 0. 1. 0. 0.] # [0. 0. 0. 0. 0.]]
Sparse random matrix 생성 - 지정한 정규 분포에서 요소값 생성
Scipy.stats의 norm 함수를 사용하여 확률 분포를 지정하고, 해당 확률 분포를 sparse.random 함수의 인수로 사용할 수 있습니다.
평균 = 3, 표준편차 = 1 인 정규 분포에서 밀도 0.25의 희소 행렬을 만들어 보겠습니다.
# 확률 분포 지정 rvs = stats.norm(loc=3, scale=1).rvs # 특정 확률 분포로 random sparse matrix 생성 S = sparse.random(5, 5, density=0.25, data_rvs=rvs) print(S.toarray()) #[[0. 0. 0. 3.35555132 0. ] # [0. 0. 2.70660085 0. 0. ] # [0. 0. 0. 0. 2.97016143] # [0. 0. 0. 3.83246186 0. ] # [0. 2.97554482 3.41701111 0. 0. ]]
Sparse random matrix 생성 - 포아송 분포에서 요소값 생성
또한, 우리는 stats.poisson 함수를 사용해, 포아송 확률 분포로 부터 요소값을 생성할 수도 있습니다.
np.random.seed(42) # 포아송 분포에서 요소값 생성 rvs = stats.poisson(15, loc=10).rvs # 특정 확률 분포로 random sparse matrix 생성 S = sparse.random(5, 5, density=0.25, data_rvs=rvs) print(S.toarray()) #[[ 0. 0. 21. 0. 24.] # [ 0. 20. 0. 0. 0.] # [ 0. 23. 0. 0. 0.] # [ 0. 0. 0. 0. 0.] # [ 0. 0. 29. 26. 0.]]
생성한 Matrix를 파일로 저장
scipy.io를 이용하여 생성한 matrix를 파일로 저장하고 읽을 수 있습니다.
reference
어떤 형식의 matrix를 mmwrite로 저장하여도, 그 형식은 matrix market(mtx)으로 같습니다.
from scipy.io import mmwrite mmwrite('result', result)
저장 된 Matrix 파일 내용
%%MatrixMarket matrix coordinate integer general % 5 5 6 1 1 1 1 5 2
- Matrix market format 은 sparse matrix 의 텍스트 저장 방식입니다.
- 위의 예시는 ‘result.mtx’ 파일의 맨 앞 5 줄이며, 위의 3 줄은 header 입니다.
- 첫 줄은 파일 형식을 정의하는 고유 head, 두번째 줄은 띄어쓰기, 세 번째 줄은 이 행렬의 num row, num column, nnz 입니다.
- 즉, 네 번째 줄부터 실제 데이터 입니다.
- Row 와 Column index를 살펴보면, 0 이 아닌 1 부터 시작하는 것을 알 수 있습니다.
- 왜 이런 형식이 만들어졌는지는 찾아보지 못했지만, matlab 과 같은 소프트웨어들의 row, column index 가 1 부터 시작하는데, 이 때 만들어진 형식이 아닐까 짐작하고 있습니다.
Matrix 파일 전처리 (skip head)
from scipy.io import mmwrite # matrix 저장할 파일 명 filename = './result' mmwrite(filename, matrix) # skip head 전처리 with open(filename+'.mtx','r') as rf: with open(filename+'.txt','w') as wf: # skip head for _ in range(3): next(rf) for line in rf: wf.write(line)
참조
'Language > Python' 카테고리의 다른 글
[Python] os 모듈 정리 (0) | 2020.11.15 |
---|---|
[Python] 코드 실행시간 측정 (0) | 2020.11.15 |
[Python] Matplotlib에서 W와 b 값을 사용하여 직선 그리기 (0) | 2020.11.05 |
[Python] Pandas 지수표현(과학적표기법) 출력 변경 (0) | 2020.11.02 |
[Python] Numpy 지수표현(과학적표기법) 출력 변경 (0) | 2020.11.02 |