1 분 소요

SciPy 라이브러리 (데이터처리용)

수학, 통계를 포함한 과학기술계산용 함수 및 알고리즘을 제공하는 파이썬 모듈

  • curve_fit 사용법

      # scipy.optimize.curve_fit(f,x,y, ....)
      # (x,y) 데이터를 비선형 최소제곱법(non-linear least squres method)을 이용하여 특정함수를 적합화 하는 메서드
      # 모델 : y = f(x,*모수) + 오차
      # 여기서 함수 f의 첫 번때 인자는 x 데이터 값(array 또는 객체)
      # 리턴값은 모수의 추정값
      # 추정값의 공분산 행렬(Jacobian matirx), 모수의 표준오차 : np.squrt(np.diag(pcov))
    
    
      # 가상 자료를 만드는 과정
    
      import numpy as np
    
      np.random.seed(123457)
      x_data = np.linspace(-5,5,num=50)
      y_data = 2.9 * np.sin(1.5 * x_data) + np.random.normal(size=50)
    
      import scipy.optimize as opt
      def test_func(x,a,b):  # 분석모델 결정
          return a*np.sin(b*x)
    
      params, params_covariance = opt.curve_fit(test_func,x_data,y_data)
    
  • minimize 사용법

      # f(x)의 최소값을 찾는 문제: x가 -1.3에 최소값 , 3.8에 최소값 같이 보이는 Local Minimum이 있다.
      import scipy.optimize as opt
    
      def f(x):
          return x**2 + 10*np.sin(x)
    
      x = np.arange(-10,10,0.1)
      plt.plot(x,f(x))
      plt.show()
    
      result = opt.minimize(f,x0=0)
    
  • root 사용법

      # f(x) = 0을 만족하는 근(root)을 구하는 문제
    
      import scipy.optimize as opt
    
      def f(x):
          return x**2 + 10*np.sin(x)
    
      def zero_f(x):
          return x*0
    
      x = np.arange(-10,10,0.1)
    
      plt.plot(x,f(x) ,label='f(x)')
      plt.plot(x,zero_f(x),label='f(x)=0')
      plt.legend(loc='best')
      plt.show()
    
  • Stats 사용법

      # 표준정규분포의 이론적 밀도함수 vs 100개의 랜덤 데이터의 경험적 밀도
    
      import numpy as np
      import scipy.stats as stat
      import matplotlib.pyplot as plt
    
      samples = np.random.normal(size=100)  # 표준 정규분포로 부터 100개의 랜덤 넘버 생성
      bins = np.arange(-3,4)  # -3~3까지 bin 생성 , X의 확률 변수 범위
      density = np.histogram(samples, bins=bins, density=True)[0]  # 도수, 구분 = np.histogram(data, 도수분포구간 (bin))
                                                                  # plt.hist(samples, bins) 히스토그램
      x = 0.5*(bins[1:]+bins[:-1]) # 이산변수를 연속변수를 바꾸기 위한 보정
    
      pdf = stat.norm.pdf(x)  # 정규분포
    
      plt.plot(x, density, label='sample')
      plt.plot(x, pdf, label='normal')
      plt.legend(loc='best')
      plt.show()
    
    
      # 독립된 두 표본의 평균 검정을 위한 t-test
      a = np.random.normal(0,1,size=100)
      b = np.random.normal(1,1,size=10)
      stat.ttest_ind(a,b)
    
  • integrate 사용법
    • 적분 문제 : $\int_{0}^{\pi /2}sin(x) dx$
      import numpy as np
      from scipy.integrate import quad
      
      quad(np.sin, 0, np.pi/2)
      
  • integrating Ordinary Differential Equations (ODE)
  • 미분방정식문제 : $\frac{\mathrm{d} y}{\mathrm{d} x} = -2y \quad with \quad y(x=0)=1 , \quad for \, 0 \leq X \leq 4$

      import numpy as np
      from scipy.integrate import odeint
      from matplotlib import pyplot as plt
    
      def f_prime(y,x): #미분방정식에 사용할 함수 정의
          return -2*y
    
      x = np.linspace(0,4,40)
      y = odeint(f_prime, 1, x)  # 미분 방정식의 적분을 통한 함수 값 리턴
    
      plt.figure(figsize=(4,3))
      plt.plot(x,y)
      plt.xlabel('x:Time')
      plt.ylabel('y:Position')
      plt.tight_layout()
    

댓글남기기