[부스트캠프] 1주차 학습정리

1. 강의 복습내용

1. 벡터

벡터(Vector)
: 숫자를 원소로 가지는 list or array

  • in 세로 : 열벡터, in 가로 : 행벡터(T첨자) (보통 numpy로 표현할 때는 행벡터로 표현)
  • 벡터의 차원 : 벡터에 있는 숫자들의 개수
  • 벡터는 공간에서 한 점(원점으로부터의 상대적 위치)을 나타냄
  • 벡터에 숫자를 곱해주면(스칼라 곱) 길이만 변함
    xT=[x1,x2xd]axT=[ax1,ax2,,axd]x^T=[x_1,x_2…x_d ]→ ax^T=[ax_1,ax_2, …, ax_d ]
    • 대신, 스칼라가 0보다 작을시 반대 방향으로 변함.
  • 같은 모양을 가진 벡터는 덧셈, 뺄셈이 가능함

성분곱 (Hadamard Product, Element-wise product)
: 벡터 내에서 같은 위치에 있는 성분끼리의 곱셈

if xT=[x1,x2xd], yT=[y1,y2,yd]then, xy=[x1y1,x2y2,xdyd]\begin{aligned} if&\ x^T=[x_1,x_2…x_d ],\ y^T=[y_1,y_2,…y_d]\\ then,&\ x◉y=[x_1 y_1,x_2 y_2,…x_d y_d] \end{aligned}
  • numpy 내에서 * 기호를 사용하면 성분곱이 이루어짐.

I. 벡터의 노름

노름(Norm)
: 원점에서부터 거리 (x∥x∥와 같이 나타낸다.)

  • L1 Norm (맨해튼 거리) : 벡터의 성분의 절대값들의 합
  • L2 Norm (유클리드 거리): 벡터의 성분의 제곱들의 합의 제곱근
    • ? 노름의 종류에 따라 기하학적 성질이 달라지기 때문에 서로 다른 노름이 존재한다.
    • ex. L1 : Robust 학습, Lasso 회귀
      L2 : Laplace 근사, Ridge 회귀

두 벡터 사이의 거리
: 두 벡터 사이의 거리를 계산할 때에는 벡터의 뺄셈을 이용한다.

  • 벡터의 뺄셈은 교환법칙이 성립한다. (xy=yx∥x-y∥ = ∥y-x∥

두 벡터 사이의 각도
: 두 벡터 사이의 거리를 L2 Norm을 통해 계산한 후, 제 2코사인 법칙을 이용한다.

cosθ=x22+y22xy222x2y2cosθ=<x,y>x2y2\begin{aligned} cos⁡θ&=\frac{∥x∥_2^2+∥y∥_2^2-∥x-y∥_2^2}{2∥x∥_2 ∥y∥_2}\\ cos⁡θ&=\frac{<x,y>}{∥x∥_2 ∥y∥_2 } \end{aligned}
  • 내적(inner product) : <x,y>로 나타내며, 벡터들의 성분곱을 취한 다음 전부 더해준다.
    • numpy에선 np.inner(x,y)를 통해 내적을 구할 수 있다.

II. 벡터의 내적

내적은 정사영(orthogonal projection)된 벡터의 길이와 관련이 있다.

  • 내적은 두 벡터의 유사도를 측정하는 데에 사용한다.

정사영(orthogonal projection)
: proj(x)는 벡터 y로 정사영된 벡터 x의 그림자를 의미 (벡터 x의 꼭짓점에서 벡터 y로 수선의 발을 내린 지점)

  • proj(x)의 길이 = xcosθ∥x∥ cos θ
  • 내적은 정사영된 길이를 벡터 y의 길이 y∥y∥만큼 조정한 값
    x2y2 cosθ=<x,y>∥x∥_2∥y∥_2\ cos⁡θ= <x,y>

2. 행렬

행렬(Matrix)
: 벡터를 원소로 가지는 2차원 배열 (numpy에선 행(row)가 기본 단위)

  • n x m 행렬 : 각 행은 m개의 원소를 가지며, 행렬은 n개의 행으로 이루어져있다.
  • 행(가로)을 먼저 쓰고, 열(세로)을 먼저 쓴다.
    • (xijx_{ij}
  • 전치행렬(Transposed matrix) : 행과 열의 index가 바뀐 행렬 (XT=xjiX^T= x_{ji}
  • 공간에 위치한 여러 점들을 의미

I. 행렬의 연산

행렬끼리 같은 모양을 가질시, 덧셈, 뺄셈, 성분곱을 계산할 수 있음 (벡터와 같음)

행렬 곱셈(Matrix Multiplication)
: i번째 행벡터(가로)와 j번째 열벡터(세로) 사이의 내적을 성분으로 가짐

  • 교환법칙이 성립하지 않는다.
  • numpy에서는 “@” 기호를 통해 연산을 수행한다.

행렬의 내적 (numpy 기준)
: np.inner는 i번째 행 벡터와 j번째 행 벡터 사이의 내적을 성분으로 가지는 행렬을 계산. (수학적 내적X)

  • 행벡터 사이의 계산을 하기 때문에, 두 행벡터의 크기가 같아야지 계산할 수 있음.

II. 역행렬

역행렬(Inverse matrix)
: A의 연산을 거꾸로 되돌리는 행렬 (행과 열 숫자가 같고, 행렬식(determinant)가 0이 아니어야 함)

  • numpy에서는 np.linalg.inv(X)를 통해 역행렬을 구할 수 있다.

유사역행렬(pseudo-inverse)/무어펜로즈(Moore-Penrose) 역행렬
: 역행렬을 계산할 수 없을 때 사용 (A+A^+로 표현)

  • nmn \ge m
  • nmn \le m
  • numpy에서는 np.linalg.pinv(X)를 통해 유사역행렬을 구할 수 있다.

3. 경사하강법

import sympy as sym		# symbolic python : 다항식 처리할 때 사용
from sympy.abc import x		# abc : 기호를 가져올 때 사용

sym.diff (sym.poly(x**3 +3*x + 3), x)) # x에 관한 다항식에 대한 미분 값을 구함.
>> Poly(3*x**2 + 3, x, domain = “ZZ”)
  • x라는 점에서 함수값을 증가시키고 싶으면 미분값을 더하고, 감소시키고 싶으면 빼면 된다.
    • 미분값이 음수일 때, 미분값을 더해주면 뺄셈이 되기 때문에 왼쪽으로 간다 (함수 값이 증가)
    • 미분값이 양수일 때, 미분값을 더해주면 덧셈이 되기 때문에 오른쪽으로 간다 (함수 값이 증가)

경사상승법(Gradient ascent) / 경사하강법(Gradient descent)
: 미분값을 더해(빼)주는 것으로 주어진 함수의 극댓값(극소값)을 구해 목적함수를 최대화(최소화)시키고 싶을 때 사용

  • 극값에 도달하면 미분값이 0이 되기 때문에 최적화가 종료된다.

I. 변수가 벡터일 때의 경사하강법

그레디언트 벡터(gradient vector)
: 각 변수 별로 편미분을 계산한 값. (역삼각형 기호는 Nabla라고 읽는다.)

f=(x1f,x2f,,xdf)∇f=(∂_{x1} f,∂_{x2} f,…,∂_{xd} f)
  • 그레디언트 벡터를 사용하면 벡터 x를 동시에 업데이트 할 수 있음.
  • 종료조건을 설정할 때, 그래디언트의 절대값 대신에 Norm을 사용한다.

II. 경사하강법으로 선형회귀분석

선형회귀식 (이를 최소화해야 함)

(yXβ)2∥(∥y-Xβ∥)∥_2

선형회귀식의 그래디언트 벡터

βyXβ2=(β1yXβ2,,βd(yXβ)2)βkyXβ2=βk(Σ(yiΣXijβj)2n)1/2βyXβ2=XT(yXβ)nyXβ2\begin{aligned} ∇_β ∥y-Xβ∥_2&=(∂_{β1}∥y-Xβ∥_2,…,∂_βd ∥(∥y-Xβ∥)∥_2)\\ ∂_{βk}∥y-Xβ∥_2&=∂_{βk}(\frac{Σ(y_i-ΣX_{ij} β_j )^2}{n})^{1/2}\\ ∴∇_β∥y-Xβ∥_2&=-\frac{X^T (y-Xβ)}{n∥y-Xβ∥_2 } \end{aligned}
  • n개의 데이터를 가지고 있기 때문에, 평균값을 취하기 위해 n으로 나눈 후에 제곱근을 구한다.

경사하강법 알고리즘

βt+1=βtλβyXβtβ^{t+1}= β^{t}-λ∇_β∥y-Xβ^{t}∥
  • 경사하강법은 (1) 미분가능하고 (2) 볼록한 함수에 대해선 수렴이 보장됨.
    • 그러나 비선형회귀 문제에는 (2) 볼록하지 않기 때문에 수렴이 보장되지 않는다.

III. 확률적 경사하강법 (Stochastic gradient descent)

확률적 경사하강법:
데이터를 전부가 아닌 일부만 활용하여 업데이트하는 방법

  • 볼록하지 않은 함수에 대해서도 최적화가 가능하다.
    • 확률적으로 bb개의 데이터를 사용하기 떄문에, 매 번 목적식의 모양이 변화하기 때문.
  • nn개의 데이터가 아닌 일부(bb)개만 사용하기 때문에, 연산량이 b/nb/n으로 감소한다.
  • 데이터를 일부만 사용하기 때문에 메모리부족 문제를 해결할 수 있다.

4. 딥러닝 학습방법

Softmax(o)
: 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산

softmax(o)=(exp(o1)Σexp(o),,exp(op)Σexp(o))softmax(o)=(\frac{exp⁡(o_1 )}{Σ exp⁡(o)},…, \frac{exp⁡(o_p )}{Σ exp⁡(o)})
  • overflow를 예방하기 위해, 각 값에 max값을 빼도 연산은 동일하게 일어난다.
  • 학습에는 softmax를 사용하지만, 추론 시에는 사용하지 않는다.

활성 함수 (activation function)
: 선형 모델의 출력물을 비선형으로 만들기 위한 함수 (input: 실수, output: 실수)

  • 활성함수를 사용하지 않으면 선형 모형과 다를 것이 없다.
  1. sigmoid(x)=1(1+ex)1 \over (1+e^{-x} )
  2. tanh⁡(x)= (exex)(ex+ex)(e^x-e^{-x}) \over (e^x+e^{-x} )
  3. ReLU(x)=max⁡[0,x]
  • 신경망은 선형모델과 활성함수를 합성한 함수이다.

Universal approximation theorem
: 2-layer 신경망으로 임의의 연속함수를 근사할 수 있음.

  • 그러나 층이 깊을수록, 필요한 뉴런의 숫자가 감소하기 때문에 보다 효율적이다. (층을 여러 개 쌓는 이유)
    • 층이 깊을수록 학습이 어려움.

역전파 (back propagation)
: 손실함수를 각각의 weight로 미분하여 값들을 업데이트하는 것

2층 신경망을 가정 (o=W(2)h+b(2),h=σ(z),z=W(1)h+b(1))(o=W^{(2)} h+b^{(2)},h=σ(z),z=W^{(1)} h+b^{(1)})

  • W(1)Loss=oLosshozhW(1)z∇_{W^{(1)}}Loss=∇_o Loss* ∇_h o*∇_z h* ∇_{W^{(1)}}z

5. 확률론

기계학습에선 손실함수의 작동원리를 이해하기 위해 확률론을 사용한다.

이산형 확률변수 (Discrete)
: 확률변수가 가질 수 있는 경우의 수를 고려하여, 확률을 더해서 모델링

P(XA)=ΣP(X=x),where xAP(X∈A)=ΣP(X=x),where\ x∈A

연속형 확률변수 (continuous)
: 데이터 공간에 정의된 확률의 밀도 위에서의 적분을 통해 모델링

P(XA)=AP(x)dx, whereP(x)=limh0P(xhXx+h)2hP(X∈A)= ∫_AP(x)dx ,\ where P(x)=lim_{h→0}⁡\frac{P(x-h≤X≤x+h)} {2h}

결합분포 (Joint distribution)
: 확률 변수가 복수 개일 때, 이들을 함 께 고려하는 확률분포 (eg. P(x,y)P(x,y))

  • 원래 확률분포 D를 모델링할 수 있음.

주변확률분포 (marginal distribution)
: 결합분포에서 특정 확률변수의 영향을 배제했을 때의 확률분포(?)

P(x)=ΣyP(x,y), oryP(x,y)dyP(x)=Σ_y P(x,y), \ or ∫_yP(x,y)dy

조건부확률분포
: 조건이 주어졌을 때의 확률분포

  • P(x|y) : y의 값이 주어졌을 때 x의 확률분포 (입력 x와 출력 y 사이의 관계를 모델링)
  • P(y|x) : x의 값이 주어졌을 때, 정답이 y일 확률(or 밀도 if 연속확률분포)
  • 회귀 문제에서는 조건부기대값(E(y|x))을 사용.

기대값
: 데이터를 대표하는 통계량

ExP(x)[f(x)]=xf(x)P(x)dx, orΣf(x)P(x)E_{x\sim P(x)} [f(x)]=∫_xf(x)P(x)dx, \ or Σf(x)P(x)
  • 기대값을 통해 분산(Variance), 첨도(Skewness), 공분산(Covariance) 등 다양한 통계량을 계산할 수 있음.

몬테카를로 샘플링 (Monte Carlo Sampling)
: 데이터의 확률분포를 명시적으로 알 수 없을 때 데이터를 샘플링하는 방법 (이산형, 연속형 상관 X)

ExP(x)[f(x)]1NΣi=1Nf(x(i),x(i) is i.i.d to P(x)E_{x \sim P(x)} [f(x)]≈{1\over N} Σ_{i=1}^N f(x^{(i)}, x^{(i)}\ is\ i.i.d\ to\ P(x)
  • 독립추출이 보장된다면, 대수의 법칙에 의해 수렴성을 보장한다.

6. 통계학

통계적 모델링
: 적절한 가정 위에서 확률분포를 추정하는 것.

  • 그러나 유한한 데이터로는 모집단의 분포를 알 수 없기 때문에, 근사적으로 확률분포를 추정할 수밖에 없음.

  • 모수적 방법론: 데이터가 특정분포를 따른다고 가정(데이터의 모양을 관찰)한 후, 분포를 결정하는 모수(parameter)를 추정하는 방법 (\leftrightarrow비모수적 방법론)

    I. 모수 추정

데이터의 확률분포를 가정했다면, 모수를 추정할 수 있음. (모수적 방법론)

  • 정규분포의 모수 : 평균, 분산(불편추정량을 구하기 위해 n이 아닌 n-1로 나눔)
    • E(표본평균) = 평균, E(표본분산) = 분산

표집분포(Sampling distribution)
: 통계량(표본평균과 표본분산)의 확률분포

  • 표본평균의 표집분포는 N이 커질수록, 정규분표를 따르게 된다. (중심극한정리)

최대가능도 추정법(MLE ; Maximul likelihood extimation)
: 이론적으로 가장 가능성이 높은 모수를 추정하는 방법 중 하나

θMLE=argmaxθ L(θ;x)=argmaxθP(xθ)where θ means parameterθ_{MLE}=argmax_θ\ L(θ;x)\\=argmax_θ P(x│θ)\\where\ θ\ means\ parameter
  • 모수 theta를 따르는 분포가 x를 관찰할 가능성 (다 더했을 때 1이 되지 않기 때문에 확률 X; 대소비교용)
  • 불편추정량을 보장하지 않음
  • 데이터 집합 X가 독립적으로 추출되었을 때의 로그가능도를 최적화
    L(θ;X)=i=1nP(xiθ)log L(θ;x)=ΣlogP(xiθ)L(θ;X)=∏_{i=1}^nP(x_i│θ) \rightarrow log\ L(θ;x)=ΣlogP(x_i θ)
  • 로그를 씌우는 이유?
    • 데이터가 많은 경우, 컴퓨터의 정확도로 가능도를 계산하는 것이 불가능
    • 로그를 씌우면 곱셈을 덧셈으로 바꿀 수 있기 때문에 연산이 가능해짐
    • 미분 연산을 사용할 때 연산량을 줄어줌.

II. 확률분포의 거리

손실함수는 주로 모델이 학습하는 확률분포와 데이터에서 관찰되는 확률분포의 거리를 통해 유도된다.

쿨백-라이블러 발산(KL Divergence)

KL(PQ)=ΣP(x)log(P(x)Q(x)) orχP(x)log(P(x)Q(x))dxKL(P∥Q)=ΣP(x) log⁡(\frac{P(x)}{Q(x)} )\ or ∫_χP(x) log⁡(\frac{P(x)}{Q(x)})dx
=ExP(x)[logQ(x)]+ExP(x)[logP(x)]=-E_{x\sim P(x)} [logQ(x)]+ E_{x\sim P(x)} [logP(x)]
  • 첫번째 항을 크로스 엔트로피(cross entropy), 두 번째 항을 엔트로피(Entropy)라고 부른다.
  • 정답 레이블을 P, 모델 예측을 Q라 두었을 때, MSE는 KL을 최소화하는 것과 같다.

7. 베이즈 통계학

베이즈 정리는 데이터가 추가할 때 업데이트하는 방법에 대한 기반을 제공한다.

베이즈 정리

P(AB)=P(B)P(AB)P(A∩B)=P(B)P(A│B)
P(BA)=P(AB)P(A)=P(B)P(AB)P(A)→P(B│A)=\frac{P(A∩B)}{P(A)}=\frac{P(B)P(A│B)}{P(A)}

A를 관찰하는 데이터, B를 모수(or 가정)이라고 가정해보자.

  • P(B|A) : 사후확률(Posterior); 데이터가 주어져있을 때, 가정이 성립할 확률
  • P(B) : 사전확률(prior); 데이터가 주어져있지 않을 때, 가정이 성립할 확률
  • P(A|B) : 가능도(likelihood); 현재 주어진 모수에서 데이터가 관찰될 확률.
  • P(A) : Evidence; 데이터 자체의 분포
  • 사후확률을 사전확률로 사용하는 것으로 갱신된 사후확률을 계산할 수 있음
  • 조건부 확률”만”으로 인과관계(Casuality)를 추론할 수는 없다.

I. 평가 지표

Confusion Matrix

  • True Positive : 관측값과 실제값이 둘 다 참인 경우
  • False Positive(1종 오류) : 실제값은 거짓인데 관측값이 참인 경우
  • True Negative : 관측값과 실제값이 둘 다 거짓인 경우
  • False Negative(2종 오류): 관측값은 참인데 실제 값은 거짓인 경우
    정밀도(Precision): TP / (TP + FP)

II. 인과관계

인과관계를 알면, 데이터 분포에 변화가 생길 때에도 안정적으로 예측할 수 있다.

  • 인과관계를 알기 위해선 중첩요인(confounding factor; 복수 개의 변수에 영향을 미치는 변수)을 제거해야 한다.

8. CNN

I. Convolution 연산

고정된 크기의 Kernel에 입력벡터 상에서 움직이며 하는 연산

  • Kernel의 크기에 따라 연산량을 줄일 수 있음.
    [fg](i,j)=Σ(p,q)f(p,q)g(i+p,j+q)[f*g](i,j)=Σ_(p,q) f(p,q)g(i+p,j+q)
  • 입력 크기를 I, 커널 크기를 K라고 가정했을 때, 출력 크기는 (I-K+1)이 된다.
  • 채널이 복수 개인 경우, 2D Conv를 채널 개수만큼 적용한 후 합한다.
  • 출력의 채널을 늘리고 싶은 경우, 커널의 개수를 늘린다.

II. Convolution 연산의 역전파

x[fg](x)=xRdf(y)g(xy)dy=Rdf(y)xg(xy)dy=[fg](x)∂_x [f*g](x)=∂_x ∫_{R^d}f(y)g(x-y)dy\\ =∫_{R^d}f(y) ∂_x g(x-y)dy\\ =[f*g'](x)

Convolution 연산은 미분을 해도 Convolution 연산이 나온다.

9. RNN

시퀀스 데이터(Sequence data)
: 순차적으로 들어오는 데이터 (eg. 소리, 문자열, 주가 등)

  • 독립동등분포(i.i.d) 가정을 자주 위배하기 때문에, 정보의 순서가 중요하다.
  • 과거의 데이터를 바탕으로 특정 시점의 데이터의 확률분포를 다루기 때문에 조건부 확률을 이용할 수 있음
P(X1,,Xt)=P(XtX1,,Xt1)P(X1,,Xt1)=s=1tP(XsX1,,Xs1)\begin{aligned} P(X_1,…,X_t )&=P(X_t│X_1,…,X_{t-1})P(X_1,…,X_{t-1})\\ &=∏_{s=1}^tP(X_s | X_1,…,X_{s-1}) \end{aligned}
  • 그러나 표기와는 다르게, 모든 과거의 정보들이 필요한 것은 아님.

자기회귀모델 (AutoRegressive Model)
: 고정된 길이만큼의 시퀀스만 활용하는 모델

  • 잠재자기회귀모델
    : 바로 직전의 정보를 제외한 나머지 정보들을 HtH_t

I. 기본적인 RNN 구조

Ot=HtW(2)+b(2)Ht=σ(XtWX(1)+H(t1)WH(1)+b(1))O_t=H_t W^{(2)}+b^{(2)}\\ H_t=σ(X_t W_X^{(1)}+H_{(t-1)} W_H^{(1)}+b^{(1)})

MLP 모형에 H(t1)WH(1)H_{(t-1)} W_H^{(1)}

  • H(t1)H_{(t-1)}
  • WH(1)W_H^{(1)}
  • 시퀀스의 길이가 길어질수록, 역전파 시 기울기가 0으로 수렴하거나 무한으로 발산할 수가 있다.

Truncated BPTT (Back-Propagation thorugh Time)
: 기울기소실 문제를 해결하기 위해 시퀀스의 길이를 제한하는 것.

  • eg. 특정 시점이후 잠재변수의 그래디언트는 받지 않고, 출력의 그래디언트만 받아서 업데이트
  • cf. 기울기 소실 문제를 해결하기 위해 LSTM, GRU 등의 모델이 개발됨.

2. 과제 수행과정 / 결과물 정리

과제는 총 다섯 개가 주어졌으며, 네 번째 과제까지는 무난하게 풀 수 있었으나 다섯 번째 과제에서 정규식을 다루는 능력을 요구하였다.

  1. compile() and match()
import re

text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"

com = re.compile("[a-zA-Z]")

r1 = com.match(text)
r2 = com.match(text2)

print(r1) 
print(r2)

'''
>> result:
<re.Match object; span=(0, 1), match='a'>
None
'''

re.compile()은 정규식을 작성하는 코드이다. 본 코드에서는 정규식 "[a-zA-Z]"를 넘겨주는 것으로 알파벳을 찾고자 한다.
re.match()는 문자열을 처음부터 탐색하여 문자열이 정규식과 일치하는지 알려주는 함수이다.

  • r1의 경우, text의 첫 번째 글자인 "a"가 알파벳이기 때문에 "a"의 위치를 반환한다.
  • r2의 경우,text2의 첫 번째 글자가 숫자기 때문에 탐색을 종료하고 아무 것도 반환하지 않는다.

그러나 text2에도 알파벳이 있기 때문에 r2의 결과값이 None이라는 사실은 받아들이기 어렵다. 그렇다면 어떻게 해야할까?

  1. search()
import re

text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"

com = re.compile("[a-zA-Z]")

r1 = com.search(text)
r2 = com.search(text2)

print(r1)
print(r2)

'''
>> result:
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(4, 5), match='a'>
'''

re.search()는 문자열을 처음부터 탐색하는 것이 아니라 문자열 전체를 탐색한다. 따라서 문자열 전체에 정규식에 해당하는 글자가 있다면 이의 위치를 반환해준다.

  1. sub()
import re

text = "abcd1234^.,!"
text2 = "1234abcd1234^.,!"

com1 = re.sub("[a-zA-Z]","",text)
com2 = re.sub("[a-zA-Z]","-",text2)

print(com1)
print(com2)

'''
>> result:
1234^.,!
1234----1234^.,!
'''

sub()sub(정규식, 치환할 문자, 문자열)의 형태로 구성된다.

  • com1은 text에서 알파벳을 빈칸으로 치환하여 반환한다.
  • com2은 text에서 알파벳을 하이픈(-)으로 치환하여 반환한다.

그리고 나는 문득 텍스트에서 ^.를 지우고 싶었고 다음과 같은 코드를 실행하였다.

import re

text = "abcd1234^.,!"

com1 = re.sub("[^.]","",text)

print(com1)

'''
>> result:
.
'''

코드 실행 결과, .을 제외한 모든 문자가 제거되었다. 이는 ^가 부정의 의미를 나타내기 때문이다.
, re.sub("[^.]","",text).^를 지우는 것이 아니라, .이 아닌 모든 문자를 지우라는 의미가 된다.

고로 코드는 다음과 같이 수정되어야 한다.

import re

text = "abcd1234^.,!"

com1 = re.sub("[\^.]","",text) # '\'추가

print(com1)

'''
>> result:
abcd1234,!
'''

\는 특수한 역할을 하는 문자의 역할을 지운다. 이를 이스케이프 문자(escape character)라고 한다.

  • 괄호 내에서 특수한 역할을 하는 문자는 \, ^, -, ] 네 개로, 정규식에 위 문자들을 사용하기 위해선 \를 꼭 사용해주어야 한다.

3. 피어 세션 정리

피어세션 때는 강의를 요약하는 시간을 가졌다.

그러나 (1) 강의를 요약하는 시간이 너무 오래걸린다는 것과 (2) 곧 있을 competition을 준비한다는 명목으로, (1) 알고리즘 문제 풀이와 (2) Kaggle 코드 공유 시간을 가지는 것으로 합의되었다.

따라서 2주차부터는 알고리즘 문제를 풀거나 Kaggle 문제를 풀 때 배운 점을 중심으로 피어세션 파트를 전개하고자 한다.

4. 학습 회고

시간이 굉장히 많이 모자랐다. 시간 분배를 좀 더 철저히 해야겠다는 생각을 했다.

  • 금요일에는 주간학습을 정리해야 하기 때문에 목요일까지 모든 학습을 완료한다.
  • 과제와 문제는 그 날에 바로 풀 수 있도록 한다.

좋은 웹페이지 즐겨찾기