기본 콘텐츠로 건너뛰기

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

부분적분

미분의 곱 법칙과 연관
(fg)'=f'g+fg'
$\int (fg)'dx=\int f'g dx+\int fg'dx \rightarrow fg=\int  f'g dx+\int fg'dx $
위 식을 다음과 같이 다시 정렬할 수 있습니다.
$\int fg' dx=fg-\int f'g dx $  Eq(1)
부분적분
위 식에서 f(x), g(x)를 각각 u, v로 치환하면 다음과 같이 정리됩니다.
f(x)=u, g(x)=v → f'(x)dx=du, g'(x)dx=dv
Eq(1)에 치환을 적용하면
$\int u dv=uv - \int v du$
위 식을 지정한 구간 [a, b]의 정적분은 다음과 같이 계산됩니다.
$\int^b_a u dv=uv|^b_a - \int^b_a v du$
위 부분 적분의 절차를 프로그램 함수로 작성하면 다음과 같습니다.

def partIntegralS(u, dv, Symbolvar, loup=0):
    du=diff(u, Symbolvar)
    v=integrate(dv, Symbolvar)
    uv=u*v
    vdu=integrate(v*du, Symbolvar)
    if loup==0:
        re=uv-vdu
        return(re)
    else:
        re=uv-vdu
        re1=re.subs(Symbolvar, loup[1])-re.subs(Symbolvar, loup[0])
        return(re1)

예) 다음을 적분?
1) $\int xe^{6x}dx=x\frac{1}{6}e^{6x}-\int\frac{1}{6}e^{6x} dx\\=\frac{x}{6}e^{6x}-\frac{1}{36}e^{6x}+c\\ \because u=x, \;dv=e^{6x} \;\rightarrow\; du=dx,\; v=\frac{1}{6}e^{6x}$
>>> from sympy import *
>>> x=symbols('x')
>>> F=x*exp(6*x);F
x*exp(6*x)
>>> integrate(F, x)
(6*x - 1)*exp(6*x)/36
>>> partIntegralS(x, exp(6*x), x)
x*exp(6*x)/6 - exp(6*x)/36

2) $\int^2_1 xe^{6x}dx=\frac{x}{6}e^{6x}|^2_1-\frac{1}{36}e^{6x}|^2_1$
>>> integrate(F, (x,-1,2))
7*exp(-6)/36 + 11*exp(12)/36
>>> partIntegralS(x, exp(6*x), x, [-1,2])
7*exp(-6)/36 + 11*exp(12)/36

3) $\int(3t+5)(cos(\frac{t}{4}))dt \text{?} \\ u=3t+5,\; dv=cos(\frac{t}{4})\; \rightarrow \; du=3dt,\; v=4sin(\frac{t}{4})\\ \int(3t+5)(cos(\frac{t}{4}))dt=(3t+5)4sin(\frac{t}{4})-\int4sin(\frac{t}{4})3dt=4(3t+5)sin(\frac{t}{4})+48cos(\frac{t}{5})+c$
>>> t=symbols('t')
>>> integrate((3*t+5)*cos(t/4), t)
12*t*sin(t/4) + 20*sin(t/4) + 48*cos(t/4)
>>> partIntegralS(3*t+5, cos(t/4), t)
4*(3*w + 5)*sin(w/4) + 48*cos(w/4)

4) $\int w^2sin(10w)dw?\\ u=w^2,\; dv=sin(10w)\; \rightarrow \; du=2wdw,\; v=-\frac{cos(10w)}{10}\\\int w^2sin(10w)dw=-w^2\frac{cos(10w)}{10}+\int\frac{cos(10w)}{10}2wdw=-\frac{w^2cos(10w)}{10}+\frac{wsin(10w)}{50}+\frac{cos(10w)}{500}$
>>> w=symbols('w')
>>> integrate(w**2*sin(10*w), x)
w**2*x*sin(10*w)
>>> w=symbols('w')
>>> integrate(w**2*sin(10*w), w)
-w**2*cos(10*w)/10 + w*sin(10*w)/50 + cos(10*w)/500
>>> partIntegralS(w**2, sin(10*w), w)
-w**2*cos(10*w)/10 + w*sin(10*w)/50 + cos(10*w)/500

5) $\int x \sqrt{x+1} dx\text{?}\\ u=x,\; dv=\sqrt{x+1}\; \rightarrow \; du=dv,\; v=\frac{2}{3}(x+1)^{\frac{3}{2}}// \int x \sqrt{x+1} dx=x\frac{2}{3}(x+1)^{\frac{3}{2}}-\int\frac{2}{3}(x+1)^{\frac{3}{2}}dx=\frac{2x}{3}(x+1)^{\frac{3}{2}}-\frac{4}{15}(x+1)^{\frac{5}{2}}+c$
>>> partIntegralS(x, (x+1)**(1/2), x)
0.666666666666667*x*(x + 1)**1.5 - 0.266666666666667*(x + 1)**2.5
위 함수를 sympy의 integrate()함수에 직접 적용하면 다음과 같은 에러가 발생합니다.
>>> integrate(x*(x+1)**(1/2), x)
ValueError: Non-suitable parameters.
Sympy모듈에서는 특정한 함수에서 분수(1/2)와 python float 자료형(0.5)의 인식에 문제가 발생합니다. 만약 위의 경우 1/2를 rational number로 지정해주면 에러를 피할 수 있습니다.
이 경우 위의 결과의 형태는 달라질 수 있습니다. 그러나 이것은 함수들을 정리하는 과정에서 나타나는 상이함으로 동일한 것입니다.
>>> integrate(x*(x+1)**(Rational('1/2')),x)
 2*x**2*sqrt(x + 1)/5 + 2*x*sqrt(x + 1)/15 - 4*sqrt(x + 1)/15
위의 결과는 부분적분의 결과와 약간의 차이가 있지만 함수의 정리과정에서 나타나는 상이함으로 일정구간의 정적분을 시행할 경우 동일한 값을 나타냅니다.
>>> partIntegralS(x, (x+1)**0.5, x, [-1,2]).evalf(4)
2.771
>>> integrate(x*(x+1)**(Rational('1/2')),(x, -1, 2)).evalf(4)
2.771
>>> partIntegralS(x, (x+1)**0.5, x, [5,9]).evalf(4)
79.93
>>> integrate(x*(x+1)**(Rational('1/2')),(x, 5, 9)).evalf(4)
79.93
위에서 나타낸 것과 같이 부정적분의 상이함에 불구하고 정적분에서 동일한 결과를 보이는 것은 상아한 함수들이 동일한 것임을 의미합니다.
이것은 부정적분의 상수항 c에 의해 최종결과의 정리과정에서 나타나는 것입니다. 즉, 잘못된 결과가 아님을 의미합니다.

6) $\int x^4e^{\frac{x}{2}} dx\\ u=x^4, \; dv=e^{\frac{x}{2}} $
>>> integrate(x**4*exp(x/2), x)
(2*x**4 - 16*x**3 + 96*x**2 - 384*x + 768)*exp(x/2)
>>> factor(partIntegralS(x**4, exp(x/2), x))
2*(x**4 - 8*x**3 + 48*x**2 - 192*x + 384)*exp(x/2)

댓글

이 블로그의 인기 게시물

[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