기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

sympy와 미분

미분

sympy에서 미분은 diff() 함수를 사용합니다.
diff(기준이 되는 변수)
>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> diff(cos(x),x)
-sin(x)
>>> diff(exp(x**2), x)
2*x*exp(x**2)
위의 diff()에 의한 미분은 1차 미분을 나타낸 것이고 다중 미분역시 이 함수를 사용하여 수행할 수 있습니다다중 미분을 위해서 미분을 위한 변수를 여러차례 전달해야 한다변수를 전달하는 횟수만큼 미분이 실행됩니다다음은 4제곱인 x를 4번 미분한 것으로 결과는 24입니다.
>>> diff(x**4, x)
4*x**3
>>> diff(x**4, x,x,x,x)
24
즉, 위의 경우는$((((x^4)^{\prime})^{\prime})^{\prime})^{\prime})$과 같습니다.
이와같은 다중 미분은 다음과 같이 diff(식, 변수, 미분횟수)로 사용할 수 있습니다. 
>>> diff(x**4, x,4)
24
미분을 여러번 시행할 경우 횟수만큼 변수를 전달하는 대신 대상이 되는 변수와 함께 미분의 횟수를 전달하는 것으로 동일한 효과를 나타낼 수 있습니다. 이 방법으로 다중의 변수에 대해 미분을 실행할 수 있습니다. 즉, 함수에 전달하는 변수의 순서에 따라 미분이 실행됩니다예를들어 다음을 실행합니다.
>>> eq=exp(x*y*z)
>>> diff(eq, x)
y*z*exp(x*y*z)
$eq1=frac{d(e^{xyz})}{dx}=yze^{xyz}$
>>> diff(eq, x, y)
z*(x*y*z + 1)*exp(x*y*z)
$eq2=\frac{d(yze^{xyz})}{dy}=ze^(xyz)+yzxze^{xyz}=z(1+xyz)e^{xyz}$
$\because (AB)^\prime =A^{\prime}B+AB^{\prime}$
>>> diff(diff(eq, x), y)
x*y*z**2*exp(x*y*z) + z*exp(x*y*z)
>>> diff(eq, x, y, z)
(x**2*y**2*z**2 + 3*x*y*z + 1)*exp(x*y*z)
$eq3=\frac{(z+xyz^2)e^{xyz}}{dz}=(1+xyz)e^{xyz}+(z+xyz^2)xye^{xyz}=(x^2y^2z^2+3xyz+1)e^{xyz}$
다음은 위 식을 변수 z에 대해 3번 더 미분합니다. 
>>> diff(eq, x, y, z, 4)
x**3*y**3*(x**2*y**2*z**2 + 9*x*y*z + 16)*exp(x*y*z)

>>> diff(ex, x, y,2, z, 4)
x**3*y**2*(x**3*y**3*z**3 + 14*x**2*y**2*z**2 + 52*x*y*z + 48)*exp(x*y*z)
위에서 사용한 diff()는 sympy 함수이지만 sympy 객체에 대해 메소드로 사용할 수 있습니다. 
객체.diff()
>>> eq.diff(x)
y*z*exp(x*y*z)
>>> eq.diff(x,y, 2, z, 4)
x**3*y**2*(x**3*y**3*z**3 + 14*x**2*y**2*z**2 + 52*x*y*z +

48)*exp(x*y*z)

위의 결과와 같이 동일한 변수로 여러번 미분을 시행할 경우 변수 다음에 숫자를 인수로 전달하는 것으로 동일한 결과를 나타낼 수 있습니다.
diff()함수는 식에 대한 미분 계산한 결과를 직접적으로 반환합니다. 이 함수와 같은 결과를 반환하지만 결과를 직접적으로 나타내지 않고 즉, 직접적으로 평가하지 않고 입력한 식에 대한 미분을 위한 객체를 만들기 위해  Derivative() 클래스함수를 사용합니다.
클래스함수는 클래스 객체를 생성합니다. 그러므로 Derivative()에 의해  클래스이름이 Derivative인 객체가 생성됩니다. 아래의 경우  der은 Derivative 객체입니다. 이러한 객체에서만 사용할 수 있는 함수를 메소드라고 합니다. 
>>> der=Derivative(eq, x); der
Derivative(exp(x*y*z), x)
위의 명령은 전달한 식에 대한  Derivative 객체를 생성합니다. 이 객체를 평가(계산)하기 위해서는 다음의 Derivative 클래스 메소드를 사용합니다.
객체.doit()
이 평가되지 않은 객체는 미분의 평가를 지연시키고 미분 객체를 출력하기 위해 사용합니다.   또한 어떠한 정의되지 않은 함수를 포함하는 경우, Sympy에 의해 어떤 식의 미분 방법이 모호할 경우 유용하게 사용됩니다. 
>>> der.doit()
y*z*exp(x*y*z)

위의 eq 식에 변수 x, y, z에 실제 값을 전달하여 계산하기 위해서는 .subs()함수를 직접적으로 사용하거나 .evalf(subs={})를 사용합니다.
예를들어 
>>> a=eq.diff(x, y, z);a
(x**2*y**2*z**2 + 3*x*y*z + 1)*exp(x*y*z)
>>> a.subs([(x, 3),(y, 3), (z, 3)])
811*exp(27)
>>> N(811*exp(27))
431491123128059.
>>> a.evalf(subs={x:3, y:3, z:3})
431491123128059.

다음 그림은 함수 f(x)(초록색)와 그 함수의 미분 형태(빨간색)에 대한 그래프입니다.
$f(x) = x \cdot sin(x^2) +1$
위 그래프에서 빨간 곡선은 초록곡선의 매우 미세한 부분에서의 기울기를 나타낸 것입니다.
예를들어 x= [-1.00003, -1] 사이의 구간에서의 기울기는 그 구간의 임의의 점에 대한 미분값과 거의 일치합니다.
>>> f=x*sin(x**2)+1
>>> f1=f.subs(x, -1);f1
-sin(1) + 1
>>> f2=f.subs(x, -1.00003);f2
0.158471352980134
>>> N((f1-f2))/(-1-(-1.00003))
1.92207373230197
>>> f.diff(x).subs(x, -1).evalf()
1.92207559654418
위 그래프의 빨간 곡선은 초록곡선의 아주 미세한 구간의 기울기를 연결한 것입니다그러므로 초록 곡선이 증가하면 빨간곡선의 증가와 감소폭은 초록곡선에서 보다 더욱 큰 폭으로 변화하는 경향을 보입니다.

이러한 미분에 대한 생각은 미분한 함수가 0이 되는 곳이 원 곡선의 최대값 또는 최소값을 결정할 수 있겠지요그러므로 그러한 수치로 원 함수의 특성 파악에 중요한 단서가 될 것입니다이 생각은 뉴튼 최적법의 기본 개념이기도 합니다또한 원 방정식을 분해한 구간이 매우 미세하게 정의한다면 결국에는 선형으로 이 곡선의 특성을 나타낼 수 있으므로 복잡한 함수를 갖는 데이터의 특성을 파악하는 단서를 제공할 수 있습니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b