살다보면 가끔 그런 날이 있다. 평소에 자주 쓰던, 익히 알고있다고 생각하던 단어들이 갑자기 낯설어지는 그런 날
오늘이 딱 그랬다. 선형회귀, 등등 잘 알고있다고 생각했는데, 갑자기 이게 왜? 예시가 없나? 왜 이렇게 되지? 라는 의문이 계속 드는 그런 날이었다.
Pandas
📌 Series
- dataframe 중 하나의 column에 해당하는 데이터의 모음 object
- numpy와의 가장 큰 차이점 : 인덱스 값을 지정해줄 수 있다.
- default 값은 0부터 시작하는 숫자지만 따로 인덱스를 지정해줄 수 있다. value들의 데이터타입은 기본적으로 nd.array
list_data = [1, 2, 3, 4, 5]
example_obj = Series(data=list_data)
example_obj
# 0 1
# 1 2
# 2 3
# 3 4
# 4 5
# dtype: int64
list_data = [1, 2, 3, 4, 5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = Series(data=list_data, index=list_name)
example_obj
# a 1
# b 2
# c 3
# d 4
# e 5
# dtype: int64
- data , index 등의 kwargs를 주면 시리즈의 이름, 인덱스의 이름을 따로 지정해줄 수 있다. (but 자주 안 씀)
- 시리즈는 인덱스를 기준으로 생성된다.
dict_data_1 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
indexes = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = Series(dict_data_1, index=indexes)
series_obj_1
# a 1.0
# b 2.0
# c 3.0
# d 4.0
# e 5.0
# f NaN
# g NaN
# h NaN
# dtype: float64
📌 DataFrame
- series와는 다르게 값에 접근하기위해선느 column명과 index모두 알아야된다.
각 column별로 데이터type이 다를 수 있다. (하나의 column은 데이터 type 같아야함 ) - column을 선택해 series를 추출하는 방법 두가지!
df.first_name
#0 Jason
#1 Molly
#2 Tina
#3 Jake
#4 Amy
#Name: first_name, dtype: object
df["first_name"]
#0 Jason
#1 Molly
#2 Tina
#3 Jake
#4 Amy
#Name: first_name, dtype: object
- Dataframe indexing : loc , iloc
- loc : index의 이름
- iloc : index의 넘버
- 이거 처음배울 때 굉장히 재밌는 개념이었는데, loc 사용하는 게 너무 헷갈려 나는 주로 iloc를 썼던 거 같다.
s = pd.Series(np.nan, index=[49, 48, 47, 46, 45, 1, 2, 3, 4, 5])
s.loc[:3]
#49 NaN
#48 NaN
#47 NaN
#46 NaN
#45 NaN
#1 NaN
#2 NaN
#3 NaN
#dtype: float64
s.iloc[:3]
#49 NaN
#48 NaN
#47 NaN
#dtype: float64
이렇게 인덱스의 번호와 이름이 상이할 때는 loc와 iloc가 헷갈리지 않지만, 같을 때는 좀 헷갈린다.
- iloc는 이름을 보는 거므로 .loc하면 인덱스가 3인값 까지 나오지만
- loc는 넘버를 보는거므로 .iloc하면 인덱스가 3인 값 이전까지 나온다. (포함x)
- column에 새로운 데이터 할당하기
- df의 age column에서 40보다 큰 조건을 만족시키는 행에 대해서는 true , false가 뜨는 debt column 생성
df.debt = df.age > 40
df
# first_name last_name age city debt
# 0 Jason Miller 42 San Francisco True
# 1 Molly Jacobson 52 Baltimore True
# 2 Tina Ali 36 Miami False
# 3 Jake Milner 24 Douglas False
# 4 Amy Cooze 73 Boston True
❗ pandas 에서 엑셀을 사용하기 위해서는 xlrd라는 모듈을 사용해야된다.
- df["컬럼명"] vs df[["컬럼명"]]
- df 내 컬럼명을 바로 주게 되면 sereis가 출력된다.
column을 select 해 dataframe으로 사용/출력하고싶다면 리스트 안에 넣어서 전달해줘야된다.
- df.rest_index() : index가 새로 하나 더 생김
- data drop : df.drop(인덱스넘버)
- 행,열을 drop시킨 상태로 df를 변화시키고 싶다면 inplac = True 를 인자로 주자.
- axis 기준으로 삭제할 수 있다. -> 행/열 모두 용이하게 삭제
📌 DataFrame operation
- add 와 같은 사칙연산 : index를 기준으로 연산수행, 겹치는 index가 없을 경우 NaN값으로 반환
- NaN값에 대해서 fill_value 를 사용하여 원하는 값으로 채워준다 -> 주로 결측치 볼 때 - series + dataframe : axis를 기준으로 row broadcationg이 발생
📌 map for series
- series type의 데이터에도 map 함수를 사용할 수 있다
s1 = Series(np.arange(5))
s1.map(lambda x : x**2).head()
# 0 0
# 1 1
# 2 4
# 3 9
# 4 16
# dtype: int64
- map이 아닌 dict type으로 데이터 교체도 가능하다.
z = {1: "A", 2: "B", 3: "C"}
s1.map(z)
# 0 NaN
# 1 A
# 2 B
# 3 C
# 4 NaN
# 5 NaN
# 6 NaN
# 7 NaN
# 8 NaN
# 9 NaN
# dtype: object
- 내장 연산 함수를 사용할때도 컬럼별로 똑같은 효과
df_info.apply(np.mean)
#earn 32446.292622
#height 66.592640
#age 45.328499
df_info.mean()
#earn 32446.292622
#height 66.592640
#age 45
- applymap
f = lambda x: x // 2
df_info.applymap(f).head(5)
# earn height age
# 0 39785.0 36.0 24
# 1 48198.0 33.0 31
# 2 24355.0 31.0 16
# 3 40239.0 31.0 47
# 4 41044.0 31.0 21
📌built-in fuction
- describe : 데이터의 요약 정보(기술통계값들)
- unique : series 내 유일하게 가지는 값들을 반환해줌 (set 같은 느낌, sex라면 male, female만 나오듯)
- isnull : NaN값의 index를 반환함
- sum 사용 시 , Null인 값의 합 - sort_values : column값 기준 sorting
- corr , cov : 상관계수와 공분산을 구하는 함수
- corr : 두 컬럼의 상관계수를 구하는 거고 corrwith는 하나의 컬럼과 데이터 프레임 내 나머지 컬럼들과의 상관계수를 구하는 내장함수
❓❔활성화 함수를 사용하지 않으면 선형모델과 차이가 없다. 왜?
1. 선형과 비선형
블로그를 참고했다. 선형이라는 뜻은 아래 3개를 모두 충족시키면 선형성이라고 한다.
1 ) 선형적인 그래프 : 중학생 때 배우는 일차함수의 그래프를 의미한다.
2 ) 동차성 :f(ax) = a*f(x)
3 ) 가산성 : f(x1 + x2) = f(x1) + f(x2)
ReLU는 왜 비선형함수일까?
1 ) 선형그래프가 아니다.
정의역을 [0,INF]식으로 잘라보면다면 선형그래프일지 몰라도 전체 실수공간에 대해 선형적이지 못하다.
2 ) 동차성을 만족하지 못한다.
a = -1 , x = 1 이라하면
f(ax) = f(-1) = 0 이지만 af(x) = -f(1) = -1로 동차성을 만족하지 못한다.
3) 가산성을 만족하지 못한다.
x1 = 1 , x2 = -2라 하면
f(x1 + x2) = f(-1) = 0이지만 f(x1) + f(x2) = 1 + 0 =1 로 가산성을 만족하지 못한다.
2. 활성함수를 사용하지 않으면 선형모델과 차이가 없는 이유
대부분의 활성함수 sigmoid , tanh , relu 등은 비선형함수들이다.
만약 hidden layer가 2개 존재하며
첫번째 레이어는 f(x) = ax , 두번째 레이어는 g(x) = bx라고 하면 레이어 두개를 다 거친 output은 g(f(x))로 ba * x 로 레이어를 한 번 취한 것과 같게 된다.
결국 비선형성이 없다면 레이어를 아무리 아무리 쌓아도 그냥 1개의 선형변환이 된다는 것이다.
3. 비선형이 중요한 이유
선형만으로는 XOR문제를 풀 수 없다. 직선 하나로 공간을 4개로 분할할 수 없기 떄문이다.
그렇기 때문에 비선형 레이어가 필요한 것이다.
그래서 레이어를 깊게 쌓아 비선형을 더해줄 수록 decsion boundary가 더욱 많아져 더 잘 분류할 수 있게 되는 거 같다.
피어세션
- 피어세션이 피어씁니다 ^_____^ 를 준비하면서 잘 몰랐던 조원들의 모습에 대해서 알게되었다.
유진님은 공부하기 싫으면 헬스를 하시고, 보현님은 수영을 하시고 , 보윤님은 음주가무에 능한 흥부자였다,,,,,,!
서로의 장점도 같이 얘기하면서 친해진 거 같다.
성훈님은 항상 성실하셔서 매일 학교에 가고, 줌에도 1등으로 오신다.
희준님은 센스 있어서 항상 말씀이나 행동을 재밌게 하신다. 요새 내 배꼽도둑 1위ㅠ
보현님은 질문을 하실 때 눈이 엄청 반짝 반짝 빛난다. 더 잘 알려주고싶다해야되나,,,, ? 좋은 에너지다.
보윤님은 이것 저것 많이 하셔서 잘 안쉬실 줄 알았는데 술 + 노래 + 춤을 다 좋아하는 끼부자 흥부자,,,,
역시 공부 잘하는 사람들이 노는 것도 잘하는 거 같다.
유진님은 공부하기 싫을 때 헬스를 하신다는 게 너무 대단하다,,,, 난 유튜브 보는데 어떻게 그러시지
- 백준 17068번 아기상어
어쩌다가 두 번 풀었다,,,, 로직이 잘못됐나? 해서 다르게 풀었는데 8방향 부호 하나 잘못써서 그랬던 거였음 ^^...
from collections import deque
n,m = map(int,input().split())
shark = []
for i in range(n):
shark.append(list(map(int, input().split())))
dx = [1,1,1,-1,-1,-1,0,0]
dy = [0,1,-1,0,1,-1,1,-1]
def bfs(s_x,s_y):
visited = [[0 for _ in range(m)] for _ in range(n)]
q = deque([[s_x,s_y]])
visited[s_x][s_y] = 1
while q:
x ,y = q.popleft()
if (shark[x][y] == 1) :
return visited[x][y] - 1
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if (-1< nx < n and -1 < ny < m and not visited[nx][ny]):
visited[nx][ny] = visited[x][y] + 1
q.append([nx,ny])
nmax = 0
for i in range(n) :
for j in range(m):
if not shark[i][j]:
nmax = max(nmax, bfs(i,j))
print(nmax)
from collections import deque
dx = [1,1,1,-1,-1,-1,0,0]
dy = [0,1,-1,0,1,-1,1,-1]
n,m = map(int,input().split())
q = deque()
visited = [[0 for _ in range(m)] for _ in range(n)]
shark = []
for i in range(n):
shark.append(list(map(int, input().split())))
def where_shark():
for i in range(n):
for j in range(m) :
if shark[i][j] :
q.append([i,j])
visited[i][j] = 1
def check(x,y):
return (-1< x < n and -1 < y < m and not visited[x][y] and not shark[x][y])
def bfs():
nmax = 0
while q:
x, y = q.popleft()
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if check(nx,ny):
visited[nx][ny] = visited[x][y] + 1
nmax = max(nmax ,visited[nx][ny])
q.append([nx,ny])
return nmax
where_shark()
print(bfs()-1)
from collections import deque
dx = [-2,-2,0,0,2,2]
dy = [-1,1,-2,2,-1,1]
n = int(input())
start_x, start_y , end_x , end_y = map(int,input().split())
q = deque([[start_x,start_y]])
visited = [[0 for _ in range(n)] for _ in range(n)]
visited[start_x][start_y]= 1
answer = 0
def bfs(ex, ey):
while q:
x, y = q.popleft()
if (x == ex and y == ey) :
return visited[ex][ey] -1
for i in range(6):
nx = x + dx[i]
ny = y + dy[i]
if -1< nx <n and -1< ny <n and not visited[nx][ny]:
visited[nx][ny] = visited[x][y] + 1
q.append([nx,ny])
answer = bfs(end_x, end_y)
if answer : print(answer)
else : print(-1)
'Naver Ai Boostcamp' 카테고리의 다른 글
[DAY 10] 시각화 / 통계학 (0) | 2021.01.30 |
---|---|
[DAY 9] Pandas II / 확률론 (0) | 2021.01.29 |
[DAY 7] 경사하강법 (0) | 2021.01.26 |
[DAY 6] Numpy / 벡터 / 행렬 (0) | 2021.01.26 |
[DAY 5] 파이썬으로 데이터 다루기 (0) | 2021.01.23 |