Python 이산 서열 도수 의 예 를 구하 다

4096 길이 의 데 이 터 는 1 단계 도체 가 플러스 에서 마이너스 까지 의 점 을 찾 아야 하고 3 단계 도체 가 마이너스 에서 플러스 까지 의 점 을 찾 아 작은 부분 을 절취 해 야 한다.
394.0
388.0
389.0
388.0
388.0
392.0
393.0
395.0
395.0
394.0
394.0
390.0
392.0
이전에 알 고 있 는 바 에 따 르 면 이산 치 에 대한 구 도 는 바로 차이 점 을 구 하 는 것 이다.예 를 들 어 i 점 의 도체(차이 점)는 다음 과 같다.

즉,너비 가 2m+1 인 창 에서 앞 뒤 m 개의 값 을 계산 하여 가중 시 킨 것 과 얻 을 수 있 습 니 다.하지만 실제 사용 과정 에서 효과 가 좋 지 않다.그래서 똑 같이 너비 가 2k+1 인 창 에서 이 2k+1 개의 점 을 하나의 함수 로 만 든 다음 에 구 도 를 하면 임의의 단계 의 도 수 치 를 얻 을 수 있다 는 것 을 생각 했다.
우선 함수 적합,from scipy.optimize import leastsq 즉 최소 2 곱 하기 적합 을 사용 합 니 다.

from scipy.optimize import leastsq
class search(object):
  def __init__(self, filename):
    self.filename = filename

  def func(self, x, p):
    f = np.poly1d(p)
    return f(x)

  def residuals(self, p, x, y, reg):
    regularization = 0.1 #      lambda
    ret = y - self.func(x, p)
    if reg == 1:
      ret = np.append(ret, np.sqrt(regularization) * p)
    return ret

  def LeastSquare(self, data, k=100, order=4, reg=1, show=1): # k       ,order      ,reg      
    l = self.len
    step = 2 * k + 1
    p = [1] * order
    for i in range(0, l, step):
      if i + step < l:
        y = data[i:i + step]
        x = np.arange(i, i + step)
      else:
        y = data[i:]
        x = np.arange(i, l)
      try: 
        r = leastsq(self.residuals, p, args=(x, y, reg))
      except:
        print("Error - curve_fit failed")
      fun = np.poly1d(r[0]) #         
      df_1 = np.poly1d.deriv(fun) #      
      df_2 = np.poly1d.deriv(df_1)
      df_3 = np.poly1d.deriv(df_2)
      df_value = df_1(x)
      df3_value = df_3(x)
fun=np.poly1d(r[0]),fun 는 poly nomial class 를 되 돌려 줍 니 다.구체 적 으로 사용 하면 공식 문 서 를 볼 수 있 습 니 다numpy.poly1d
poly nomial 대상 은 deriv 방법 으로 도 수 를 구 할 수 있 으 며,구 하 는 것 은 여전히 poly nomial 대상 이다.df_value = df_1(x)이 얻 은 것 은 바로 x 라 는 몇 가지 점 에서 구 한 가이드 수치 이다.
큰 성 과 를 거 둔 것 처럼 보이 지만 가이드 의 결 과 는 좋 지 않다.다음 과 같은 그림 에서 실제 최고점 은 100 정도 이지 만 의합 한 곡선 의 최고점 은 120 정도 이 고 여러 가지 의합 을 사용 하면 정확 한 의합 곡선 을 만 들 기 어렵 기 때문이다.

그래서 고 스 함수 로 곡선 에 대한 의합 을 실현 하려 고 했 습 니 다.matlab 에서 시험 해 보 았 습 니 다.3 단계 고 스 의합 은 곡선 을 잘 맞 출 수 있 습 니 다.

그러나 numpy 와 sicpy 에서 poly 1d 와 같은 대상 을 찾 지 못 했 습 니 다.고 스 함 수 를 스스로 정의 할 수 있 지만 다음 과 같 습 니 다.

  def gaussian(self, x, *param):
    fun = param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4],    2.)))+param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.)))
    return fun
그러나 최소 2 곱 하기 의합 을 통 해 함수 인 자 를 얻 은 후에 의합 후의 점 만 얻 을 수 있 고 직접 도 수 를 구 할 수 없 기 때문에 적합 하지 않다.
그래서 다항식 의합 으로 돌아 갈 수 밖 에 없다.4 단계 다항식 이 표징 되 지 않 으 면 더 높 은 단계 일 까?

전체적으로 말 하면 효 과 는 받 아들 일 수 있다.
다음 단계 에서 좋 은 고 스 함수 적합 방법 을 찾 으 면 계속 업데이트 할 것 입 니 다.
이상 의 Python 에서 분 산 된 서열 도 수 를 구 하 는 예 는 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기