---
# System prepended metadata

title: 수업정리

---

# 수업정리

# 과제 1
```python
import numpy as np

def get_greatest(number_list):
    # 주어진 리스트에서 가장 큰 숫자를 반환함
    np_array = np.array(number_list, int)
    greatest_number = np.amax(np_array)
    return greatest_number

def get_smallest(number_list):
    # 주어진 리스트에서 제일 작은 숫자를 반환함
    np_array = np.array(number_list, int)
    smallest_number = np.amin(np_array)
    return smallest_number

def get_mean(number_list):
    # 주어진 리스트 숫자들의 평균을 구함.
    mean = np.average(np.array(number_list, int))
    return mean

def get_median(number_list):
    # 주어진 리스트 숫자들의 중간값을 구함.
    median = np.median(np.array(number_list, int))
    return median
```


## def get_greatest(number_list)

```python
import numpy as np

def get_greatest(number_list):
    # 주어진 리스트에서 가장 큰 숫자를 반환함
    np_array = np.array(number_list, int)
    greatest_number = np.amax(np_array)
    return greatest_number
```

- numpy의 내장함수 amax를 사용함
- 파이썬 내장함수를 사용할경우 max(list)를 사용한다.

# 과제 2

## 전체코드

```python
def normalize(input_string):
    """
     인풋으로 받는 스트링에서 정규화된 스트링을 반환함
     아래의 요건들을 충족시켜야함
    * 모든 단어들은 소문자로 되어야함
    * 띄어쓰기는 한칸으로 되어야함
    * 앞뒤 필요없는 띄어쓰기는 제거해야함
    """
    trim_lower_string = input_string.strip().lower().split() # 소문자, 앞뒤 띄어쓰기 제거
    return ' '.join(trim_lower_string)

def no_vowels(input_string):
    # 인풋으로 받는 스트링에서 모든 모음 (a, e, i, o, u)를 제거시킨 스트링을 반환함
    vowels = ('a', 'e', 'i', 'o', 'u')
    no_vowel_string = ''.join([i for i in input_string if i.lower() not in vowels])
    return no_vowel_string
```

## 개별코드

```python
def normalize(input_string):
    trim_lower_string = input_string.strip().lower().split() # 소문자, 앞뒤 띄어쓰기 제거
    return ' '.join(trim_lower_string)
```

- strip : 앞뒤 공백제거
- lower : 소문자로 변환
- split : 입력된 값을 기준으로 나누어 리스트를 만들어줌. Default = " "
    - 여러개의 띄어쓰기가 있을때 하나로 만들어줌
- join : list를 해당 string을 사이에 입력하여 string으로 반환

---

```python
def no_vowels(input_string):
    vowels = ('a', 'e', 'i', 'o', 'u')
    no_vowel_string = ''.join([i for i in input_string if i.lower() not in vowels])
    return no_vowel_string
```

- vowels 경우 변경할 일이 없으므로 튜플로 입력
- ''.join([i for i in input_string if i.lower() not in vowels])의 경우 파이소닉 코드를 참고하였음

```python
a = [i for i in input_string if i.lower() not in vowels]

a = []
for i in input_string:
	if i.lower() not in vowels:
		a.append(i)
```

# 과제 3

## 전체코드

```python
def digits_to_words(input_string):
    """
    인풋으로 받는 스트링에서 숫자만 추출하여 영어 단어로 변환하여 단어들이 연결된 스트링을 반환함
    아래의 요건들을 충족시켜야함
    * 반환하는 단어들은 영어 소문자여야함
    * 단어들 사이에는 띄어쓰기 한칸이 있음
    * 만약 인풋 스트링에서 숫자가 존재하지 않는 다면, 빈 문자열 (empty string)을 반환함
    """
    num_dict = {'0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', '5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine'}
    num_list = []
    for i in input_string:
        if i in num_dict.keys():
            num_list.append(num_dict[i])
    digit_string = ' '.join(num_list)
    return digit_string

def to_camel_case(underscore_str: str):
    """
    이 문제에서 첫번째 규칙 'underscore variable' 에서 두번째 규칙 'camelcase variable'으로 변환함
    * 앞과 뒤에 여러개의 'underscore'는 무시함
    * 만약 어떤 변수 이름이 underscore로만 이루어 진다면, 빈 문자열만 반환함
    """
    if '_' not in underscore_str:
        return underscore_str
    lower_str_list = underscore_str.strip().lower().split('_')
    camelcase_str = ''
    for i in lower_str_list:
        if len(i) == 0:
            continue
        camelcase_str += i.capitalize()
    if len(camelcase_str) > 1:
        camelcase_str = camelcase_str[0].lower() + camelcase_str[1:]
    elif len(camelcase_str) > 0:
        camelcase_str = camelcase_str[0].lower()
    return camelcase_str
```

## 개별 코드

```python
def digits_to_words(input_string):
    num_dict = {'0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', '5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine'}
    num_list = []
    for i in input_string:
        if i in num_dict.keys():
            num_list.append(num_dict[i])
    digit_string = ' '.join(num_list)
    return digit_string
```

- num_dict을 만들어 사용할 숫자를 입력

```python
def to_camel_case(underscore_str: str):
    if '_' not in underscore_str:
        return underscore_str
    lower_str_list = underscore_str.strip().lower().split('_')
    camelcase_str = ''
    for i in lower_str_list:
        if len(i) == 0:
            continue
        camelcase_str += i.capitalize()
    if len(camelcase_str) > 1:
        camelcase_str = camelcase_str[0].lower() + camelcase_str[1:]
    elif len(camelcase_str) > 0:
        camelcase_str = camelcase_str[0].lower()
    return camelcase_str
```

- _가 없을경우 underscore가 아니므로 그대로 반환
- _을 기준으로 단어를 나눔
- list안에 있는 모든단어의 앞글자를 대문자로 변환 (capitalize)
- 마지막에 만들어진 단어의 맨 앞글자를 소문자로 변환

# AI

# 벡터
# 개념

> 벡터는 방향과 거리를 나타낸 요소

# 노름

- 원점에서부터의 거리
- L1노름과 L2노름이 있다.

## L1 노름과 L2 노름의 차이

![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/669fcd8e-f97e-4c0a-9d20-2dcc84053807/Untitled.png](https://i.imgur.com/7dH9bA3.png)

- L1 노름은 벡터의 모든요소의 절댓값의 합을 의미한다
- L2 노름은 벡터의 모든요소의 제곱값을 더하고 루트를 씌운값이다.

# 두 벡터사이의 각도 구하기

- 제 2 코사인 법칙을 이용한다
- $a^2 = b^2 + c^2 - 2bc*cosA$

![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/779d7a47-abca-486c-a154-8f31b63f1738/Untitled.png](https://i.imgur.com/SErey1O.png)

- $\overline{AC} = \sqrt{\overline{AH}^2 + \overline{HC}^2}$
- $\overline {AH} = \overline {AB} sinB$
- $\overline {HC} = \overline {BC} -  \overline {AB}cosB$
- $\overline {AC}^2 = \overline {AB}^2 + \overline {BC}^2 - 2 \overline {AB}\overline {BC}cosB$

# 행렬

## 전치 행렬

$X = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix}$ $X^T = \begin{bmatrix} 1 & 4 & 7 \\ 2 & 5 & 8\\ 3 & 6 & 9 \end{bmatrix}$

- 대각선을 기준으로 위치가 바뀐 행렬

## 역행렬

- 파이썬의 numpy.linalg.inv를 통해 구할수 있다.
- 서로 행렬 곱을 할경우 항등행렬(E)가 나온다.

$X = \begin{bmatrix}a & b \\ c & d\end{bmatrix}$

$X^{-1} = \begin{bmatrix}d & -b \\ -c & a\end{bmatrix} / (ad-bc)$

- 2차원 행렬 그 이상으로 가면 파이썬을 이용하는게 편하다.

## 유사 역행렬

- 역행렬을 계산할수 없을 경우에 사용
- 파이썬의 numpy.linalg.pinv를 통해 구할수 있다.
- 역시 계산은 파이썬으로

![](https://i.imgur.com/LNTSSU1.png)
- 가중치를 구하기위해 사용하는 경우
- y = xB + e => B를 어떻게 구하는가?

# 경사하강법

## 미분

- 변수의 움직임에 따른 함수값의 변화를 나타낸다.
- $\lim_{h\to0}{f(x+h) - f(x)\over h}$
- $f(x, y) = 9y^2 + 3y + 9x + 3$
- $\frac{\partial f(x, y)}{\partial x}​$ 의 경우 x값에 대한 증가량을 나타냄

## 경사하강법

- 1차 미분계수를 이용하여 함수의 최솟값을 찾아가는 방법
- h를 0으로 할수 없기 때문에 Step size를 조정하여 프로그램을 통해 찾아간다.

### 경사하강법 수식

![https://cdn.hackernoon.com/hn-images/1*ZmzSnV6xluGa42wtU7KYVA.gif](https://cdn.hackernoon.com/hn-images/1*ZmzSnV6xluGa42wtU7KYVA.gif)

- $x_{i+1}=x_i − 이동 거리$
- $이동거리 = stepSize * {df(x)\over dx}$
- 최솟값을 찾아야 하므로 기울기의 부호가 음수일때 x의 크기가 증가해야한다.
- 이동거리는 미분값을 이용한다. 기울기가 클수록 더 많이 움직이게 된다.

[경사하강법(gradient descent)](https://angeloyeo.github.io/2020/08/16/gradient_descent.html)

## 그라디언트 벡터

- 기울기 벡터
- 변수가 2개 이상인 함수에서 사용하는 경사하강법이라 이해하면 쉬울거같다

![https://i.imgur.com/63GLfCG.png](https://i.imgur.com/63GLfCG.png)

- 경사하강법에서는 변수가 하나이기 때문에 절댓값을 사용하여도 되었지만, 그라디언트 백터는 변수가 두개 이상이므로 L2노름을 사용한다.
