# 수업정리
# 과제 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 노름의 차이

- L1 노름은 벡터의 모든요소의 절댓값의 합을 의미한다
- L2 노름은 벡터의 모든요소의 제곱값을 더하고 루트를 씌운값이다.
# 두 벡터사이의 각도 구하기
- 제 2 코사인 법칙을 이용한다
- $a^2 = b^2 + c^2 - 2bc*cosA$

- $\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를 통해 구할수 있다.
- 역시 계산은 파이썬으로

- 가중치를 구하기위해 사용하는 경우
- 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를 조정하여 프로그램을 통해 찾아간다.
### 경사하강법 수식

- $x_{i+1}=x_i − 이동 거리$
- $이동거리 = stepSize * {df(x)\over dx}$
- 최솟값을 찾아야 하므로 기울기의 부호가 음수일때 x의 크기가 증가해야한다.
- 이동거리는 미분값을 이용한다. 기울기가 클수록 더 많이 움직이게 된다.
[경사하강법(gradient descent)](https://angeloyeo.github.io/2020/08/16/gradient_descent.html)
## 그라디언트 벡터
- 기울기 벡터
- 변수가 2개 이상인 함수에서 사용하는 경사하강법이라 이해하면 쉬울거같다

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