<jupyter_start><jupyter_text>함수 - 입력값을 출력값으로 바꾸어 출력하는 관계          * 정의역 (doamin)     * 공역 (range) ---- Domain이 유한한 경우 - dict---- 변수$f(x) = 2x$<jupyter_code>def f(x):
    return 2*x


x = 10
y = f(x)

print(f"f({x}) = {y}")<jupyter_output>f(10) = 20<jupyter_text>---- 부호함수 (sign func)<jupyter_code>np.sign(-0.0001), np.sign(0), np.sign(0.0001)<jupyter_output><empty_output><jupyter_text>--- 단위계단함수 (heaviside step func)<jupyter_code>def heaviside_step(x):
    if isinstance(x, np.ndarray):
        return np.where(x >= 0, 1, 0)
    else: 
        return 1.0 if x >= 0 else 0.0

heaviside_step(-0.0001), heaviside_step(0), heaviside_step(0.0001)<jupyter_output><empty_output><jupyter_text>--- 지시함수 (indicator func)  데이터에  x가 몇 개 섞여있는지 구하라$N_0 = \Sigma^N_{i=1}I(x_i = 0)$$N_1 = \Sigma^N_{i=1}I(x_i = 1)$ --- 역함수$f^{-1}(x)$ - 역함수가 존재하지 않을 때   $f(x_1) = y^*$  $f(x_2) = y^*$   - 역함수가 존재하기 위해서는 domain을 양수로 제한해야한다. $(x > 0)$  $f^{-1}(x) = \sqrt{x}$ --- 함수의 그래프<jupyter_code>def f(x):
    return x**3 - 3 * x**2 + x
# linspace(첫점, 끝점, 점의 갯수)

x = np.linspace(-1,3,9)
x
y = f(x)
y
plt.plot(x,y,'ro-')
plt.xlim(-2,4)
plt.title("graph of $f(x) = x^3 - 3x^2 + x$")
plt.xlabel("x")
plt.ylabel("y")
plt.xticks(np.arange(-1,4))
plt.yticks(np.arange(-5,4))
plt.show()
x = np.linspace(-1,3,400)
y = f(x)
plt.plot(x,y)
plt.xlim(-2,4)
plt.title("graph of $f(x) = x^3 - 3x^2 + x$")
plt.xlabel("x")
plt.ylabel("y")
plt.xticks(np.arange(-1,4))
plt.yticks(np.arange(-5,4))
plt.show()
# 부호함수 & 단위계단함수 그래프 그리기

def heaviside_step(x):
    if isinstance(x, np.ndarray):
        return np.where(x >= 0, 1, 0)
    else: 
        return 1.0 if x >= 0 else 0.0

x = np.linspace(-1,1,1000)

sign = np.sign(x)
step = heaviside_step(x)

plt.figure(figsize=(7,4))
plt.subplot(121)
plt.plot(x,sign,"r-")
plt.title("sign func")
plt.ylim(-1.5,1.5)
plt.subplot(122)
plt.plot(x,step,"k-")
plt.title("heaviside_step func")
plt.ylim(-1.5,1.5)
plt.tight_layout()
plt.show()<jupyter_output><empty_output><jupyter_text>---- 역함수의 그래프<jupyter_code>def f1(x):
    return x ** 2

def f1inv(x):
    return np.sqrt(x)
x = np.linspace(0, 3, 300)
plt.plot(x, f1(x), "r-", label="func $f(x) = x^2$")
plt.plot(x, f1inv(x), "b-.", label="inverse function $f^{-1}(x) = \sqrt{x}$")
plt.plot(x, x, "g--")
plt.axis("equal")
plt.xlim(0, 2)
plt.ylim(0, 2)
plt.legend()
plt.title("graph of inverse function")
plt.show()<jupyter_output><empty_output><jupyter_text>--- 다항식함수  - 거듭제곱 항의 선형조합으로 이루어진 함수 --- 최대함수 & 최소함수 - 2개의 입력 값 중에서 크거나 작은 값을 출력하는 함수 - x < 0 값은 "0"으로 출력 - Deep Learning 에 쓰이는 함수 : ReLU (Rectified Linear Unit)<jupyter_code>xx = np.linspace(-10,10,100)
plt.plot(xx, np.maximum(xx,0))
plt.title("max(x,0) or ReLU")
plt.xlabel("$x$")
plt.ylabel("$ReLU(x)$")
plt.show()<jupyter_output><empty_output><jupyter_text>--- 지수함수 (exponential func) - 정해진 어떤 값을 입력 값으로 거듭제곱하여 출력을 구하는 함수<jupyter_code>np.e
np.exp(-10), np.exp(-1), np.exp(-0.1), np.exp(0), np.exp(0.1), np.exp(1), np.exp(10)<jupyter_output><empty_output><jupyter_text>지수함수 특성 - 양수($e$)를 거듭제곱한 값이므로 항상 양수 - $x=0$일 때 1이 된다.  - $x$가 양의 무한대로 가면 $(x\rightarrow\infty)$, 양의 무한대로 다가간다. - $x$가 음의 무한대로 가면 $(x\rightarrow-\infty)$, 0으로 다가간다. - $x_1 > x_2$이면, $exp x_1 > exp x_2$이다.<jupyter_code>xx = np.linspace(-2,2,100)
yy = np.exp(xx)

plt.title("exp func")
plt.plot(xx,yy)
plt.axhline(1, c='r', ls="--")
plt.axhline(0, c='r', ls="--")
plt.axvline(0, c='r', ls="--")
plt.xlabel("$x$")
plt.ylabel("$/exp(x)$")
plt.show()<jupyter_output><empty_output><jupyter_text>지수함수의 곱의 값 = 입력값 합의 지수함수 값$f(x_1)\cdot{f(x_2)} = e^{x_1}\cdot{e^{x_2}} = e^{x_1+x_2} = f(x_1 + x_2)$ --- 로지스틱 함수$\sigma(x) = \frac{1}{1+exp(-x)}$<jupyter_code>def logistic(x):
    return 1/(1+np.exp(-x))

xx = np.linspace(-10,10,100)
plt.plot(xx,logistic(xx))
plt.title("logistic func")
plt.xlabel("$x$")
plt.ylabel("$\sigma(x)$")
plt.show()<jupyter_output><empty_output><jupyter_text>--- 로그함수$y = a^x = (e^{log a})^x = e^{x log a}$ 지수함수의 역함수$y = log x$<jupyter_code>np.log(10)<jupyter_output><empty_output><jupyter_text>--- 로그함수의 특징 - $x$ 값, 즉 입력변수 값은 양수! 0이나 음수면 정의되지 않는다. - $x > 1$이면, $y>0$(양수) - $x = 1$이면, $y = 0$ - $0 < x < 1$이면, $y < 0(음수)$ - $x_1 > x_2$면 $log x_1 > logx_2$<jupyter_code>xx = np.linspace(0.01, 8, 100)
yy = np.log(xx)
plt.title("로그함수")
plt.plot(xx, yy)
plt.axhline(0, c='r', ls="--")
plt.axvline(0, c='r', ls="--")
plt.axvline(1, c='r', ls="--")
plt.xlabel("$x$")
plt.ylabel("$\log(x)$")
plt.show()<jupyter_output><empty_output><jupyter_text>로그함수의 성질 1 - 로그함수는 곱하기를더하기로 변환한다.  $log(x_1 \cdot {x_2} ) = log x_1 + log x_2$<jupyter_code>np.log(12)<jupyter_output><empty_output><jupyter_text>로그함수의 성질 2 - 어떤 함수에 로그를 적용해도 함수의 최고점, 최저점의 위치는 변하지 않는다.  $arg max _{x} f(x) = arg max_{x} logf(x)$  로그함수의 성질 3 - 로그함수는 0부터 1 사이의 작은 값을 확대시켜 보여준다. ---- 다변수 함수 - $z = f(x,y)$  - 2차원 함수의 표현 : Surface plot , contour plot으로 나타냄   $\rightarrow$ 2차원보다 큰 차원의 함수는 시각화 하기가 어렵다.  ---- 분리 가능 다변수함수 - $f(x,y) = f_1(x)f_2(y)$ ---- 다변수 다출력 함수 - 모든 출력 원소는 0과 1의 사잇값을 갖는다.  - 모든 출력 원소의 합은 1이다.  - 입력 원소의 크기 순서와 출력 원소의 크기 순서가 같다.<jupyter_code>def softmax(x,w):
    e = np.exp(w*x)
    return np.exp(w*x) / e.sum()

x = [2.0,1.0,0.5]
y = softmax(x, np.ones(3))
y
np.sum(y)
softmax(x, 4*np.ones(3))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.2306949806949807, 'fraction_numerical': 0.044787644787644784, 'mean_word_length': 3.9626436781609193, 'pattern_counts': {'":': 0, '<': 56, '<?xml version=': 0, '>': 63, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '281355', 'license': 'MIT', 'n_tokens_mistral': 3178, 'n_tokens_neox': 3366, 'n_words': 515, 'path': 'MATH/06_Function.ipynb', 'repo_name': 'CATERINA-SEUL/Data-Science-School', 'size': '5180'}