기본 콘텐츠로 건너뛰기

라벨이 sympy인 게시물 표시

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

R caracas패키지를 이용한 극한, 미분, 적분 (R에서 sympy 사용하기)

symbol과 subs() 극한(limit)을 사용하여 자연상수 발견하기 미분과 적분 식으로 값 결정 caracas패키지를 이용한 극한, 미분, 적분 symbol과 subs() 문자 s1, s2 심벌(기호)로 선언하기 위해 def_sym() 를 사용합니다. 이 함수는 symbol() 함수와 같습니다. 그러나 그 사용은 약간의 차이가 있습니다. def_sym(s1, s2);s1 #s1, s2를 선언 [caracas]: s1 s2 [caracas]: s2 str(s1) List of 1 $ pyobj:s1 - attr(*, "class")= chr "caracas_symbol" s3<-s1*s2; s3 #기호 s1, s2의 연산에 의해 선언된 기호 [caracas]: s1*s2 str(s3) #attr(*, "class")= chr "caracas_symbol" List of 1 $ pyobj:s1*s2 - attr(*, "class")= chr "caracas_symbol" subs() 함수는 기호를 다른 문자나 숫자로 대체합니다. subs(식 또는 심벌, 'caracas_symbol',대체할 문자 또는 숫자) 또는 subs('caracas_symbol',대체할 문자 또는 숫자) %>%: pipe operator는 R에서 동일한 데이터를 대상으로 연속으로 작업하게 해주는 연산자입니다. s4<-s3 %>%subs("s1", "u+v") %>% subs("s2", "u-v"); s4 [caracas]: (u - v)*(u + v) s5<-expand(s4); s5 [caracas]: 2 2 u - v tex(s5)

Sympy를 사용한 극한(limit)

내용 limit() 함수 좌극한, 우극한 data4limit 극한 limit() 함수 limit()함수를 사용합니다. limit(식, 변수, 값) 이 함수의 각 인수는 다음과 같습니다. $$\underset{\text{변수} \to \text{값}}{\quad \text{limit} \quad }\text{식}$$ import numpy as np import pandas as pd from sympy import * 예 함수 f(x)=sin(x)와 $g(x)=\frac{\sin(x)}{x}$의 0으로의 극한을 계산합니다. x=symbols('x') f=sin(x) limit(f, x, 0) 0 g=sin(x)/x limit(g, x, 0 ) 1 극한이 정해진 수에 접근하는 경우 .subs() 메서드를 적용할 수 있습니다. ex=x**2/exp(x) limit(ex, x, 1000) $\quad\color{navy}{\scriptstyle \frac{1000000}{e^{1000}}}$ ex.subs(x, 1000) $\quad\color{navy}{\scriptstyle \frac{1000000}{e^{1000}}}$ 그러나 변수가 무한대로 접근하는 경우 .subs()를 적용할 수 없습니다. limit(ex, x, oo) 0 ex.subs(x, oo) NaN sympy의 Limit 클래스는전달되는 식의 계산이 평가되지 않은 상태로 반환됩니다. Limit((cos(x)-1)/x, x, 0) $\quad\color{navy}{\scriptstyle \lim_{x \to 0^+}\left(\frac{\cos{\left(x \right)} - 1}{x}\right)}$ 위 표현식을 평가하기 위해 .doit() 메서드가 적용됩니다. Limit((cos(x)-1)/x, x, 0).doit() 0 limit((cos(x)-1)/x, x, 0) 0 좌극한, 우극한 함

정규분포 그리기

정규분포 (Normal Distribution) 평균이 $\mu$이고 표준편차 $\sigma$인 연속확률변수 x의 확률밀도함수가 다음과 같다면 정규분포를 따릅니다. $$f(x) = \frac{1}{\sigma \sqrt{2 \pi}}\exp\left(-\frac{1}{2}\left[\frac{x-\mu}{\sigma}\right]^2\right), \quad -\infty \lt x \lt \infty $$ import numpy as np import pandas as pd from sympy import * import matplotlib.pyplot as plt sympy를 사용 x,m,s=symbols('x, mu, sigma') fn=1/(s*sqrt(2*pi))*exp(-Rational(1,2)*((x-m)/s)**2) simplify(fn) $\frac{\sqrt{2} e^{- \frac{\left(\mu - x\right)^{2}}{2 \sigma^{2}}}}{2 \sqrt{\pi} \sigma}$ fig, ax=plt.subplots(1, 2, figsize=(15, 4)) a=np.linspace(-6, 6, 100) for j in [-2, 0, 2]: b=[float(fn.subs({x:i, m:j, s:1})) for i in a] ax[0].plot(a, b, label='['+r'$\mu:$'+str(j)+','+r'$\sigma:$'+str(1)+']') ax[0].legend(loc='best') ax[0].set_xlabel("x", size=12, weight="bold") ax[0].set_ylabel("f(x)", size=12, weight="bold") ax[0].spines['left'].set_pos

Sympy 객체를 사용한 미분과 적분

내용 개요 sympy에 의한 미분 Sympy에 의한 적분 Sympy 객체를 사용한 미분과 적분 개요 모듈 듈 Sympy는 기호(symbol)로 이루어진 수학적 객체의 계산을 다룹니다. 즉, 일반적으로 사용하는 x, y 등과 같은 문자를 수학적 기호로 인식하여 수학식을 표현하는 수단을 제공합니다. 또한 sympy에서 ∞는 알파벳 소문자 o를 두번 연이어 표시하는 것으로 대체합니다. oo = ∞ 다음은 파이썬 코드와 모듈 math, sympy를 사용하여 제곱근을 계산한 결과를 나타낸 것입니다. import math from sympy import * 9**0.5 3.0 pow(9, 0.5) #파이썬 내장함수 3.0 math.sqrt(9) #모듈 math함수 3.0 sqrt(9) #sympy 함수 3 위 결과는 모두 실수로 반환됩니다. 그러나 8의 제곱근과 같이 근사값(무리수)이 반환되는 경우는 그 결과의 표현이 달라집니다. sympy를 사용할 경우 일반적으로 수학적으로 표현하는 방식으로 결과를 반환합니다. round(8**0.5,3) 2.828 round(pow(8, 0.5), 3) #파이썬 내장함수 2.828 round(math.sqrt(8), 3) #모듈 math함수 2.828 sqrt(8) #sympy 함수 $2 \sqrt{2}$ 위의 sympy에 의한 결과 $\sqrt{2}$는 기호입니다. 즉, sympy 객체는 실제 수와 함께 일정한 기호을 사용하기 때문에 다양한 수학적 표현이 가능합니다. sympy 모듈은 $\sqrt{2}$와 같은 자체적으로 지정된 기호외에 symbols() 함수를 사용하여 사용자가 사용하는 기호를 정의할 수 있습니다. x, y=symbols('x y') type(x) sympy.core.symbol.Symbol expr=x+2*y expr x + 2 y 위에서 expr 객체는 기호 x, y를 지닌 객체입니다.

선형변환(Linear transformation)

내용 선형변환 변환 영변환과 항등변환 표준기저 특별한 선형변환 동일차원으로 선형변환의 경우 일정각도의 이동 선형변환(Linear transformation) 선형변환 선형변환(Linear transformation, T: U → V)은 어떤 벡터 공간의 U를 다른 벡터 공간 V로 옮기는 함수입니다. 이러한 함수는 식 6.1를 만족해야 합니다. $$\begin{align}\tag{1} &\forall \; \text{u}_1,\; \text{u}_2 \in \text{U} \rightarrow T(\text{u}_1 + \text{u}_2) = T(\text{u}_1)+T(\text{u}_2)\\ &\forall \; \text{u} \in \text{U} \cap α \in \text{C} \rightarrow T(\alpha \text{u}) = \alpha T(\text{u}) \end{align}$$ 위 식에서 U와 C는 각각 벡터와 스칼라입니다. 식 1은 벡터들의 선형결합 의 조건과 같습니다. 즉, 선형결합이 성립되는 벡터들은 선형 변환이 가능하다는 것을 의미합니다. 예)  다음 식이 선형변환인지를 결정합니다. $$\begin{align}&T\left( \begin{bmatrix} x_1\\x_2\\x_3 \end{bmatrix}\right)=\begin{bmatrix} 2x_1+x_3\\-4x_2\end{bmatrix}\\ &A=\begin{bmatrix} 2&0&1\\0&-4&0 \end{bmatrix} \end{align}$$ 정의역의 x 1 , x 2 , x 3 에 대한 위 변환이 성립되면 변환의 결과(T 1 , T 2 )에 대한 행렬방정식은 다음과 같습니다. $$Ax = T \right

변환(Transform)과 핵 그리고 치역(Kernel and Range)

내용 정의역, 치역과 공역의 관계 가역행렬 변환(Transform)과 핵 그리고 치역(Kernel and Range) 변환은 어떤 수 x를 식에 대입하여 그 값에 대응하는 결과인 y를 반환하는 함수를 의미합니다. 함수에 입력되는 값의 범위와 개수는 항상 결과의 범위나 개수를 확정하지 못합니다. 즉, 함수에 따라 1개의 실수 입력 값은 여러 개의 유리수를 포함하는 값으로 출력될 수도 있습니다. 함수에 입력 범위를 정의역 (domain), 가능한 모든 결과물들의 범위를 공역 (codomain)이라고 합니다. 예로서 python에서는 모든 수를 정수로 만들기 위해 int() 함수를 사용합니다. 이 경우 정의역은 실수이지만 공역은 정수가 될 것입니다. import numpy as np import numpy.linalg as la import sympy as sp import matplotlib.pyplot as plt from matplotlib import rcParams rcParams['font.family'] = 'nanumgothic' rcParams['font.weight'] = 'bold' rcParams['font.size'] = '11' x=3.24 y=int(x) y 3 공역 중 함수의 결과들을 상 (image)이라 하며 이 상들의 집합을 치역 (range)이라고 합니다. 치역은 공역의 부분 집합이 됩니다. 예를 들어 이러한 정의역(x)과 상(치역)의 관계는 변환에 관계된 행렬 A에 의해 식 1과 같이 선형결합의 형태로서 다음과 같이 작성할 수 있습니다. $$A= \begin{bmatrix} -2&-1\\0&-4 \end{bmatrix},\quad \text{x(정의역)}=\begin{bmatrix} -3\\1 \end{bmatrix},\quad \text{

직교벡터(Orthogonal vectors)와 정사영(Projection)

내용 직교벡터(Orthogonal vectors) 정사영(Projection) 직교벡터와 정사영 직교벡터(Orthogonal vectors) 두 벡터의 내적 과 사잇각은 식 1과 같이 계산됩니다. $$\begin{align}\tag{1} &u \cdot v=\parallel{u}\parallel \parallel{v}\parallel \cos(\theta) \\ & \cos(\theta) =\frac{u \cdot v}{\parallel{u}\parallel \parallel{v}\parallel} \end{align}$$ 식 1에 의하면 두 벡터가 직각 을 이루는 경우 내적은 0가 됩니다. 이러한 벡터를 직교벡터 (Orthogonal vectors)라 합니다. 그림 1은 벡터 u와 v와 벡터 u와 -v는 모두 직각관계를 나타냅니다. 즉, 벡터 v에 수직인 벡터 u는 다음의 조건을 만족합니다. $$\parallel{u-v}\parallel=\parallel{u-(-v)}\parallel$$ import numpy as np import numpy.linalg as la import sympy as sp import matplotlib.pyplot as plt a, u, uNeg, v=[0,0], [3,0], [-3,0], [0,3] col=['blue','red','green'] nme=['u', '-u','v'] plt.figure(dpi=100) for i, j in enumerate([u, uNeg, v]): plt.arrow(a[0], a[1], j[0]-a[0], j[1]-a[1], width=0.05, color=col[i], label=nme[i]) plt.arrow(uNeg[0],uNeg[1], v[0]-uNeg[0],v[1]-uNeg[1], linestyle='--

벡터 연산

내용 노름과 단위벡터(Norm and Unit Vector) 행렬노름 조건수(Condition Number) 벡터들의 연산 덧셈과 뺄셈, 그리고 스칼라 배 내적(Inner product) 코쉬-슈바르츠 부등식 (Cauchy-Schwarz inequality) 삼각부등식(Triangle inequality) 벡터 연산 노름과 단위벡터(Norm and Unit Vector) 식 1과 같이 벡터들 사이에서 계산된 거리(D)를 norm(노름) 또는 유클리드 거리 (Euclidean distance)라 하고 $\parallel{x}\parallel$로 나타냅니다. $$\begin{equation}\tag{1}\text{D}=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2+\cdots}\end{equation}$$ 예를 들어 x, y, z 축을 가지는 3차원의 벡터 a의 크기(노름, norm)는 벡터 b를 기준으로 식 2와 같이 계산됩니다. $$a=\begin{bmatrix} a_1\\a_2\\a_3\end{bmatrix}, \quad \ b=\begin{bmatrix} b_1\\b_2\\b_3\end{bmatrix}$$ $$\begin{equation}\tag{2}\parallel{x}\parallel=\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+(a_3-b_3)^2}\end{equation}$$ 물론 시점을 명시하지 않을 경우는 원점(0,0,0)으로 간주합니다. 노름 계산을 위해 np.linalg.norm(x) 함수를 사용할 수 있습니다. 이 함수는 numpy의 하위 모듈인 linalg에 포함된 함수이므로 아래 코드와 같이 numpy.linalg를 장착(import)하여 사용합니다. 또한 결과를 소수점 이하의 일정한 자리에서 반올림으로 나타내기 위해 np.around() 함수를 적용하였습니다

적분방법

내용 부분적분 치환적분 적분방법 어떤 것을 적분하기 위해서는 그들을 적분할 수 있는 형태로 재구성하는 것으로부터 시작합니다. 이러한 재구성에는 다양한 방법들이 적용됩니다. 부분적분 식 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

정적분(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