기본 콘텐츠로 건너뛰기

2월, 2022의 게시물 표시

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

적분방법

내용 부분적분 치환적분 적분방법 어떤 것을 적분하기 위해서는 그들을 적분할 수 있는 형태로 재구성하는 것으로부터 시작합니다. 이러한 재구성에는 다양한 방법들이 적용됩니다. 부분적분 식 1과 같이 미분의 곱법칙 을 적분에 적용할 수 있습니다. $$\begin{align}\tag{1}d(uv) &= u·dv + v·du\\ u·dv &= d(uv) - v·du\\ ∫u·dv &= \int d(uv) - \int v\,du\\ &= uv - ∫v·du + C\end{align}$$ 식 1에서 u는 정상함수, dv는 미분된 함수를 나타냅니다. 식 1은 식 2와 같이 부분적분 공식으로 정리할 수 있습니다. 부분적분 \begin{equation}\tag{2} \int {\large {[}}f(x)·g(x){\large {]}}dx = f(x) \int g(x)\, dx - \int \left[\frac{df(x)}{dx} \int g(x) \right] dx \end{equation} 부분 적분의 몇 가지 예제들을 계산해 봅니다. 예)   함수 w·sin(w)의 경우 직접 적분하기는 어렵지만 두 식의 곱으로 구성되어 있으므로 부분 적분을 적용할 수 있습니다. 즉, w를 원함수 u로 하고 sin(w)를 미분된 함수 dv라고 한다면 다음과 같이 전개할 수 있습니다. $$\begin{align} u = w,& \qquad \sin(w) = dv\\ \int \sin(w)\, dw &= -\cos(w)\\ &= v\\ \int w·\sin(w) \,dw &= w(-\cos(w)) - \int (-\cos(w))\, dw + C\\ &= -w·\cos(w) + \sin(w) + C \end{align}$$ 위 부분적분의 과정에 따라 코드를 작성해 보면 다음과 같습니다. import numpy a

텐서연산: dot operation

내용 텐서 연산 요소별 연산 Tensor dot 텐서 연산의 기하학적 해석 텐서 연산(Tensor Operation) 텐서 연산 모든 컴퓨터 프로그램이 입력된 데이터를 이진수로 변환시켜 AND , OR , NOR 등의 이진 연산 과정을 거치는 것과 같이 신경망에서 학습한 모든 변환은 텐서에 적용된 소수의 텐서 연산이 실행 될 수 있습니다. 숫자 데이터의 예를 들어 텐서를 추가하거나 텐서를 곱하는 등의 작업이 가능합니다. 모델을 생성하기 위해 먼저 층(layer)을 구축합니다. tensorflow.keras의 모듈을 적용하여 층을 구축하는 대표적 방법은 다음과 같습니다. tf.keras.layers.Ddense(512, activation="relu") 이 층은 2D 텐서를 입력받아 2D를 반환합니다. 이 층에서 수행되는 함수는 다음과 같습니다. output=relu(dot(W, input)+b) 요소별 연산 입력 데이터 input과 가중치 W의 내적에 다른 벡터 b 사이의 덧셈 연산이 이루어지며 최종적으로 relu 연산 즉, 최대값을 반환하는 max(x, 0) 연산을 수행합니다. 위 연산에서 덧셈과 relu() 연산은 요소별 연산(Element-wise operation) 입니다. 즉, 고려 중인 텐서의 각 요소에 독립적으로 적용되는 연산입니다. 그러므로 대규모 병렬 구현에 매우 적합합니다. 임의의 두 배열 객체의 덧셈과 relu()함수의 연산은 다음과 같이 요소별로 이루어집니다. import tensorflow as tf from tensorflow import keras import numpy as np import pandas as pd from scipy import stats from sklearn import preprocessing import matplotlib.pyplot as plt x=np.array([[2, -6, 3],[6, 8, 7]]) y=np.array([[5, 1,

torch

내용 텐서란? 주요속성 Numpy에서 텐서 조작 차원의 변경 데이터 배치의 개념 (The notion of data batches) import tensorflow as tf from tensorflow import keras import numpy as np import pandas as pd from scipy import stats from sklearn import preprocessing import matplotlib.pyplot as plt 텐서(Tensor) 텐서란? 텐서는 숫자로 구성된 데이터의 컨테이너입니다. 즉, 숫자를 담는 그릇입니다. 가장 많이 접할 수 있는 2D 텐서인 행렬이 텐서의 예입니다. 결과적으로 텐서는 행렬을 임의의 수의 차원으로 일반화한 것으로 텐서의 맥락에서 차원(dimension)은 종종 축(axis)이라고 할 수 있습니다. tensorflow에서 텐서는 tf.constant() 함수에 의해 생성됩니다. 생성된 텐서의 값은 동일한 객체에서 변경, 수정 될 수 없습니다. 생성된 텐서의 타입은 tf.dtypes.DType 에서 확인 할 수 있습니다. 스칼라는 0차원 텐서이므로 축은 없습니다.(rank 0) 벡터는 1차원 텐서로서 1개의 축을 가집니다.(rank 1) 행렬은 2차원 텐서이며 2개 축을 가집니다.(rank 2) 3차원 텐서는 3개의 축을 가집니다.(rank 3) 계속 확장할 수 있습니다. rank0=tf.constant(4) rank0 <tf.Tensor: shape=(), dtype=int32, numpy=4 > rank1=tf.constant([2,3]) rank1 <tf.Tensor: shape=(2,), dtype=int32, numpy=array([2, 3], dtype=int32) > rank2=tf.constant([[1,2],[3,4],[5,6]]) rank2 <tf.Tensor: shape=(3, 2), dtyp

정적분(Definite Integral)

내용 정적분으로 면적 계산 극좌표에서의 면적 적분에 의한 부피 계산 정적분(Definite Integral) 정적분으로 면적 계산 곡선에 대한 적분 계산으로 면적을 계산할 수 있습니다. 그림 1은 식이 알려진 곡선으로 그 곡선 AB하의 PQNM의 면적을 계산해 봅니다. 그림 1. 곡선의 면적. 그림 1의 지정된 영역 PQNM의 면적은 그 구간 내에 포함된 매우 작은 부분들의 면적을 계산하여 모두 합하는 방식으로 계산될 수 있습니다. 그림 2는 밑면 dx, 높이 dy로서 영역 PQNM 내에 포함된 작은 부분을 나타낸 것으로 각 면적의 합이 지정된 영역의 총 면적이 됩니다. 그림 2. 영역의 부분에 대한 단면적. 위 그림의 면적을 평균 높이 y, 밑면의 길이 dx로 하는 사각형으로 계산할 수 있을까요? 평균 높이를 사용하므로 그림의 윗부분에서 존재하는 부분과 존재하지 않는 부분을 대칭 관계로 고려하면 그 면적을 dx·y로 간주할 수 있습니다. 더구나 dx를 매우 작게 감소시킨다면 대칭 관계로 가정한 부분에서 발생하는 오차가 매우 작아지기 때문에 실제 면적에 더욱 근접할 것입니다. 이 작은 부분의 1개의 면적을 dS로 한다면 다음과 같이 나타낼 수 있습니다. dS = y·dx 주어진 영역의 총면적은 식 1과 같이 부분 면적의 합으로 표현할 수 있습니다. $$\begin{equation}\tag{1} \text{총면적}\; S = \int dS = \int y\,dx \end{equation}$$ 그러므로 x로 구성된 y의 함수를 안다면 적분에 의해 위 계산을 실행할 수 있습니다. 예를 들어 지정된 영역의 곡선의 함수가 y = b + ax 2 라면 이 함수의 적분으로 총 면적을 계산할 수 있습니다. from sympy import * a, b, x=symbols("a, b, x") y=b+a*x**2 inty=integrate(y, x) inty $\quad \color{navy}{\frac{a x

sympy 식과 연산

내용 symbols 등호 기호 ^, &, 그리고 / 기본 연산 대체(substitution) 문자열을 sympy 식으로 전환 evalf, N lambdify sympy operation symbols sympy에서 문자를 심벌로 사용하기 위해서는 사용전에 반드시 정의되어야 합니다. 심벌을 정의하기 위해 symbols() 를 사용하는데 여러개의 심벌들을 동시에 정의할 수 있습니다. from sympy import * x=symbols('x') x+1 x + 1 y, z=symbols('y z') type(y) sympy.core.symbol.Symbol 심벌은 문자열로 지정이 가능합니다. crazy =symbols('unrelated') crazy+1 unrelated + 1 symbols() 함수에 의해 정의한 일반 객체의 이름으로 사용된 문자와는 구분됩니다. 다음 코드에서 symbol로 정의된 x 즉, sympy 식에 사용된 심벌 x와 2가 할당된 객체 이름의 x와는 구분됨을 나타내고 있습니다. x= symbols('x') #심벌로 x expr=x+1 expr x + 1 x=2 #객체이름으로 x x + 3 5 sympy에서 생성한 식의 심벌에 특정한 수를 대입하기 위해서는 .subs() 메소드를 적용합니다. x=symbols('x') expr=x+1 expr x + 1 expr.subs(x, 4) 5 등호 기호 python에서 ' = '는 이 기호를 기준으로 오른쪽의 값을 왼쪽으로 할당함을 의미합니다. sympy 역시 동일한 의미로 작동됩니다. ' 같다 '의 의미로는 ‘ == ’를 사용하고 bool형 즉, True, False의 결과를 반환합니다. x=symbols('x') expr = x+1 expr==3 False expr1=expr.sub

적분의 일반 규칙과 부정적분(Indefinite Integral)

내용 적분의 일반 규칙 함수들의 합에 대한 적분 함수의 상수항 특별한 함수의 적분 특별한 함수의 적분공식 삼각함수의 적분 편적분 적분 규칙 적분의 일반 규칙 함수 y에 대한 미분은 $\displaystyle \frac{dy}{dx}$를 계산하는 것입니다. 많은 수학적 계산과 같이 미분 과정 역시 역산될 수 있습니다. 예를 들어 $\displaystyle y = x^4$의 미분은 $\displaystyle \frac{dy}{dx} = 4x^3$이 되며 그 과정을 반대로 실행하면 원 함수인 $\displaystyle y = x^4$이 되어야 합니다. 그러나 미분계수가 $\displaystyle 4x^3$이 되는 함수는 위에서 언급한 함수 외에 $\displaystyle x^4 + C$와 같이 상수를 첨가된 다양한 함수의 미분 결과일 수 있습니다. 상수는 미분의 결과에 영향을 주지 않기 때문입니다. 이러한 점을 적분에 고려하여 미분의 역과정인 적분 결과에 상수 C를 더해 줍니다. $$\begin{align} \frac{dy}{dx}&=x^{n-1}\\ \int nx^{n-1}\; dx&= x^n+C\\ & C: 상수 \end{align}$$ 식 1과 같이 위의 관계에서 독립변수 x의 거듭제곱에 대한 미분과 적분의 일정한 관계가 성립됩니다. 적분일반규칙 $$\begin{align}\tag{1} \frac{dy}{dx}&=x^{n}\\ \int nx^{n}\; dx&= \frac{1}{n+1}x^{n+1}+C\\ & C: 상수,\; n \neq -1 \end{align}$$ 적분 계산은 sympy의 integrate() 함수를 적용합니다. 이 함수의 결과에는 상수가 고려되지 않습니다. 그러나 적분 결과로 대상인 함수에서의 상수의 존재 여부를 결정할 수 없기 때문에 상수가 존재한다고 간주해야 합니다. 그러므로 intergrate()함수에 의한 계

[data analysis] 표본과 모집단(smaple and population)

표본과 모집단(smaple & population) 통계적 추론(statistical inference) 은 부분(표본, sample)으로 전체(모집단, population)의 모수를 추정하는 통계 분석 방법입니다. 일반적으로 여러 조건의 제약에 의해 모집단의 조사는 어렵거나 불가능한 경우가 대부분입니다. 이러한 경우 모수(population parameter) 를 알 수 없기 때문에 이들을 추정해야 됩니다. 예를 들어 거래되는 모든 주가 데이터를 획득하는 것은 어렵습니다. 그러므로 그 모집단에서 생성될 수 있는 또는 그 모집단과 유사한 특성을 가진 표본의 평균, 분산과 같은 통계량이 모수와 비슷할 것이라는 가정 하에 다양한 분석을 진행할 수 있습니다. 이 경우 표본의 통계량이 모수와 유사하다고 하는 가설의 합리성에 대한 판단이 필요하며 이러한 판단의 근거는 통계적 추론에 의해 결정할 수 있습니다. 예를 들어 초등학교 6학년의 평균신장을 측정하는 연구에서 대상은 국가 내의 모든 6학년 학생이 될 것입니다. 그러나 제한된 연구 시간과 비용은 모든 대상에 대한 조사를 어렵게 만들 수 있습니다. 이런 경우 모집단의 통계량을 계산할 수 없기 때문에 각 지역별로 임의적으로 작은 그룹을 선택하여 측정한 결과들의 평균으로 모평균을 대신할 수 있을 것입니다. 표 1에서 나타낸 것과 같이 이 연구의 경우 모든 대상이 모집단(population) 이 되고 선택한 부분들이 표본(sample) 이 됩니다. 표 1 모집단과 표본 모집단(population) 연구의 모든 대상 표본(sample) 연구를 위해 실제 측정 또는 관찰되는 부분 다음 자료의 예(표 2)와 같이 행은 모든 열에 대한 값들을 포함하는 것으로 전체 자료에 대한 샘플이 됩니다. 표 2 데이터 셋의 일반적인 형태 이름 나이 성별 키 철수 10 남 153 영희 15 여 161 길동 21 남 181 그림 1은 통계적 추론 과정에서 모

편미분(Partial differential)

내용 편미분 결합함수의 편미분 편미분에 의한 극대와 극소 편미분 편미분 다음과 같이 하나 이상의 독립변수가 존재하는 경우의 종속변수는 모든 독립변수들 각각에 영향을 받습니다. 이러한 함수에서 종속변수의 변화는 각 독립변수의 변화에 대한 합으로 나타냅니다. 두 변수에 의한 함수의 경우 식 1과 같이 표현합니다. $$\begin{equation}\tag{1}y = f(u, v) \end{equation}$$ 식 1과 같이 두 독립변수로 구성된 함수의 미분은 각 독립변수에 대한 종속변수의 미분(변화율)으로 구성되며 이러한 미분을 편미분(partial differentiation) 이라 합니다. 편미분은 특정한 독립변수에 대해 실행할 경우 다른 독립변수를 상수로 간주하는 방식으로 이루어집니다. 그러므로 식1의 미분은 식 2와 같습니다. $$\begin{align}\tag{2} dy_v = v \cdot du\\ dy_u = u \cdot dv \end{align}$$ 식 2의 각 결과에서 아래첨자는 그 시행에서 상수로 간주되는 변수를 의미합니다. 이러한 편미분은 식 3과 같이 그리스 문자 $\partial$를 사용하여 다음과 같이 나타냅니다. $$\begin{align}\tag{3} \frac{\partial y}{\partial u}=v& \rightarrow dy_v = \frac{\partial y}{\partial u} \cdot du\\ \frac{\partial y}{\partial v}=u& \rightarrow dy_u = \frac{\partial y}{\partial v} \cdot dv \end{align}$$ 함수 y의 전체적인 미분은 각 편미분의 합으로 나타냅니다.(식 4) $$\begin{align}\tag{4} dy &= \frac{\partial y}{\partial u}du + \frac{\partial y}{\partial v} dv\\ &a

삼각함수의 미분

내용 sin, cos, tan의 미분 2차미분과 역함수 미분 삼각함수의 2차미분 sin, cos, tan 함수의 미분규칙 역함수의 미분 역삼각함수의 미분규칙 삼각함수(trigonometric functions)의 미분 sin, cos, tan의 미분 일반적으로 각을 표시하기 위해 그리스 문자 θ으로 사용합니다. 다음 함수를 고려해 봅니다. y = sin(θ) 이 함수에서 조사할 것은 그 함수의 변화량 (미분 계수) $\frac{d(\sin(\theta))}{d\theta}$ 입니다. 즉, 각도 θ와 sin(θ)의 변화 사이의 관계를 찾는 것입니다. 특히 증가가 무한히 작을 경우가 주된 관심 사항입니다. 이러한 관계를 그림 1에 나타내었습니다. import numpy as np import pandas as pd from sympy import * import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) a=plt.axes(xlim=(-1.5, 2.5), ylim=(-1.5, 2.5)) r=plt.Circle((0, 0), 1, facecolor="none", edgecolor="navy", linewidth=2, label="radius=r") a.add_patch(r) plt.arrow(0, 0, 0.8, np.sqrt(1-(-0.8)**2), color="green", label=r"$\mathbf{degree=\theta}}$") plt.arrow(0, 0, 0.7, np.sqrt(1-(-0.7)**2), color="red", label=r"$\mathbf{degree=\theta+\Delta\theta}}$") plt.hlines(0, -1.5, 1.5, color="black") plt.vlines(0, -1.5, 1.5, co

[data analysis]균일분포(Uniform Distribution)

균일분포(Uniform Distribution) 식 1은 구간 [a, b]에서 확률 변수 x는 일정한 확률밀도함수를 가지는 분포를 나타내는 것으로 균일분포라고 합니다. X ~ Uniform(a, b) (식 1) $$f(x)=\begin{cases}\frac{1}{b-a}&a\le x \le b\\ 0& \text{otherwise} \end{cases}$$ 예 1) 변수 X가 [0,10]의 범위에서 균일 분포를 이룬다면 다음 확률을 결정합니다. $$f(x) = \frac{1}{10-0}$$ p(2 < x < 9) p(1 < x < 4) p(x > 6) 이 균일분포의 확률밀도함수는 다음과 같습니다. a, b, x=symbols("a b x") f=Rational(1, 10) f $\frac{1}{10}$ 1) p(2 < x < 9) F1=f.integrate((x, 2, 9)) F1 $\frac{7}{10}$ 2) p(1 < x < 4) F1=f.integrate((x, 1, 4)) F1 $\frac{3}{10}$ 3) p(x > 6) F1=f.integrate((x, 6, 10)) F1 $\frac{2}{5}$ 예 2) 버스가 7시에 출발하여 특정 정거장에 정확히 15분 마다 정차한다고 가정합니다. 만약 승객이 7시와 7:30분 사이에 버스를 기다리는 경우 기다리는 시간에 대한 다음 확률을 결정합니다. 5분 미만 최소 12분 확률변수 X를 [0, 30] 사이의 분(minute)이라고 한다면 각 분에 승객이 정류장에 있을 확률은 1 / 30 으로 일정하므로 확률밀도함수 f(x) = 1 / 30 인 균일 분포를 따른다고 할 수 있습니다. P(X < 5분)의 경우 승객이 7시 10분 ~ 15분, 25분 ~ 30분 사이에 정류장에 있을 확률입니다. 즉, P(10 < x < 15) + P(2

[data analysis] 초기하분포(Hypergeometric distribution)

초기하분포(Hypergeometric distribution) 초기하분포(Hypergeometric distribution) 란 N개 중에 n번 비복원 추출하는 경우 x번 성공확률의 분포이다. 예를 들어 5개의 파란공과 3개의 빨간공이 포함되어 있는 주머니에서 2개의 공을 선택하면 그 공이 모두 파란 공일 확률은식 1과 같이 계산할 수 있습니다. $$\frac{\binom{5}{0} \binom{3}{2}}{\binom{8}{2}}$$ (식 1) p=special.comb(5,0)*special.comb(3,2)/special.comb(8, 2) round(p, 3) 0.107 이 시행은 모집단에서 선택할 공의 수에 대한 조건과 최종 성공을 위한 조건을 만족하여야 합니다. 즉, 두 가지 조건에 따른 시행은 선택된 파란공의 수가 랜덤변수(X)로 하면 표본공간은 S x = {0, 1, 2}로 정의할 수 있습니다. 각 변수에 대응하는 확률의 변화는 초기하분포에 부합하며 식 2와 같이 나타냅니다. X ∼ hypergeom(N, m, n) (식 2) N : 모집단 수 m : 성공경우의 총수 n : 총 시행횟수 식 1에서 확률변수 x의 변화에 의해 생성되는 초기하 분포는 hypergeom(8, 3, 2)으로 나타낼 수 있습니다. 이 식을 확률변수 x에 대해 일반화한 초기하분포의 확률질량함수는 식 3과 같이 정의됩니다. \begin{align}f(x) &= P(X=x)\\&=\frac{\binom{m}{x} \binom{N-m}{n-x}}{\binom{N}{n}} \end{align} (식 3) 초기하분포의 통계량들은 scipy.stats 모듈의 hypergeom() 클래스로 계산할 수 있습니다. x=2; M=8; n=3; N=2 round(stats.hypergeom.pmf(x, M, n, N),3) 0.107 확률변수 x에 대해 PMF를 계산하면 다음과 같습니다. p=stats.hypergeom.pmf(