오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-14 05:00
관리 메뉴

우노

[Python] scipy.sparse.random Matrix 생성 방법 본문

Language/Python

[Python] scipy.sparse.random Matrix 생성 방법

운호(Noah) 2020. 11. 13. 14:20

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)

참조

Comments