# 수업정리 # 과제 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노름을 사용한다.