Machine Learning
-
Classification Metrics(분류 모델 지표 ) 알아보기 : TPR, FPR과 ROC Curve 사이 관계 및 AUC
TPR, FPR → Positive 판단에 따른 성공, 실패 여부 True Positive Ratio(=Recall) : $\frac{TP}{TP+FN}$ 실제 Positive(양성)을 얼마나 정확히 분류 했는지 False Positive Ratio(=Fallout) : $\frac{FP}{TN + FP}$시 실제 Negative(음성) 중 잘못 분류한 비율 TPR, FPR 모두 Positive(양성) 판단에 따른 성공, 실패 여부를 다룸 이때 성공-실패 여부는 Positive(양성) 판단의 기준이 될 Threshold를 어떻게 설정 하느냐에 따라 다른 결과가 나오게 됨 ROC와 AUC? ROC : Positive 예측 시 Threshold 별 양상을 확인하기 위해, FPR을 x 축으로, TPR을 y 축..
-
Regression Metrics(회귀 평가 지표) 알아보기 : MSLE, RMSLE, R^2, MAPE, sMAPE, MPE
어떤 특성을 가진 Regression Metrics(회귀 평가 지표)? 기존에 다뤘던 MAE, MSE, RMSE는 Scale-Dependent한 특성이 있었다. 하지만 이 포스팅에서 다룰 지표들은 비율, % 기반으로 접근하기 때문에 상대적으로 Scale에서 자유롭다는 특징이 있다. MSLE(Mean Sqaured Log Error) $$ MSLE = \frac{1}{n}\sum_{i=1}^{n}(\log{y_i}-\log{\hat{y_i})}^2 $$ 모델의 예측 $\hat{y}$와 Label $y$에 각각 Log를 적용해 MSE를 한 것이다. Log 함수의 특성을 가지고 있는 지표이다. $\log{y}-\log{\hat{y}} = \frac{\log{y}}{\log{\hat{y}}}$ 이기 때문에 상대..
-
Regression Metrics(회귀 모델 평가 지표) 알아보기 : MAE, MSE, RMSE
MAE, MSE, RMSE = Scale-Dependent Metrics MAE, MSE, RMSE는 데이터 Scale에 의존하는 Metrics(평가 지표)이다. 그래서 동일 데이터를 다루더라도 Scaling 전-후에 따라 다른 수치를 얻게 된다는 특징이 있다. 따라서 이러한 평가 지표를 통해 모델 간 성능을 비교할 때는 Scale을 주의해야 한다. MAE(Mean Absolute Error) $$ MAE=\frac{1}{n}\displaystyle\sum_{i=1}^{n} |y_i-\hat{y}_i| $$ 모델의 Residual(잔차)에 절댓값을 취한 뒤 평균 처리한다. MAE를 기준으로 최적화 시 Median(중앙값)에 수렴한다는 특징이 있다. 장점 잔차의 Scale을 그대로 다루기 때문에 결과를 직..
-
[짧] MAE(Mean Absolute Error)와 Median(중앙값) 사이 관계 알아보기
둘 사이의 관계? MAE는 Median(중앙값)일 때가 최소이다. 아래 글은 MAE가 왜 중앙값일 때 최소가 되는지 대략적으로 설명한 글이다. 개인적으로 이해하기 쉽게(?) 그림으로 표현했다. The median minimizes the sum of absolute deviations (the $ {\ell}_{1} $ norm) Suppose we have a set $S$ of real numbers. Show that $$\sum_{s\in S}|s-x| $$ is minimal if $x$ is equal to the median. This is a sample exam question of one of the exams that I need to take a... math.stackexchang..
-
R^2(결정 계수, Coefficient of Determination) 알아보기
$R^2$(결정 계수)란? $R^2$(결정 계수)는 회귀 모델의 성능 평가 지표로, Dependent Variable(종속 변수) $y$의 총 변동(분산)을 회귀 모델 $wx$로 표현할 수 있는 정도를 나타낸다. 이를 수식으로 나타내면 다음과 같다. $$ R^2 = \frac{\sum(\hat{y_i}-\bar{y})^2}{\sum(y_i-\bar{y})^2} $$ 식에선 분모, 분자 모두 $\bar{y}$를 기준으로 분산을 측정한다. 이때 $\bar{y}$는 $y$의 평균이면서, 동시에 회귀 모델 $wx$와 관련 없는 Naive한 예측이다. 따라서 결정 계수는 $y$의 분산을 현 모델로 얼마나 나타낼 수 있는지 알려주는 지표면서, 동시에 Naive한 예측($\bar{y}$) 대비 모델($\hat{y}$..
-
Linear Regression(선형 회귀) 모델 가정 알아보기
가정이 필요한 이유? Linear Regression(선형 회귀) 모델은 선형적 관계의 Independent Variable(독립 변수)와 Dependent Variable(종속 변수)가 수치적으로 얼마나 관련 있는지 확인하는 것이 목적이다. 가정이 만족돼야 목적에 맞게 모델을 사용할 수 있고, Residual(잔차)을 통해 계수, 모형 검정 등을 진행할 수 있다. 선형성 가정 Independent Variable(독립 변수) $x$와 Dependent Variable(종속 변수)의 조건부 기댓값 $E(y|x)$ 사이 선형 관계가 존재해야 한다. 둘 사이의 관계가 선형이라는 것은 $y = wx+\epsilon$에서 $w$가 일차식인 경우를 의미한다. 오차항의 정규성 가정 $y = wx+\epsilon$에..
-
Decision Tree(결정 트리) 구성과 Impurity(불순도) 알아보기
Decision Tree(결정 트리) 데이터를 통해 Branch를 구성하고 이를 통해 분류, 회귀까지 할 수 있는 모델이다. 이 중 분류 모델의 경우 Impurity가 최소가 되는 방향으로 Branch가 생성되며, 여러 Branch로 구성된 최종 형태가 거꾸로 세운 나무 같아 트리 모델이라고 부른다. Impuriy는 Entropy와 Gini index로 측정된다. Impurity 측정 지표 Impurity라는 이름처럼 Entropy, Gini index 모두 고유한 성분만 있을 때 최솟값을 가지고, 반반 섞여 있을 경우 최댓값을 가진다. 두 지표 중 Entropy는 $log$ 항이 있어, 상대적으로 계산에 더 오랜 시간이 걸린다. Entropy $$ E = -\sum_{k=1}^K p(y_k) \log_..
-
Non-Parametric Density Estimation(비모수 밀도 추정) 알아보기
Density Estimation(DE)? 관측 데이터는 확률 변수에 의해 샘플링된 것으로 볼 수 있다. 이러한 관측 데이터를 많이 모으면 어떤 확률 변수에서 추출됐는지 추정이 가능할 것이다. 데이터를 통해 기존 확률 변수의 Density(PDF)를 추정하는 것이 바로 DE이다. PDF를 알면 확률 변수에 정보를 알 수 있기에 가치 있음 Non-Parametric Estimation 확률 변수의 형태를 미리 가정할 경우를 Parametric, 아닐 경우 Non-Parametric Model 이라고 한다. Non-Parametric Estimation은 변수에 대한 가정 없이 관측된 데이터만 가지고 DE를 진행한다. 다양한 방법 중 간단하게 Histogram, KDE만 알아보자. Histogram 데이터의..
-
Independent(독립)와 Uncorrelated(상관 관계 없음) 알아보기
Independent(독립) 두 랜덤 변수의 Joint Probability(결합 확률)가 각 변수의 Marginal Probability(주변 확률)로 표현되는 경우를 의미한다. $$ P(X,Y)=P(X)P(Y) $$ Uncorrealted(상관 관계 없음) 두 랜덤 변수 사이 Correlation 관계가 없음을 의미하며, Correlation ($\rho_{X, Y}$) 가 0 인 경우이다. Correlation ($\rho_{X, Y}$) 은 두 변수 사이 선형적 관계를 보여주는 지표로, Covariance(공분산)을 각 변수의 표준 편차로 정규화한 값이다. $$ \begin{align*}\rho_{XY} &= \mathbf{E}\left[\frac{X-\mathbf{E}[X]}{\sqrt{\mat..
-
Sampling(표본 추출) 방식 별 특징과 추출법 결정 시 고려 사항
Probability Sampling(확률 표본 추출) Simple Random Sampling(무작위 추출법) 모집단 전체에 일련 번호(실제 혹은 개념적)를 부여하고, 랜덤하게 추출하는 방식 장점 추출 확률이 동일하기 때문에, 표본의 대표성이 크고, 오차 개입 여부가 적음 모집단에 대한 사전 지식 불필요 단점 대규모 표본일 때 효과적임 모집단에 대한 사전 지식을 활용할 수 없고, 표본 프레임(모집단 목록)을 파악하기 어려움 Stratified Sampling(층화 추출법) 모집단을 서로 겹치지 않는 여러 개의 ‘층’으로 쪼갠 뒤, 각 ‘층’에서 무작위로 추출하는 방식 ‘층’ 마다의 개수를 고려해 추출한다면, 비례 층화 추출 장점 집단을 ‘층’으로 관리해 빼놓지 않고 표본에 포함 시킬 수 있음 대표성이 ..
-
[짧] Epoch, mini-Batch, Step 헷갈리지 않게 외우기
Epoch 전체 데이터를 모두 학습한 경우를 1 Epoch라고 한다. mini-Batch 전체 데이터를 일정한 크기로 나눠놓은 것으로, 여러 개(N)의 mini-Batch가 1 Epoch를 구성한다. 1 Epoch = mini-Batch $\times N$ Step $\theta$가 업데이트된 횟수로, 일반적으로 많이 활용되는 mini-Batch SGD에선 N과 동일하다.
-
경사 하강법이 Gradient의 반대 방향으로 진행되는 이유
Intro Gradient descent(경사 하강법)은 최적화 기법 중 하나로, 손실 함수를 최소화하기 위해서 사용된다. 경사 하강법에선 효과적으로 $\theta$ 를 변화시키기 위해, 가장 가파른 경사 방향으로 $\theta$ 를 업데이트한다. 이때, 가장 가파른 경사일 때의 방향이 Gradient 방향 일 때 이므로, $\theta$ 는 Gradient의 반대 방향으로 업데이트된다. 누군가 나에게 경사 하강법을 간단하게 설명하라고 하면, 아마도 위에 적은 것처럼 말할 거 같다. 근데 저 설명을 듣는 입장에선, 아마도 왜 가장 가파른 경사일 때의 방향이 Gradient 방향이고, 왜 Gradient의 반대 방향으로 $\theta$ 가 업데이트 돼야 하는 지에 대해서 의문이 생길 거 같다. 그래서 위와..
-
Hypothesis Test(가설 검정)의 오류와 Critical value(임계값) 사이 관계 확인하기 Feat. 검정력, 유의 수준
검정의 오류? 가설 검정 과정에서 가설은 2 가지이고, 이는 Null Hypothesis(귀무 가설 : $H_0$)과 Alternative Hypothesis(대립 가설 : $H_A$)이다. $H_A$의 이름이 대립(대안)인 것은 $H_0$와의 관계 때문이다. 가설 검정의 중심은 $H_0$이다. 검정 결과에 따라 $H_0$를 기각하거나, 기각하지 못하냐 딱 2 가지이다. 이에 따라 $H_A$가 채택될 수도, 아닐 수도 있다. $H_0$을 중심으로 생각해보면, 가설 검정 시 발생할 수 있는 오류는 2 가지 이다. 제 1종 오류 : $H_0$가 참인데도, $H_0$을 기각한 경우 제 2종 오류 : $H_0$가 거짓인데도, $H_0$을 기각하지 않은 경우 = $H_A$가 참인데도, $H_A$을 채택하지 않은 ..
-
Hypothesis Test(가설 검정)과 Null hypothesis(귀무 가설), p - value 사이 관계 알아보기
Hypothesis Test(가설 검정)? Population(모집단)에 대한 어떤 특성(가설)을 주장하고 싶어도, 그 모집단을 직접 확인할 수 없는 상황이 대부분이다. 따라서 이럴 땐 Sample(표본)을 참고할 수밖에 없다. 하지만 표본은 모집단으로부터 랜덤하게 얻은 것이기에, 그 주장이 타당한 지 항상 고민해야 한다. 표본으로 모집단의 특성을 주장(가설)할 땐, 그 가설이 얼마나 타당한 지 확인하기 위한 작업이 필요하고 이를 가설 검정이라고 한다. 이때 가설 검정의 타당성은 p - value를 사용해 확률의 개념으로 표현한다. 검정의 타당성을 확률로 접근하는 이유는, 표본이란 모집단 입장에선 랜덤하게 추출된 것 중 하나에 불과하기 때문이다. 표본으로 인해 모집단에 대한 잘못된 판단을 내리지 않으려면..
-
Convolution을 Neural Networks에서 활용 하기
Summary CNN이 이미지 데이터에 많이 활용되는 이유는, 이미지 데이터의 stationarity, locality 가정에 적합한 연산인 Convolution을 활용하기 때문이다. Convolution은 기존 MLP와는 다른 방식으로 연산을 하기 때문에, Neural Networks 관점으론 Sparse interaction이고, 동시에 Parameter sharing이 있다고 말한다. 새로운 단어가 갑자기 나와서 '기존의 Convolution과 다른가?' 라고 생각이 들 수 있지만, 해당 용어들은 단순히 Neural Networks가 기준이 되면서 새롭게 붙여진 단어일 뿐이다. 커널 단위로 연산하기 때문에 Sparse 하다는 것이고, 커널의 가중치를 공유하기 때문에 Sharing이 있다고 말하는 것..
-
Convolution과 Stationarity, Locality 가정
Summary CNN(Convolutional Neural Networks)이 이미지 처리에 많이 활용되는 이유는, 이미지 데이터에 적합하도록 설계 됐기 때문이다. 실제로 CNN은 이미지 데이터의 stationarity of statistics, locality of pixel dependencies 가정을 고려하여 설계 됐다. Locality 가정은 커널 단위 연산을 통해, Stationarity 가정은 연산 과정에 Convolution(Cross-correlation)을 사용하여 만족한다. 결국 CNN의 이름에도 적혀 있는 Convolution 연산이 이미지와 너무 잘 맞아서, 성능도 잘 나오고 많이 활용되는 것이다. 이 포스팅에선 Convolution 연산이 무엇인지는 다루지 않고, 왜 Convol..
-
Statistical Estimator(통계적 추정량)의 특성 알아보기
Estimator(추정량)이란? 추정량은 추정과 관련된 값이다. 그래서 우선 추정에 대해서 간단하게 알아보자. 추정은 표본을 활용해 모집단의 특성을 나타내는 값인, 모수(Parameter)를 추측하는 과정을 의미한다. 추정엔 특정한 값을 추측하는 점 추정과, 점 추정의 변동을 고려해 모수를 포함할 가능성이 높은 구간을 추측하는 구간 추정이 있다. 이러한 추정엔 결국 기준이 되는 값이 필요한데, 그것을 바로 추정량이라고 부른다. 추정은 다양한 추정량 중, 어떤 추정량을 활용할 것인지가 중요하고, 이에 따라 바람직한 추정량의 특성 또한 존재한다. 일반적으로 사용하면 좋은, 바람직한 추정량의 특성으로 Unbiasedness(불편성), Efficiency(효율성), Consistency(일치성), Suffici..
-
Gradient Checkpointing이란
GitHub - cybertronai/gradient-checkpointing: Make huge neural nets fit in memory Make huge neural nets fit in memory. Contribute to cybertronai/gradient-checkpointing development by creating an account on GitHub. github.com 모든 사진과, 글은 위의 링크를 참조했습니다. Graident checkpointing? GPU 사용 시 사용 가능한 메모리를 늘리기 위한 방법 중 하나이다. 이를 통해 연산 시간이 늘어나는 대신, 메모리 사용량 이 줄어든다. 아래 그래프는 ResNet 모델에서 최대 메모리 사용량을 비교했는데 blocks(N)..
-
Affine 변환과 딥러닝
변환 → 공간을 변형 직선과 평형성을 그대로 유지하는 변환을 Affine 변환이라고 한다. Affine 변환의 일반식은 `Wx + b` 이며, 이는 Linear Transformation에 Traslation 항이 추가된 형태이다. Affine 변환의 전 - 후 과정을 시각화하면 다음과 같다. 위 그림을 보면 변환에 의해 격자 전체가 함께 이동한다는 것을 확인할 수 있다. 이처럼 변환에 의해 모든 점이 영향을 받아 이동하는 것은, 공간(Space)이 변형되는 것처럼 생각할 수 있다. 이 경우 변환의 역할이 공간을 변형시키는 것이라고 해도 무방할 것이다. 멀쩡한 공간을 굳이 변형하는 이유는 당연하게도 어떤 이득이 있기 때문이다. 실제로 변환에 의해 새롭게 얻은 공간에선, 기존에 풀지 못했던 문제를 해결할 ..
-
Ensemble(앙상블) 기법 이해하기
Ensemble(앙상블)? 단일 모델 예측에 대한 Bias(편향), Variance(분산) 사이 관계를 표현하면 위 그림과 같다. 편향과 분산이 모두 낮은 이상적인 경우는 아쉽게도 불가능하다. 둘은 Trade-off 관계이기 때문이다. 하지만 단일 모델을 여러 개 모아 예측에 활용하면 편향과 분산 모두가 낮아지도록 예측을 개선할 수 있다. 이처럼 단일 모델을 여러 개 모아 예측을 개선하는 방법을 앙상블이라고 한다. 앙상블 구성 시 중요 고려 사항은 '개별 모델들이 충분한 수준의 Diversity를 만족하는 지'와 개별 모델의 결과를 '어떤 방식으로 합칠 것인지'이다. Diversity : Implicit vs Explicit 완전히 동일한 가중치를 가지는 모델을 여러개 묶는 경우, Diversity가 만..
-
AARRR, Retention, Cohort 분석 알아보기
AARRR 분석 고객 여정을 5개 단계로 나눠, 데이터 기반 의사 결정을 하는 분석 프레임워크이다. Acquisition, Activation, Retention, Revenue, Referral의 단계로 구성되고, 단계의 앞 글자만 따서 AARRR이라고 부른다. 각 단계의 특성은 다음과 같다. Acquisition(획득, 유입) 유저를 어떤 방식으로 유입시키고, 획득할 수 있는 지 고민한다. 획득을 위해선 광고가 필요하다. 다음과 같은 지표들이 고려된다. CAC(Customer Acquisition Cost) : 한 명의 고객을 확보하기 위해, 지출할 금액 DAU, MAU : 일간/월간 활성 유저 수 신규 방문자 수 Activation(활성화) 유입된 유저가 제품, 서비스의 주요 기능을 경험할 수 있도..
-
[짧] Odds(오즈)와 Logit(로짓) 알아보기
Odds(오즈) 실패 비율(확률) 대비 성공 비율(확률)을 의미한다. 수식으로 나타내면 다음과 같다. $odds = \frac{p}{1-p}$ 오즈를 활용하면 [0, 1] 사이의 확률 값을 [0, ∞]로 매핑할 수 있다. 확률이 0.5 일 때 오즈 값은 1이기 때문에, 1 값을 경계로 성공, 실패 여부 등을 표현할 수 있다. Logit(로짓) 오즈에 로그를 취한 것이다. 수식으로 나타내면 다음과 같다. $L = ln \frac {p}{1-p}$ 로짓을 활용하면 확률 값을 [-∞, ∞]로 매핑할 수 있다. 확률이 0.5일 때 로짓 값은 0이기 때문에, 0 값을 경계로 성공, 실패 여부 등을 표현할 수 있다.
-
Feature Engineering 방법과 효과
Combining(Cross columns) columns를 결합해서 새로운 column 생성 조합에 사용되는 column에 unique한 값이 너무 많다면 단순히 경우의 수 나열과 똑같아져 의미가 없어짐 따라서 unique한 값이 적은 column끼리 묶어서 새로운 columns를 만들도록 하자 → 새로운 특성을 발견 가능 wide&deep에서 활용 Categorifying 0 ~ n - 1까지의 category로 변경 latent vector를 얻는 딥러닝에서 많이 활용 기존 column에 hashing으로 str 값이 입력된 경우 category(int)로 변경하면 데이터를 줄일 수 있음 자주 등장하지 않는 category를 그대로 사용한다면 overfitting이 발생! 자주 등장하지 않는 cat..
-
Dot-product Attention과 Scaling 필요성
Intro Attention Is All You Need 논문에선 $Q$와 $K$ 벡터의 유사도를 0 ~ 1 사이의 확률 값으로 정규화하기 위해서 Dot-product Attention를 사용한다. 이때, Dot-product Attention을 그대로 사용하지 않고 $K$벡터의 차원 값인 $d_k$를 활용하여 scaling된 형태로 사용한다. $$Attention(Q, K, V) = softmax(\frac{QK^{T}}{\sqrt d_k})V$$ scaling의 근거는 논문에서 언급되며 다음과 같다. $d_k$가 커지면 $QK^{T}$ 값이 커진다. $QK^{T}$ 값이 커지면 softmax 함수의 gradient vanishing이 발생한다. scaling을 통해서 gradient vanishing..
-
Gradient Descent(경사 하강법)에서 Learning Rate(학습률)를 작게 설정하는 이유
이유? 딥러닝은 Loss function의 최적해를 탐색하기 위해서 Gradient Descent(경사 하강법)를 활용한다. 경사 하강법은 반복적으로 $\theta$를 $\theta+\Delta\theta$ 로 수정하며 최적해를 얻는 방법이고, Loss 함수의 1차 테일러 근사식이기도 하다. 근사식의 오차를 줄이기 위해선 Learning Rate(학습률)이 작아야 하고, 이것이 바로 학습률을 작은 값으로 설정하는 이유다. 수식으로 확인하기 $\theta+\Delta\theta$ 에서의 Loss는 다음과 같이 표현할 수 있다. $$L(\theta + \Delta\theta)$$ 테일러 전개의 기본 형태는 $f(x) = \sum_{n=0}^\infty \frac{f^{(n)}(a)}{n!} (x-a)^n$ ..
-
목적 함수(Objective function)와 최적화(Optimization)
목적 함수란? 머신러닝 모델의 평가지표는 손실(Loss)함수, 비용(Cost)함수, 목적(Objective) 함수 등 다양한 이름으로 불림 손실, 비용, 목적 함수의 명칭에 대해선 정확한 정의는 없지만 일반적으로 다음과 같이 생각하면 편함 A loss function is a part of a cost function which is a type of an objective function. 출처 결국 머신러닝 모델은 손실, 비용 함수는 줄이려고(minimise) 하며 목적 함수는 최적화(optimise)하려고 함 최적화하고 싶은 목적 함수는 최적의 모델을 확률 관점에서 볼 지 error 최소화 관점에서 볼 지에 따라서 다름 확률 관점에선 목적 함수를 최대화하고 싶어하고(Maximum Likelihood..
-
NLP Task 맛보기 - (3) NLG, Summarization
NLU와 QA에 대해서 다뤄보았으니 이번 포스팅에선 NLG(Natural Language Generation)의 전반적인 내용과 Extractive Summarization에 대해서 다뤄보겠습니다. NLG? NLG란 자연어 문장을 생성하는 기술입니다. 문장을 생성하기 위해서 주어진 정보(Text, Image, Video 등)을 이용합니다. 생성된 문장을 통해 주어진 정보를 축약하거나 보강할 수 있습니다. 또한 정보를 재구성하는 데도 도움을 줍니다. 이때 문장을 생성한다는 것은 결국 sequence $x$를 가장 잘 표현할 수 있는 token sequences를 얻는 것과 동일합니다. NLG Task는 크게 보면 문장 축약, 보강, 재구성으로 구성됩니다. 간단하게 살펴보면 다음과 같습니다. 문장 축약 1...
-
NLP Task 맛보기 - (2) NLU, QA
NLP는 NLU(Natural Language Understanding)와 NLG(Natural Language Generation)로 구분할 수 있습니다. 문자 그대로 NLU는 자연어 형태의 문장을 이해하는 기술이고 NLG는 자연어 문장을 생성하는 기술입니다. 결국 NLU와 NLG 모두 인간과 기계가 의사 소통할 수 있도록 도와주는 기술입니다. 이번 포스팅에선 NLU의 전반적인 내용과 QA에 대해서 다뤄보겠습니다. NLU? NLU는 자연어 형태의 문장을 이해하는 기술입니다. 이때 언어를 이해한다는 것은 2가지 측면으로 나눠서 생각할 수 있습니다. 바로 문법과 의미입니다. 따라서 기계가 만약 문법과 의미를 잘 알고 있다면 언어를 이해하고 있다고 할 수 있습니다. Syntatic : 언어를 이해한다면 주어..
-
NLP Task 맛보기 - (1)
이번 포스팅에선 매력적이라고 생각하는 NLP Task인 Dialogue Systems(대화 시스템)과 Language Modelling(언어 모델링)에 대해서 간단하게 다뤄보겠습니다. Dialogue Systems(대화 시스템) 대화 시스템은 문자 그대로 사람과 대화를 할 수 있는 시스템을 구성하는 것이 목표입니다. 따라서 대화 시스템 구성은 곧 '이루다' 만들기라고 할 수 있습니다. 대화 시스템의 경우 generation, retrieval-based 모델로 구분됩니다. 이 중에서 이루다가 사용했다고하는 retrieval-based 모델은 retrieval이란 단어에서 알 수 있듯이 기존에 미리 구축해둔 답변 DB에서 그럴듯한 대답을 여러개 골라서 그 중 최종적으로 답변을 선택합니다. 따라서 적절한 대..
-
Bias - Variance 이해하기
Intro 지도 학습 모델의 성능을 확인할 때는 과대 적합이나 과소 적합 여부를 정확하게 파악해야, 올바른 방법으로 모델을 개선할 수 있습니다. 과대 적합, 과소 적합은 Bias(편향)와 Variance(분산)과 깊은 관련이 있기 때문에 우선 편향과 분산을 이해하는 것이 중요합니다. 이번 포스팅에선 편향과 분산을 이해를 돕기 위한 내용을 정리했습니다. Bias - Variance? 먼저 그림을 통해서 편향과 분산에 대해서 이해해 봅시다. 그림에선 과녁의 중심과 다트 사이의 거리가 멀면 편향이 높다고 합니다. 또한 각 다트 사이의 거리가 멀게 되면 분산이 크다고 말합니다. 다트를 던지는 행위를 예측이라고 해봅시다. 이때 각 다트들의 위치는 곧 예측값이, 과녁의 중심은 실제값이 됩니다. 이를 통해 편향과 분..
-
Cosine Similarity(코사인 유사도)와 Euclidean Distance(유클리드 거리) 알아보기
Intro 인공지능이 주어진 문제를 해결하기 위해서는 Feature(특성)을 적절하게 숫자로 변환해주어야 합니다. 특성을 성공적으로 숫자로 변환하는데 성공했다고 가정한다면, 특성은 벡터의 형태로 표현할 수 있습니다. 서로 다른 두 특성 벡터 사이의 관계를 분석하기 위해선 여러 기준이 있습니다. 이번 포스팅에선 그 중에서 많이 활용되는 Cosine 유사도와 Euclidean 거리에 대해서 알아보겠습니다. Cosine 유사도 코사인 유사도는 두 벡터의 내적을 벡터의 크기로 정규화하여 구하기 때문에, 두 벡터 사이 각도에 초점이 맞춰져있습니다. 따라서 각 Feature의 값 편차가 클 경우 효과적으로 사용할 수 있는 지표입니다. Euclidean(유클리드) 거리 유클리드 거리는 두 벡터 사이 차 성분을 제곱한..
-
Classification Metrics(분류 모델 평가 지표) 알아보기 : Accuracy, Precision, Recall, F1 Score
Intro 여러 분류 모델 중 해결해야 하는 문제의 특성, 데이터 등 다양한 사항을 고려해 몇 개의 모델을 추리는데 성공했다고 가정해봅시다. 이때 가장 성능이 좋은 모델을 선택하기 위해선 얼마나 정확하게 주어진 문제를 해결할 수 있는 지를 수치화하여 비교하는 것이 중요합니다. 모델 평가를 위해 정확성을 수치화하여 나타낸 것을 평가 지표라고 하며, 적절한 평가 지표를 설정하는 것은 매우 중요한 작업입니다. 이번 포스팅에선 기본적인 평가 지표인 Accuracy, Precision, Recall에 대해서 다뤄보겠습니다. Confusion Matrix(혼동 행렬) 분류를 성공적으로 했는지를 확인하기 위해서는 혼동 행렬을 살펴볼 필요가 있습니다. 혼동 행렬이라는 이름처럼 처음에 접했을 때는 매우 헷갈립니다. TP..
-
Word Representation이란? - BoW에서 Word2vec까지
Intro 인간이 일상에서 사용하는 언어(자연어)를 컴퓨터에게 이해시키기 위해서 자연어에 담긴 추상적 뜻을 의미있는 숫자들로 바꾸어야 합니다. 자연어를 의미있는 숫자로 바꾸는 작업을 Word Representation(단어 표현)이라고 합니다. 이번 포스팅에선 자연어를 더 잘 표현할 수 있도록 제안된 다양한 방법에 대해서 다뤄보겠습니다. Word Representation? 단어 표현은 크게 Local, Continuous 표현으로 구분됩니다. Local 표현의 경우 해당 단어 자체만을 참고하기 때문에 뉘앙스(nuance)을 담지 못하지만 Continuous 표현의 경우 단어 주위를 참고하기 때문에 뉘앙스를 담을 수 있다는 장점이 있습니다. BOW와 Word2Vec이 각각 유명한 Local, Contin..
Paper Review
-
[논문 정리] Zero-Shot Text-to-Image Generation (2)
Data Collection 우선, 12억 파라미터로 이뤄진 초기 모델을 구성했다. 이때 330만 개 텍스트-이미지 쌍을 가진 Conceptual Captions 데이터셋을 활용했다. 최종 모델은 파라미터 수가 120억 개로, 이에 따라 Coceptual Captions 외에도 YFCC100M, 위키 피디아에서 얻은 텍스트-이미지 쌍을 추가해 데이터셋을 구성했다. 최종적으로 2억 5천만개의 text-image 쌍을 활용했다. 이때, 데이터 구성 과정에 활용한 필터링 방식은 Conceptual Captions에서 사용한 방식과 동일하다. Conceptual Captions에서 어떤 방식을 활용 했는 지는 아래 링크를 통해서 확인할 수 있다. [논문 리뷰] Conceptual Captions: A Clean..
-
[논문 리뷰] Conceptual Captions: A Cleaned, Hypernymed, Image Alt-text DatasetFor Automatic Image Captioning
MS-COCO의 문제점 COCO 데이터셋엔 그림은 없고, 사진만 있는 등 다양성이 떨어진다. 따라서 데이터가 high correlation을 가지게 된다. 이로인해 아이 사진에 대한 예측 결과를 확인하면 보이지 않는 사물에 대한 문장이 나오는 문제가 발생한다. 또한 파라미터 수가 점점 많아지는 모델들이 사용하기엔 데이터 수가 충분치 않다. Conceptual Captions 330만 개의 다양한 이미지-텍스트 데이터셋을 만들기 위해, 인터넷에서 얻을 수 있는 정보를 활용해 직접 새로 만들었다. MS-COCO의 문제점을 인식하고 만든 데이터라서 결과는 당연히 더 좋다. in front of a building, cake 등의 관련 없는 정보가 더 이상 안나온다. 마지막에 서류든 캐릭터를 COCO 데이터에선..
-
[논문 리뷰] TabNet: Attentive Interpretable Tabular Learning
Abstract TabNet은 정형 데이터에 적합하도록 설계된 딥러닝 모델이다. TabNet은 Sequential Attention을 통해서 각 decision step 마다 feature(특성)을 선택하고, 이를 통해 트리 모델과 유사한 결정 경계를 가지게 된다. 이는 TabNet이 정형 데이터에 잘 동작할 수 있도록 해주는 inductive bias면서, 동시에 결과 해석과 효과적 학습도 가능하도록 도와준다. TabNet의 우수성은 여러 벤치 마크에서 기록한 높은 성능을 통해서 확인할 수 있다. 정형 데이터에 흔한 결측치도 self-supervised learning을 통해서 어느 정도 처리할 수 있다는 점도 특징이다. Introduction 이미지, 텍스트 등의 데이터엔 딥러닝이 많이 사용되는 반면..
-
[논문 정리] SDM: Sequential Deep Matching Model for Online Large-scaleRecommender System
Concept 대규모 데이터 환경에선, 추천에 앞서 후보군을 결정하는 Matching 과정이 필요하다. Matching엔 아이템 기반 CF가 많이 활용되지만, 이 경우 동적으로 변하는 유저의 취향을 반영하기가 힘들다. 이러한 Matching에 Sequential 추천을 활용하면 유저의 취향을 더 잘 파악할 수가 있다. Sequential 추천 시나리오에선, 하나의 세션(short-term)에도 여러 목적이 있을 수 있다는 점과 유저에 따라 긴 시간(long-term) 동안 유지되는 선호도가 있다는 점을 고려하는 것이 중요하다. SDM은 각 세션 마다 여러 목적이 있을 수 있다는 점을 고려해 Single Head Attention 대신, Multi Head Attention를 도입했다. 또한 긴 시간 동안..
-
[논문 정리] MEAL: Multi-Model Ensemble via Adversarial Learning
Concept Ensemble(앙상블) 기법을 활용하면 모델의 성능을 향상 시킬 수 있다. 하지만 앙상블에 사용할 모델을 추가로 저장하고, 또 추론 시 불러와야 하기 때문에 실행이 오래 걸린다는 문제점이 있다. 이때, Knowledge Distiliation(KD)으로 단일 모델을 구성하면 일종의 앙상블 효과를 얻으면서, 동시에 언급한 단점들을 해결할 수 있다. KD는 일반적으로 마지막 레이어의 소프트 라벨만 활용해서 진행된다. 하지만 MEAL은 중간 레이어의 Feature Vector 까지 유사하도록 만들기 위해, KD를 레이어 중간 마다 진행하면서 동시에 Adversarial Loss 까지 도입한다. 이를 Block 단위로 처리할 수 있도록 Adaptive Pooling을 도입했고, 이는 다양한 구조..
-
[논문 정리] Deep Neural Networks for YouTube Recommendations
Abstract 대규모인 유튜브 환경에서 추천을 진행하기 위해 2 - stage information retrieval을 이용하여 추천 시스템을 구성하였다. 이때, 각 과정에 딥러닝을 활용했으며 2 - stage는 각각 다음과 같다. candidates generation 과정 ranking 과정 Introduction 유튜브에선 많은 유저(10억 단위)들에게 실시간으로 업데이트 되는 영상을 추천해야 하며, 이는 다음의 3가지 측면에서 challenging하다. Scale : 기존 추천 방식(Matrix Factorization)은 유저 - 콘텐츠가 매우 많은 유튜브에서 사용할 수 없다. 유튜브 추천 시스템은 실제 서빙 환경인 분산 처리 환경에서 잘 작동해야 한다. Freshness : 새로 업로드된 영..
-
[논문 리뷰] Neural Collaborative Filtering
1. 등장 배경 기존 collaborative filtering(협업 필터링)에서 활용되는 Matrix Factorization은 유저 - 아이템 행렬을 각각 유저, 아이템 임베딩으로 분해한 뒤 이를 해당 유저와 아이템의 look-up table로 삼는다. 이 경우 유저 - 아이템 행렬의 예측 값을 dot product로 구할 수 있으며 $M{\times}N$ 행렬을 $M{\times}K$, $K{\times}N$로 분해할 수 있다. 하지만 dot product는 linear한 연산이면서 동시에 모든 차원의 가중치를 동일하게 생각하기 때문에 복잡한 유저 - 아이템 행렬을 표현하기엔 충분하지 않다. 실제로 dot product가 활용될 latent space의 상황을 가정해보자. $u_4$의 경우 유저 -..
-
[논문 리뷰] Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence Scoring Tasks
1. 등장 배경 기존 BERT(Cross-encoder)는 STS Task를 해결할 때 두 문장 사이 [SEP] 토큰을 추가해 한번에 입력 처리 이 방법은 두 입력 문장의 self-attention을 통해 높은 성능 기록 하지만 두 문장 사이만의 관계를 확인하는 기존 BERT로 Semantic-Search나 Clustering에 활용하는 것은 매우 비효율적(massive computational overhead) 이를 해결하기 위해서 Siamese/Triplet 구조를 활용해 sentence-embedding을 얻을 수 있는 SBERT(bi-encoder)를 제안 SBERT는 BERT에 비해서 낮은 성능을 갖지만 적절한 dense-vector space(sentence-embedding)을 얻기 위해 많..
-
[논문 리뷰] Sentence-BERT : Sentence Embeddings using Siamese BERT-Networks
1. 등장 배경 STS Task에서 높은 성능을 얻은 BERT는 문장 사이 유사도를 비교하기 위해서 문장들을 [SEP] 토큰으로 분리해 한번에 입력으로 받아 처리 이 방식의 경우 두 입력 문장 사이 유사도를 높은 정확도로 얻을 수 있지만 한 문장과 가장 유사한 문장을 찾는 것은 매우 비효율적(massive computational overhead) 모든 경우의 수를 모두 차례로 대입해봐야지만 알 수 있음 한 문장과 유사한 다른 문장들을 찾는 것은 semantic-search, clustering 와 같은 분야에서 다양하게 활용되기 때문에 매우 중요. 이를 효율적으로 해결하기 위해선 정확한 sentence-embeddings를 얻는 것이 관건 sentence-embedding를 얻기 위해서 기존 BERT에..
-
[논문 리뷰] Transformer : Attention Is All You Need
1. 등장 배경 기존 sequence transduction(machine translation)에서 활용된 seq2seq 모델은 순차적으로 입력(sequence position $t$)을 받아 처리 seq2seq는 순차적으로 입력을 받아 간단하게 sequence를 표현할 수 있지만 long-range dependencies, parallelizable 문제가 발생 long-range dependencies를 해결하기 위해서 Attention을 도입했지만 fixed-encoder representation으로 context를 온전히 표현할 수 없는 seq2seq의 근본적인 문제는 해결 불가 2. 제안 입력을 순차적으로 처리하는 RNN을 버리고 Attention만을 사용한 Encoder - Decoder ..
AI Development
-
[QWIKLABS] GKE 사용해보기
Kubernetes? 컨테이너 클러스터(대규모)에서의 어플리케이션을 손쉽게 배포, 관리할 수 있도록 도와줌 GKE(Google Kubernetes Engine) 구글의 인프라를 활용해 추가 기능 제공 Load balancing : 인스턴스 그룹에 대한 부하 분산 및 자동 확장 기능 제공하여 다음과 같은 이점 제공 앱 확장 높은 트래픽 지원 비정상적인 VM 인스턴스 자동으로 삭제/추가 트래픽을 가장 가까운 가장 머신으로 라우팅 Node pools : 클러스터 내 구성이 모두 동일한 노드 그룹으로 노드 풀 마다 독립적으로 작업 가능 Automatic scaling : 클러스터의 노드 풀 크기를 수요에 따라 자동으로 조절하여 가용성을 높이고 비용을 통제 가능 Automatic upgrades : 클러스터가 업..
-
[머신러닝 시스템 설계 정리] Chapter2 : 머신러닝 시스템 설계 소개
머신러닝 시스템 설계 : MLOps MLOps 구성 요소 비즈니스 요구 사항 구현 데이터 스택 관리 인프라 구축 배포 및 모니터링 MLOps 구축 과정 ‘목적’, ‘요구사항’, ‘프로세스’를 설계하고 구축해야 함 ‘왜 필요한 지’ → ‘신뢰성, 확장성, 유지보수성, 적응성을 만족하는 지’ 개선 작업이 반복적으로 발생함 풀고자 하는 문제를 ML로 해결 가능한 형태로 구조화해야 함 동일한 문제더라도 구조화 방식에 따라 난이도는 천차만별 2.1 비즈니스와 머신러닝의 목적 ML 프로젝트 목적 고민 필요 ML 지표 vs 비즈니스 지표 연구가 아니라면 비즈니스 지표를 ML 프로젝트로 끌어올릴 방법을 찾아야 함 비즈니스의 핵심은 이익 극대화 → ML 프로젝트로 어떤 ‘성과 지표’에 영향을 줄 수 있는지 설명할 수 있..
-
[머신러닝 시스템 설계 정리] Chapter1 : 머신러닝 시스템 개요
ML 프로젝트 구성 개요 비즈니스 요구 사항 구현 사용자/개발자 상호 작용 고려 데이터 및 모델 관리 인프라(모니터링 및 업데이트) 구성 ML 알고리즘 구성 1.1 머신러닝을 사용해야 하는 경우 💡 머신러닝 : 기존 데이터로부터 복잡한 패턴을 학습하고 이를 통해 본 적 없는 데이터에 대해 예측을 수행하는 접근법 1. 시스템이 학습에 적합한 경우 학습할 대상인 데이터가 있고 이를 통해 문제를 해결할 수 있어야 함 숙소 임대료 예측? → 넓이, 방, 개수, 지역, 편의 시설, 평점 등이 있는 Airbnb에서 가능 2. 학습할 복잡한 패턴이 존재하는 경우 무작위가 아닌 패턴이 존재 해야 함 너무 단순한 문제가 아니여야 함 최종적으로 시스템 스스로 복잡한 패턴 학습 → 소프트웨어 2.0 3. 사용 가능한 데이터..
-
[Docker] Docker 설치 방법 및 기본 명령어 알아보기
설치 방법 설치 curl -sSL get.docker.com | sh 권한 부여 sudo usermod -aG docker $USER sudo service docker restart Docker 관련 명령어 docker run Image(이미지)를 통해 Container(컨테이너) 생성 docker run 명령어 기본 형식 docker run () () () 옵션 -it : 터미널을 활용해 컨테이너 접근 → /bin/sh 실행 시 활용 가능 docker run -it /bin/sh -p : Port Forwarding 옵션 로컬 포트 : 컨테이너 포트의 형식 # 컨테이너의 8080 포트를 로컬의 80 포트를 사용해서 접근 docker run -p 80:8080 -d : 컨테이너를 백그라운드에서 실행 →..
-
[Git] Configuration의 Scope 확인하기
Local git config --local로 접근 가능 해당 레포에만 적용 됨 설정 파일의 경로: 레포/.git/config Global git config --global로 접근 가능 현재 사용자에만 적용 됨 설정 파일의 경로: 유저/.git/config System git config --system으로 접근 가능 현재 PC의 모든 사용자와, 레포에 적용 됨 설정 파일의 경로 : 프로그램/git/config 주의! 모든 것은 현재 사용 중인 로컬 PC의 기준이고, Github 서버에 업로드 된 원격 저장소 origin과는 무관함 참고 Configure git for Azure and GitHUB and BitBucket on one system i am working on multiple proje..
-
[Github Actions] 기본 구성 요소 파악하기
Workflows 하나 이상의 Job과 그 내부 Step에 있는 기능들을 자동화하여 관리 가능 Workflows를 실행 시키는 트리거는 Event 라고 부름 Event로는 push, pull request, fork 등 Github 내 다양한 동작들이 지정될 수 있음 .github/workflows에 저장돼 있는 yaml 파일이 바로 Workflows를 정의하는 파일임 name: Update README # workflows의 이름 on: # Event 발생 시 실행 정보 push: branches: [ "main" ] pull_request: branches: [ "main" ] Jobs Workflows에서 독립적으로 수행할 작업들을 Job이라고 부름 각 Job은 각각 다른 서버에서 독립적으로 실행되..
-
웹크롤링에 필요한 HTML, CSS 정보
HTML이란? 웹 페이지의 구조를 나타내기 위한 언어 태그로 구성돼 있음 태그 태그는 시작 태그와 종료 태그로 구성 내용 과 같은 형식 태그엔 추가적으로 속성(Attributes)이 있을 수 있음 내용과 같은 형식 자주 사용되는 태그와 그 역할 태그명 역할 div 구역 나누기 a 링크 h1(h2, h3…) 제목 p 문단 ul, li 목록 태그는 부모 태그와 자식 태그로 구성할 수 있음 아래 코드에선 의 자식 태그가 바로 속성 태그의 별명 : 크롤링 대상의 이름 id : 하나의 태그에만 적용 됨 class : 여러 태그에 적용될 수 있음 태그의 스타일 style : CSS의 속성들을 HTML에서 직접 지정할 때 활용 CSS란? 웹사이트의 디자인을 표시하기 위한 언어 글자 색 변경, 폰트 크기, 가로 세로 ..
-
Github Actions을 활용한 알고리즘 풀이 README 업데이트 자동화
알고리즘 문제를 풀고, 그 코드를 Github에 업로드하고 있다. 하지만 별도의 README 파일을 작성해두지 않아서 굉장히 어수선한 상태이다. 어떤 문제를 풀었고, 또 그 풀이를 어디서 확인할 수 있는지에 대한 정보가 전혀 없기 때문이다. '이제 정리해야지!'라는 생각에 README 파일을 직접 작성하려고 했다. 하지만 파일이 100개가 넘어서 굉장히 귀찮았다. '그냥 복붙 할까'라는 생각이 잠깐 들기도 했지만, 이왕 하는 거 코드로 한번 구현해 보자라는 생각이 들었다. README는 어떻게 작성? README를 통해 '문제 이름', '문제 링크', '풀이 파일 링크', '풀이 성공 여부' 정보를 제공하려고 한다. 현재 파일들의 경로는 baekjoon/solved/*/b1_1004.py(문제 이름)과 ..
-
[FSDL 정리] 머신러닝 프로젝트 테스트(Testing) 하기 : 시스템 영역
ML 시스템 Testing 머신러닝의 경우 일반적인 소프트웨어 프로그램보다 Testing이 어렵다. 소프트웨어는 소스 코드를 프로그램으로 바꾸는 것이 주목적이지만, 머신러닝의 경우 추상적인 데이터와 모델을 활용하기 때문이다. 실제로 소스 코드 관리보다는 데이터를 관리하는 것이 추상적이고 난도가 높다. 또한 모델 학습 과정은 잘 정의되지 않아 복잡한 경우가 많고, 관련 디버깅 툴도 부족한 상황이다. 따라서 ML 시스템에선 주요 기능이 정상적으로 동작하는지 간단히 확인하는 Smoke test 기법을 주로 활용한다. Smoke test : 데이터 확인하기 데이터가 원하는 형태(null 값 여부, 칼럼 여부 등)로 잘 있는지 확인한다. 과정에서 상태를 기록하는 리포트를 작성하거나, 알림을 보낼 수 있도록 설정한..
-
[Python] argparse 알아보기
argparse CLI를 통해 사용자 입력을 받아야 할 때 주로 활용한다. argparse.Argumentparser() 사용자 입력이 필요한 경우에 활용하자. 인자를 단순히 저장하는 것에 그치지 않고, 추가적인 행동을 명시해주고 싶을 때 활용하자 argparse.Namespace() 사용자 입력이 필요하지 않은 경우에 활용하자. argparse.py 구조 전체 코드에서 _AttributeHolder는 Action, Namespace, ArgumentParser만 상속한다. 인자를 저장하는 것이 모듈 목적인 점을 고려하면, 결국 Action, Namespace, ArgumentParser가 핵심인 것을 알 수 있다. 추가로 코드를 보면 ArgumentParser는 _ActionsCotainer 까지 상속..
-
[FSDL 정리] 머신러닝 프로젝트 테스트(Testing) 하기 : 코드 영역
Testing(테스트)이 무엇이고 왜 필요한가요? 코드에 버그가 있는지 확인하는 작업을 Testing(테스트)라고 한다. 테스트는 코드가 가지고 있는 문제점을 프로젝트에 적용하기 전에 미리 확인할 수 있다는 점에서, 프로젝트 유지 보수에 큰 도움이 된다. 따라서 테스트를 잘하는 것은 프로젝트 성공에 매우 중요한 요소 중 하나이다. 성공적인 테스트를 위해선 우선 테스트 통과 여부와 버그 발생 여부가 항상 100% 관련 있지 않다는 점을 알아야 한다. 실제로 테스트를 통해서 확인할 수 있는 것은 단순히 '정해둔 테스트 케이스 조건을 지켰는지'이다. 결국 테스트의 효과를 극대화하기 위해선 테스트 케이스를 잘 설정하는 것이 중요하다. 그럼 어떻게 테스트 케이스가 설정 됐을 때 '잘' 됐다고 말할 수 있을까? 답..
-
[FSDL 정리] 분산 학습(Distributed Training) 알아보기
Full Stack Deep Learning - Lecture 2: Development Infrastructure & Tooling Software engineering, Deep learning frameworks, Distributed training, GPUs, and Experiment Management. fullstackdeeplearning.com 모든 사진과 글은 위 링크를 참고했습니다. 분산 학습 모델 파라미터와 데이터 배치의 메모리 사용량이 크지 않다면, 1개의 GPU로 모델 학습을 진행하면 된다. 만약 그렇지 않은 경우엔 여러 GPU를 동시에 활용하는 분산 학습을 활용한다. Data Parallelism(DP) DP란 1개의 GPU로 모델 파라미터는 저장할 수 있지만, 데이터 배치까..
-
[FSDL 정리] 머신러닝 프로젝트 진행 시 고려 사항
Full Stack Deep Learning - Lecture 1: Course Vision and When to Use ML Introduction to planning, developing, and shipping ML-powered products. fullstackdeeplearning.com 모든 사진과 글은 위 링크를 참고했습니다. ML은 언제 활용해야 할까 머신러닝 프로젝트는 연구적 성향이 강하기 때문에 다른 소프트웨어 프로젝트와 비교 했을 때 실패 확률이 높다. 또한 많은 양의 데이터를 처리하기 위해 시스템이 복잡해져 유지 보수 과정에 큰 비용이 든다. 따라서 머신 러닝을 프로젝트에 도입하기 전엔, 다음과 같은 사항을 고려해 정말 필요한 지 따져 보고 도입하는 것이 중요하다. 정말 사용할 ..
-
[Git] 오픈소스와 Git - (2)
오픈소스 컨트리뷰션 아카데미에서 진행된 Git/Github 고급 실습 강의를 정리한 내용입니다. fetch 언제 사용? Origin(fork 해온 상태)과 Upstream(현재 원본 repo 상태)다를 때, 추가된 commit을 가져오고 싶을 때 활용 히스토리 창고(.git)에만 저장 git fetch upstream master pull = fetch + merge upstream/master 라는 branch 이름이 자동으로 생성 됨 rebase 현재 Base를 최신으로 갱신한다 내가 사용 중인 Base가 최신 것이 아니면 오류 발생할 수 있음 만약 내가 수정한 코드가 다른 사람이 최근에 수정된 코드가 동일한 파일에서 나왔을 경우 git rebase upstream/master rebase 단계 1단..
-
[Git] 오픈소스와 Git - (1)
오픈소스 컨트리뷰션 아카데미에서 진행된 Git/Github 기본 실습 강의를 정리한 내용입니다. 오픈소스 기여 과정 개괄 개발 환경 구축(컨테이너) fork하여 프로젝트 복사 clone하여 소스 다운로드 프로젝트 개발 현황 파악/분석 → Reading Skills 필요 history를 파악하는 것이 중요! → Reading Skills 소스 수정 → commit하여 히스토리 저장 수정 내용 제출 → PR! Container 개발 환경 구축을 간단하게 도와줌 독립된 리눅스 환경 구성 개발 환경을 간단하게 구성 ex) pytorch, tensorflow Dockerfile → image → Container Git? 이력 관리(수단), 협업(목적) Push 나의 프로젝트에 commit을 업로드할 때 사용 C..
-
Pytorch hub를 통해 MEAL V2 모델 사용하기
Pytorch hub pytorch hub는 torch 기반 모델 publish 및 load를 지원하여 사전 학습된 모델을 손쉽게 활용할 수 있도록 도와준다. 현재 load 해서 사용할 수 있는 모델은 48개라고 돼있지만 pytorch-transformers와 같이 여러 모델들을 한 곳에 모아둔 경우도 있어 실제로는 더 다양한 모델을 사용할 수 있다. publish 및 load에 대한 자세한 방법은 아래 링크를 통해서 확인할 수 있다. torch.hub — PyTorch 1.12 documentation torch.hub Pytorch Hub is a pre-trained model repository designed to facilitate research reproducibility. Publishi..
-
[QWIKLABS] GCP에서 Docker 사용하기
Docker 간단하게 실행해보기 Cloud Shell 기본 명령어 https://cloud.google.com/sdk/gcloud gcloud auth list -> active 계정 이름 확인 gcloud config list project -> 프로젝트 ID 확인 Docker 파일 실행해보기 hello-world라는 container 실행 docker run hello-world 코드 실행 과정 도커 daemon이 hello-world라는 image를 로컬에서 확인 image가 없다면 Docker Hub라는 public registry에서 다운로드하여 사용 현재 사용 가능한 도커 images 확인 사용 가능하려면 도커 이미지가 built 돼야 함 docker images 현재 실행 중인 contain..
-
[Python] pipreqes으로 사용한 패키지만 requirements.txt에 포함하기
pip freeze의 문제점 패키지 관리를 위해 일반적으로 pip freeze > requirements.txt를 사용한다. pip freeze는 편리하지만, 의존 패키지까지 모두 포함 시켜 가독성을 떨어트린다는 문제가 있다. 실제로 aiohttp, beautifulsoup4, GitPython, requests만 사용한 경우에도, requirements.txt는 다음과 같이 굉장히 지저분하게 생성된다. pip freeze > requirements.txt >> aiohttp==3.8.4 aiosignal==1.3.1 async-timeout==4.0.2 asyncio==3.4.3 attrs==22.2.0 autopep8==2.0.2 beautifulsoup4==4.11.2 certifi==2022.12..
-
Anaconda 환경에서 pip 사용하기
Anacoda에서 pip? Anaconda 환경에선 기본적으로 conda install을 이용해서 패키지를 설치한다. 하지만 원하는 버전의 패키지가 conda에 없는 경우가 있으면 pip install을 사용해야 한다. pip install로 패키지를 설치하면 base 환경에 설치돼 가상 환경 분리가 안된다는 단점이 있다. 이럴 때 가상 환경에 먼저 pip를 설치하고, pip install을 적용하면 사용 중인 환경에만 패키지가 설치된다. 현재 가상 환경에 pip 설치 하기 conda install pip 가상 환경을 만들 때 부터 pip를 설치하려면 다음과 같은 명령어를 사용하면 된다 conda create -n 이름 pip 예시 임의로 test라는 가상 환경을 만든 뒤 확인해보자. (base) ~/a..
-
Hydra 사용법 정리
Hydra? configuration을 모듈로 세분화하여 관리 가능 미리 정의한 configration을 hydra 환경에서 사용 실행된 hydra 환경에서의 실행 기록을 outputs/날짜/시간/.hydra/config.yaml 에 저장 어떤 configuration을 사용했는 지 모두 기록해 실험 관리에 도움 ├── outputs │ └── 2022-06-19 │ └── 19-23-30 │ ├── .hydra │ └── config.yaml | └── ... MNIST 분류 문제를 해결하는 경우 다음과 같이 config 구성 가능 Configuration 구성 모듈별 폴더를 생성해 configuration 구성 model에서 처럼 다양하게 구성해뒀다가 실험 환경에 맞게 변경 가능 ├── configs..
-
[파이썬] Interpreter(인터프리터) 알아보기
Python(파이썬)의 Interpreter(인터프리터) 확인하기 파이썬은 인터프리터 언어라고 알려져있다. 따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다. 하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다! 컴파일러에 대한 오해 해결하기 컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어를 low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다. 실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다. 1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compil..
-
[파이썬] static type checker
Type Hint(타입 힌트) 점검? 타입 힌트의 필요성을 느껴 사용했다면, 이제 힌트를 제대로 적었는지 확인해야 한다. 파이썬은 Dynamic typing(동적 타이핑) 언어라서, 잘못된 힌트를 적었더라도 실행엔 아무런 이상이 없다. 그래서 힌트가 제대로 됐는지 확인할 수가 없다. 파이썬에서 타입 힌트가 제대로 됐는지 확인하려면 별도의 Type Checker(타입 체커)를 사용해야 한다. 타입 체커는 mypy, pyright, pytype 등이 있는데 이 중에서 mypy와 pyright가 많이 활용되고 있다. 주의할 점 타입 힌트가 파이썬에 도입됐지만, 타입 체커가 아직 정식으로 지원되는 것은 아니라고 한다. 따라서 전체 프로그램 코드를 모두 확인하기 보다는, 확인이 필요한 함수나 클래스만 따로 떼어서..
-
Python의 메모리 관리 방법 알아보기
Python의 모든 것은 객체다 파이썬의 메모리 관리 방법을 이해하려면, 우선 파이썬의 모든 것이 객체라는 것을 이해해야 한다. 이는 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참조하는 것이라는 말과 동일하다. 실제로 파이썬의 메모리 할당 과정은 다음과 같다. 그림에서 알 수 있듯, Heap 메모리 영역에 동적으로 할당된 객체를 모든 것(변수, 함수)들이 참조하는 구조다. 메모리가 동적으로 할당 된다는 것은, 결국 런타임 시 메모리가 할당된다는 것을 의미한다. 파이썬의 프로그램은 Byte-code(바이트 코드)를 인터프리터가 한 줄 씩 읽어가며 실행되기 때문에 동적 할당과 잘 맞다. 메모리 해제? 동적으로 메모리를 할당할 경우, 자료의 크기 등을 자유롭게 관리할 수 있어 편리하다는 장점이..
-
[Python] Global Interpreter Lock(GIL)은 왜 도입됐고, 어떤 특징이 있나요?
Global Interpreter Lock(GIL)? GIL은 문자 그대로 인터프리터에 대한 Lock이다. Lock은 인터프리터가 여러 스레드를 병렬적으로(Parallel) 실행하지 않도록 막는다. 파이썬엔 GIL이 있기 때문에, 인터프리터가 매 순간 1개의 쓰레드만 실행할 수 있다. 결국 파이썬의 멀티 스레딩은 병렬적(Parallel)으로 실행되는 대신, 동시적으로(Concurrent) 실행된다. 이때 여러 스레드 중 실행 될 1개의 스레드를 정하려면, 스레드 스케줄러가 필요하다. 하지만 파이썬은 자체적인 스케줄러가 없어서, OS의 스레드 스케줄링을 그대로 활용한다. 그래서 I/O Block이 발생할 경우 GIL도 마찬가지로 Release된다. 따라서 I/O Bound 작업의 경우, 멀티 스레딩으로 병..
-
Python의 메모리 절약법 : Object Interning(객체 재사용)
Mutable vs Immutable 파이썬의 객체는 생성 후 값을 변경할 수 있는지 여부에 따라 mutable, immutable로 나뉜다. 객체의 값을 변경할 수 있다는 것은, 그 값이 변경돼도 같은 메모리 주소를 가진다는 것을 의미한다. 그래서 mutable 객체인 List는 값을 막 바꿔봐도 id가 변하지 않는다. x = [1,2,3] y = x print(id(x)) print(id(y)) y[0] = 3 print(id(y)) print(id(x)) 2062815432192 2062815432192 2062815432192 2062815432192 하지만 immutable 객체인 int의 경우 값을 바꾸면 id가 변하게 된다. 이는 값이 변경되면서, 기존과 다른 새로운 객체를 가리키기 때문이다..
-
[파이썬] @(Decorator)란
@(Decorator)란? @staticmethod def _find_best_gt_match( thr: int, gt_matches: Tensor, idx_iou: float, gt_ignore: Tensor, ious: Tensor, idx_det: int ) -> int: """Return id of best ground truth match with current detection. https://github.com/PyTorchLightning/metrics/blob/master/torchmetrics/detection/mean_ap.py#L199-L928 파이썬으로 작성된 코드들을 보면 위와 같이 함수 위에 @로 시작하는 문구들이 있다. 위 코드에선 @staticmethod가 그렇다. 매번 함..
-
torch.take vs torch.gather
torch.take는 input tensor들을 1차원으로 생각해서 처리한다. 따라서 batch 단위 tensor를 처리할 때는 torch.gather를 사용하는 것이 좋다. Returns a new tensor with the elements of input at the given indices. The input tensor is treated as if it were viewed as a 1-D tensor. The result takes the same shape as the indices. 다음 예시를 통해 torch.take와 torch.gather의 차이점을 확인할 수 있다. 예시는 batch 유저별 label과 negative sample(100개)의 logits을 구하기 위한 과정이다. ..
-
[파이썬] Formatter와 Linter 알아보기
왜 필요? 똑같은 실행을 하는 코드여도 남이 짠 코드는 잘 안 읽힌다. 모두가 각자 나름의 규칙을 지켜서 최대한 깔끔하게 작성했겠지만 그 규칙이 남에게도 적용되기란 쉽지 않다. 이때, 각자가 최소한 정해진 규칙대로 코드를 작성하려고 노력하면 이해하는데 조금이나마 도움이 될 수 있다. 언어마다 각각의 코드 작성 규칙이 있는데 이를 스타일 가이드 또는 컨벤션이라고 한다. 파이썬에도 PEP8이라는 스타일 가이드가 있다. PEP 8 – Style Guide for Python Code | peps.python.org PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type P..
-
[Python] Iterable(반복 가능한 객체)와 Iterator(이터레이터) 이해하기
Iterable(반복 가능한 객체)이란? Iterable의 의미와 효과 Iterable은 문자 그대로 반복 가능한 객체를 의미한다. 반복 가능함은 객체를 구성하는 요소가 여러 개이면서, 이 요소들을 한 번에 하나씩 꺼낼 수 있다는 것을 의미한다. 요소를 한 번에 하나씩 꺼낼 수 있다는 보장이 있다면, 굳이 객체의 모든 요소를 미리 메모리에 저장할 필요가 없다. 매번 실행마다 다음 요소에 해당하는 값만 새로 추가해주면 되기 때문이다. 이 경우 메모리를 절약할 수 있다는 장점이 생기게 되고, 이러한 특성을 Lazy Evaluation이라고 한다. 어떤 객체가 Iterable한가? 어떤 객체가 위와 같은 특성을 가지려면(반복 가능하려면) 해당 객체에 __iter__ 메소드가 있어야 한다. 따라서 hashatt..
-
[파이썬] Type hint 사용법
Python에도 Type을 써야 하나? Python은 동적 타이핑 언어기 때문에 함수 및 클래스의 parameter type을 명시해주지 않아도 된다. 따라서 C++의 templates나 JAVA에서의 generic 없이도 함수 및 클래스를 type에 상관없이 재사용할 수 있다. C++로 예를 들면 template을 통해서 type을 임의로 선언해뒀다가 호출 시에는 type을 명시해줘야 한다. 이는 template으로 임시로 부여한 type을 대신할 명시적인 type을 입력하는 것으로 정적 타이핑 언어인 C++에선 필수적이다. #include #include using namespace std; template T sum(T a, T b){ // template으로 임의 type 할당 return a +..
-
[파이썬] 변수(Python vs C++)
C++의 변수 할당 과정 C++에서 int 형 변수를 선언한 후 값을 저장하고, 이를 다른 변수에 저장하는 과정은 다음과 같다. int a = 1; int b = a; 4 Byte(int) 만큼의 메모리를 할당한 후 a 라고 이름 붙인다. a에 5를 저장한다. 다시 4 Byte 만큼의 메모리를 할당한 후 b 라고 이름 붙인다. a 에 저장된 5를 b 에 저장한다. 저장된 변수의 메모리를 확인하면 다음과 같다. int a = 1; int b = a; cout
-
파이썬을 파이썬답게 : 내장 함수를 활용한 Pythonic 코드 작성법
파이썬을 파이썬답게 본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코 school.programmers.co.kr 위 강의를 참고해 공부한 내용을 정리했습니다. int 다루기 몫과 나머지 구하기 divmod와 unpacking을 이용해서 쉽게 표현 가능 a = 7 b = 5 print(a//b, a%b) ↓ a = 7 b = 5 print(*divmod(a, b)) 진법 변환 int(x, base)으로 10진수 ↔ N 진수를 쉽게 변환 가능 num = '3212' base = 5 answer = 0 for idx, number in enumerat..
Programming
최신 글
-
[QWIKLABS] GKE 사용해보기
Kubernetes? 컨테이너 클러스터(대규모)에서의 어플리케이션을 손쉽게 배포, 관리할 수 있도록 도와줌 GKE(Google Kubernetes Engine) 구글의 인프라를 활용해 추가 기능 제공 Load balancing : 인스턴스 그룹에 대한 부하 분산 및 자동 확장 기능 제공하여 다음과 같은 이점 제공 앱 확장 높은 트래픽 지원 비정상적인 VM 인스턴스 자동으로 삭제/추가 트래픽을 가장 가까운 가장 머신으로 라우팅 Node pools : 클러스터 내 구성이 모두 동일한 노드 그룹으로 노드 풀 마다 독립적으로 작업 가능 Automatic scaling : 클러스터의 노드 풀 크기를 수요에 따라 자동으로 조절하여 가용성을 높이고 비용을 통제 가능 Automatic upgrades : 클러스터가 업..
-
[머신러닝 시스템 설계 정리] Chapter2 : 머신러닝 시스템 설계 소개
머신러닝 시스템 설계 : MLOps MLOps 구성 요소 비즈니스 요구 사항 구현 데이터 스택 관리 인프라 구축 배포 및 모니터링 MLOps 구축 과정 ‘목적’, ‘요구사항’, ‘프로세스’를 설계하고 구축해야 함 ‘왜 필요한 지’ → ‘신뢰성, 확장성, 유지보수성, 적응성을 만족하는 지’ 개선 작업이 반복적으로 발생함 풀고자 하는 문제를 ML로 해결 가능한 형태로 구조화해야 함 동일한 문제더라도 구조화 방식에 따라 난이도는 천차만별 2.1 비즈니스와 머신러닝의 목적 ML 프로젝트 목적 고민 필요 ML 지표 vs 비즈니스 지표 연구가 아니라면 비즈니스 지표를 ML 프로젝트로 끌어올릴 방법을 찾아야 함 비즈니스의 핵심은 이익 극대화 → ML 프로젝트로 어떤 ‘성과 지표’에 영향을 줄 수 있는지 설명할 수 있..
-
[머신러닝 시스템 설계 정리] Chapter1 : 머신러닝 시스템 개요
ML 프로젝트 구성 개요 비즈니스 요구 사항 구현 사용자/개발자 상호 작용 고려 데이터 및 모델 관리 인프라(모니터링 및 업데이트) 구성 ML 알고리즘 구성 1.1 머신러닝을 사용해야 하는 경우 💡 머신러닝 : 기존 데이터로부터 복잡한 패턴을 학습하고 이를 통해 본 적 없는 데이터에 대해 예측을 수행하는 접근법 1. 시스템이 학습에 적합한 경우 학습할 대상인 데이터가 있고 이를 통해 문제를 해결할 수 있어야 함 숙소 임대료 예측? → 넓이, 방, 개수, 지역, 편의 시설, 평점 등이 있는 Airbnb에서 가능 2. 학습할 복잡한 패턴이 존재하는 경우 무작위가 아닌 패턴이 존재 해야 함 너무 단순한 문제가 아니여야 함 최종적으로 시스템 스스로 복잡한 패턴 학습 → 소프트웨어 2.0 3. 사용 가능한 데이터..
-
[리뷰] 린 스타트업 (10주년 기념 전면 개정판)
스타트업에 관심이 많다면, '린(LEAN)하다'는 표현을 한번 쯤은 들어본 적이 있을 것이다. '린'하게 일한다는 것이 무엇이고, 또 어떻게 실천할 수 있는 지에 대해서 궁금 하다면, 위 책을 읽는 것을 추천한다. 책에선 아이디어를 시장에 적합한 제품으로 만들기 까지의 과정을 설계 - 검증 - 성장의 단계로 구분해 제시하고 있다. 특히 10년 간 다양한 사례로 검증한 최적의 방법을, '스티브'와 '메리'라는 가상 인물 간의 대화 형태로 다뤄 독자들이 쉽게 이해할 수 있도록 제공하고 있다. '린'하게 일하고 싶은 사업가, PM, 개발 직무 등 스타트업의 구성원 모두에게 추천하고 싶은 책이다. 한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다.
-
[리뷰] 팀 개발을 위한 Git, Github 시작하기
팀 단위 개발에 필요한 Git, Github의 개념과 실제 사용법을 다루고 있는 책이다. 찾아보니 저자 분들의 기존 Git 강의를 좀 더 발전 시켜서 책으로 까지 출판한 거 같다. 그래서 아래 링크를 참고하면 책이 대략적으로 어떤 느낌으로 서술돼 있는지 확인할 수 있을 것이다..! 초심자를 위한 Github 협업 튜토리얼 (with 토끼와 거북이) – 블로그 이사갔어요! https://milooy.github.io/ (wordpress.com) [무료] Git과 GitHub 시작하기 - 인프런 | 강의 (inflearn.com) 책은 ‘무조건 쉽게. 단, 제대로’라는 집필 목표에 충실하게 구성돼 있다. 따라서 Git과 Github를 먼저 GUI 환경에서 익히고, 이후 CLI 환경에서 레벨업할 수 있는 다..
-
[리뷰] 머신러닝 시스템 설계
비즈니스 문제를 해결하기 위한 머신러닝 시스템 설계 전 과정을 다루고 있는 책이다. 스탠포드 대학의 CS239S 강의를 책으로 재 구성한 것으로, 머신러닝 실무자인 저자의 다양한 노하우가 담겨져 있다. 시스템 설계 시 고민해야 할 점과 발생할 수 있는 문제들을 미리 짚어주기 때문에, 기존의 시스템을 이해할 때도, 새로운 시스템을 구성할 때도 큰 도움이 될 수 있는 책이다. 특히 책 속에 언급되는 예시들이 현실에 가깝고 직관적이라서 좋았다. 책은 우선, 머신러닝 시스템 및 시스템 설계 과정을 개괄적으로 다룬다. 이후엔 시스템 구성 요소들을 차곡 차곡 채워 나간다. 데이터 처리, 모델 개발, 배포 및 서비스 구축, 모니터링, 연속 학습 등의 순으로 설계 과정을 차례로 다루고, 이를 통해 다양한 팁과 문제 해..
-
[Python] 백준 1254번 팰린드롬 만들기 풀이
문제 확인하기 1254번: 팰린드롬 만들기 동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다. 동호는 www.acmicpc.net 나의 풀이 팰린드롬은 앞으로 읽어도, 거꾸로 읽어도 똑같은 단어다. 문제에선 뒤에 몇 글자를 추가해야 팰린드롬이 되는지 확인하고 싶어한다. 이를 위해선 현재 단어 중 어느 부분까지가 팰린드롬인지 체크해야 한다. 결국 i를 바꿔가며 순 방향, 역 방향 문자열이 동일한지 확인하면 된다. S = input() for i in range(len(S)): if S[i:] == S[i:][::-1]: palindrome = S + S[:i][::-1] print(..
-
[Web] Scaling up(수직 확장)과 Scaling out(수평 확장) 알아보기
Scaling up(수직 확장) 더 많은 요청을 처리하기 위해 단일 서버 스펙을 업그레이드한다. 단일 서버에서 모든 데이터를 처리하기 때문에, Data Integrity(데이터 무결성)와 Data Consistency(데이터 정합성)가 중요한 DB 서버 등에서 활용된다. 단일 서버에 부하가 집중되는 특징이 있고, 서버 이상 시 전체 시스템이 동작하지 않는 SPOF(Single Point of Failure) 문제가 발생할 수 있다. 하드웨어에 의존적이기 때문에 업그레이드 시 서버가 필연적으로 다운되고, 필요 부품 비용이 높을 수 있다. 여러 서버를 묶어 클러스터를 구성하거나, 데이터 일관성을 유지하기 위한 노력이 필요 없어 확장 과정이 비교적 단순하다. 물론 그 만큼 유연성은 떨어진다. Scaling o..
-
[Docker] Docker 설치 방법 및 기본 명령어 알아보기
설치 방법 설치 curl -sSL get.docker.com | sh 권한 부여 sudo usermod -aG docker $USER sudo service docker restart Docker 관련 명령어 docker run Image(이미지)를 통해 Container(컨테이너) 생성 docker run 명령어 기본 형식 docker run () () () 옵션 -it : 터미널을 활용해 컨테이너 접근 → /bin/sh 실행 시 활용 가능 docker run -it /bin/sh -p : Port Forwarding 옵션 로컬 포트 : 컨테이너 포트의 형식 # 컨테이너의 8080 포트를 로컬의 80 포트를 사용해서 접근 docker run -p 80:8080 -d : 컨테이너를 백그라운드에서 실행 →..
-
Docker 환경에서 ImportError: libGL.so.1: cannot open shared object file: No such file or directory 발생 시 해결 방법
문제 상황 opencv를 포함한 Docker 이미지를 만들 때 cv2의 의존 패키지가 없을 때 발생한다. 해결 방법 의존 패키지를 추가로 설치하거나 opencv-python-headless과 같이 애초에 서버용으로 제작된 라이브러리를 활용하자. opencv-python-headless 사용하기 RUN pip3 install opencv-python-headless 의존 패키지 직접 설치하기 RUN apt-get update && apt-get install libgl1-mesa-glx -y RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y 참고 ImportError: libGL.so.1: cannot open shared object fil..
-
Poetry의 does not contain any element 오류 해결하기
문제 상황 Docker에서 poetry install 하는 과정에서 doest not contain any element 오류가 발생했다. packages = [] 가 설정돼 있어, 상위 디렉토리의 의존성까지 확인하는 것이 원인이라고 한다. packages = [{include = "style_transfer"}] 해결 방법 1. poetry install에 --no-root 옵션을 준다. poetry install --no-root 2. packages = [] 라인 자체를 삭제한다. packages = [{include = "style_transfer"}] 참고 Poetry install on an existing project Error "does not contain any element" I a..
-
[Network] Hub(허브, L1), Switch(스위치, L2), Router(라우터, L3), 공유기(L4) 차이점 알아보기
허브(더미 허브) : L1 장비 L1(Physical Layer)에서 동작하며 멀티 포트를 통해 여러 컴퓨터 및 네트워크 장비들을 연결해주는 장치이다. 신호를 증폭해주는 리피터이기도 하다. 허브는 L1 장비라서 통신 시 목적지로서 활용할 수 있는 MAC, IP 정보가 없다. 따라서 통신 시 모든 장비에게 데이터를 전송하게 된다. 결국 허브 내 장비가 많아지면 그 만큼 대역폭에서 손해를 보게 되는 구조이다. 스위치 : L2 장비 L2(Data-Link Layer)에서 동작하며 Frames(프레임)의 MAC 주소를 참고해 해당하는 장비에 데이터를 전달해주는 장치이다. 스위치는 해당 네트워크의 MAC 주소를 테이블로 저장하고 있는데, 입력된 프레임의 MAC 주소가 테이블에 없을 경우는 허브와 동일하게 모든 장..
-
Classification Metrics(분류 모델 지표 ) 알아보기 : TPR, FPR과 ROC Curve 사이 관계 및 AUC
TPR, FPR → Positive 판단에 따른 성공, 실패 여부 True Positive Ratio(=Recall) : $\frac{TP}{TP+FN}$ 실제 Positive(양성)을 얼마나 정확히 분류 했는지 False Positive Ratio(=Fallout) : $\frac{FP}{TN + FP}$시 실제 Negative(음성) 중 잘못 분류한 비율 TPR, FPR 모두 Positive(양성) 판단에 따른 성공, 실패 여부를 다룸 이때 성공-실패 여부는 Positive(양성) 판단의 기준이 될 Threshold를 어떻게 설정 하느냐에 따라 다른 결과가 나오게 됨 ROC와 AUC? ROC : Positive 예측 시 Threshold 별 양상을 확인하기 위해, FPR을 x 축으로, TPR을 y 축..
-
[Web] Web Server(웹 서버)와 CGI, Web Application Server(WAS, 앱 서버) 알아보기
Web Server(웹 서버) 클라이언트로부터 HTTP 요청을 받아 Static pages(정적 페이지)를 제공하거나, Dynamic Pages(동적 페이지) 요청을 WAS에 전달 하는 서버 및 프로그램을 의미한다. 서버가 설치된 PC 자체를 가리키는 말이기도 하다. 예시) Apache, Nginx Common Gateway Interface(CGI) Web Server(웹 서버)와 Application Program 사이 정보를 주고 받는 프로토콜이다. CGI를 통해 웹 서버가 Dynamic Pages(동적 페이지) 구성을 할 수 있다. 프로토콜이기 때문에 어떤 언어로도 작성될 수 있다. CGI는 클라이언트 요청을 처리 하기 위해 매번 Process(프로세스)를 새로 생성한다. 따라서 많은 요청이 발생..
-
[Web] Static pages(정적 페이지)와 Dynamic pages(동적 페이지) 알아보기
Static pages(정적 페이지) html, css, javascript 등으로 미리 작성된 파일 등을 서버에 저장해 놓고, 매 클라이언트 요청마다 동일한 페이지를 반환하는 경우다. 동적인 요소가 없기 때문에 별도의 DB 없이 Web Server(웹 서버)만으로 처리할 수 있는 영역이다. 미리 저장된 파일을 불러오기 때문에 로딩 자체가 빠르고, 공격적인 캐시 설정을 통해 이를 극대화할 수 있다는 장점이 있다. 다만 페이지 내용 변경 시 서버에 업로드해야 하는 과정이 필요한 만큼, 수정이 불편한 단점이 있다. Dynamic pages(동적 페이지) 클라이언트 요청에 따라 데이터를 가공해 맞춤형 결과를 반환하는 경우다. 동적 페이지를 위해선 Web Application Server(WAS)와 DB가 필요..
-
Regression Metrics(회귀 평가 지표) 알아보기 : MSLE, RMSLE, R^2, MAPE, sMAPE, MPE
어떤 특성을 가진 Regression Metrics(회귀 평가 지표)? 기존에 다뤘던 MAE, MSE, RMSE는 Scale-Dependent한 특성이 있었다. 하지만 이 포스팅에서 다룰 지표들은 비율, % 기반으로 접근하기 때문에 상대적으로 Scale에서 자유롭다는 특징이 있다. MSLE(Mean Sqaured Log Error) $$ MSLE = \frac{1}{n}\sum_{i=1}^{n}(\log{y_i}-\log{\hat{y_i})}^2 $$ 모델의 예측 $\hat{y}$와 Label $y$에 각각 Log를 적용해 MSE를 한 것이다. Log 함수의 특성을 가지고 있는 지표이다. $\log{y}-\log{\hat{y}} = \frac{\log{y}}{\log{\hat{y}}}$ 이기 때문에 상대..
-
[Seaborn] Figure 하나에 Graph 여러 개 그릴 때 Legend 표시하기
plot 할 때 원하는 label을 지정 Legend에 표시하고 싶은 내용을 label 인자에 입력해주면 된다. d10_ft = check3[(check3['choice'] == 1)&(check3['decile'] == 10)]['TOTL_SQ_FT_CNT'] d1_ft = check3[(check3['choice'] == 1)&(check3['decile'] == 1)]['TOTL_SQ_FT_CNT'] f, ax = plt.subplots(1, 1) sns.distplot(d10_ft, label = 'decile 10',ax=ax) sns.distplot(d1_ft, label = 'decile 1',ax=ax) ax.legend() 참고 How to add legend to seaborn mult..
-
Regression Metrics(회귀 모델 평가 지표) 알아보기 : MAE, MSE, RMSE
MAE, MSE, RMSE = Scale-Dependent Metrics MAE, MSE, RMSE는 데이터 Scale에 의존하는 Metrics(평가 지표)이다. 그래서 동일 데이터를 다루더라도 Scaling 전-후에 따라 다른 수치를 얻게 된다는 특징이 있다. 따라서 이러한 평가 지표를 통해 모델 간 성능을 비교할 때는 Scale을 주의해야 한다. MAE(Mean Absolute Error) $$ MAE=\frac{1}{n}\displaystyle\sum_{i=1}^{n} |y_i-\hat{y}_i| $$ 모델의 Residual(잔차)에 절댓값을 취한 뒤 평균 처리한다. MAE를 기준으로 최적화 시 Median(중앙값)에 수렴한다는 특징이 있다. 장점 잔차의 Scale을 그대로 다루기 때문에 결과를 직..
-
[짧] MAE(Mean Absolute Error)와 Median(중앙값) 사이 관계 알아보기
둘 사이의 관계? MAE는 Median(중앙값)일 때가 최소이다. 아래 글은 MAE가 왜 중앙값일 때 최소가 되는지 대략적으로 설명한 글이다. 개인적으로 이해하기 쉽게(?) 그림으로 표현했다. The median minimizes the sum of absolute deviations (the $ {\ell}_{1} $ norm) Suppose we have a set $S$ of real numbers. Show that $$\sum_{s\in S}|s-x| $$ is minimal if $x$ is equal to the median. This is a sample exam question of one of the exams that I need to take a... math.stackexchang..
-
R^2(결정 계수, Coefficient of Determination) 알아보기
$R^2$(결정 계수)란? $R^2$(결정 계수)는 회귀 모델의 성능 평가 지표로, Dependent Variable(종속 변수) $y$의 총 변동(분산)을 회귀 모델 $wx$로 표현할 수 있는 정도를 나타낸다. 이를 수식으로 나타내면 다음과 같다. $$ R^2 = \frac{\sum(\hat{y_i}-\bar{y})^2}{\sum(y_i-\bar{y})^2} $$ 식에선 분모, 분자 모두 $\bar{y}$를 기준으로 분산을 측정한다. 이때 $\bar{y}$는 $y$의 평균이면서, 동시에 회귀 모델 $wx$와 관련 없는 Naive한 예측이다. 따라서 결정 계수는 $y$의 분산을 현 모델로 얼마나 나타낼 수 있는지 알려주는 지표면서, 동시에 Naive한 예측($\bar{y}$) 대비 모델($\hat{y}$..
-
Linear Regression(선형 회귀) 모델 가정 알아보기
가정이 필요한 이유? Linear Regression(선형 회귀) 모델은 선형적 관계의 Independent Variable(독립 변수)와 Dependent Variable(종속 변수)가 수치적으로 얼마나 관련 있는지 확인하는 것이 목적이다. 가정이 만족돼야 목적에 맞게 모델을 사용할 수 있고, Residual(잔차)을 통해 계수, 모형 검정 등을 진행할 수 있다. 선형성 가정 Independent Variable(독립 변수) $x$와 Dependent Variable(종속 변수)의 조건부 기댓값 $E(y|x)$ 사이 선형 관계가 존재해야 한다. 둘 사이의 관계가 선형이라는 것은 $y = wx+\epsilon$에서 $w$가 일차식인 경우를 의미한다. 오차항의 정규성 가정 $y = wx+\epsilon$에..
-
Decision Tree(결정 트리) 구성과 Impurity(불순도) 알아보기
Decision Tree(결정 트리) 데이터를 통해 Branch를 구성하고 이를 통해 분류, 회귀까지 할 수 있는 모델이다. 이 중 분류 모델의 경우 Impurity가 최소가 되는 방향으로 Branch가 생성되며, 여러 Branch로 구성된 최종 형태가 거꾸로 세운 나무 같아 트리 모델이라고 부른다. Impuriy는 Entropy와 Gini index로 측정된다. Impurity 측정 지표 Impurity라는 이름처럼 Entropy, Gini index 모두 고유한 성분만 있을 때 최솟값을 가지고, 반반 섞여 있을 경우 최댓값을 가진다. 두 지표 중 Entropy는 $log$ 항이 있어, 상대적으로 계산에 더 오랜 시간이 걸린다. Entropy $$ E = -\sum_{k=1}^K p(y_k) \log_..
-
Non-Parametric Density Estimation(비모수 밀도 추정) 알아보기
Density Estimation(DE)? 관측 데이터는 확률 변수에 의해 샘플링된 것으로 볼 수 있다. 이러한 관측 데이터를 많이 모으면 어떤 확률 변수에서 추출됐는지 추정이 가능할 것이다. 데이터를 통해 기존 확률 변수의 Density(PDF)를 추정하는 것이 바로 DE이다. PDF를 알면 확률 변수에 정보를 알 수 있기에 가치 있음 Non-Parametric Estimation 확률 변수의 형태를 미리 가정할 경우를 Parametric, 아닐 경우 Non-Parametric Model 이라고 한다. Non-Parametric Estimation은 변수에 대한 가정 없이 관측된 데이터만 가지고 DE를 진행한다. 다양한 방법 중 간단하게 Histogram, KDE만 알아보자. Histogram 데이터의..
-
Independent(독립)와 Uncorrelated(상관 관계 없음) 알아보기
Independent(독립) 두 랜덤 변수의 Joint Probability(결합 확률)가 각 변수의 Marginal Probability(주변 확률)로 표현되는 경우를 의미한다. $$ P(X,Y)=P(X)P(Y) $$ Uncorrealted(상관 관계 없음) 두 랜덤 변수 사이 Correlation 관계가 없음을 의미하며, Correlation ($\rho_{X, Y}$) 가 0 인 경우이다. Correlation ($\rho_{X, Y}$) 은 두 변수 사이 선형적 관계를 보여주는 지표로, Covariance(공분산)을 각 변수의 표준 편차로 정규화한 값이다. $$ \begin{align*}\rho_{XY} &= \mathbf{E}\left[\frac{X-\mathbf{E}[X]}{\sqrt{\mat..
-
Sampling(표본 추출) 방식 별 특징과 추출법 결정 시 고려 사항
Probability Sampling(확률 표본 추출) Simple Random Sampling(무작위 추출법) 모집단 전체에 일련 번호(실제 혹은 개념적)를 부여하고, 랜덤하게 추출하는 방식 장점 추출 확률이 동일하기 때문에, 표본의 대표성이 크고, 오차 개입 여부가 적음 모집단에 대한 사전 지식 불필요 단점 대규모 표본일 때 효과적임 모집단에 대한 사전 지식을 활용할 수 없고, 표본 프레임(모집단 목록)을 파악하기 어려움 Stratified Sampling(층화 추출법) 모집단을 서로 겹치지 않는 여러 개의 ‘층’으로 쪼갠 뒤, 각 ‘층’에서 무작위로 추출하는 방식 ‘층’ 마다의 개수를 고려해 추출한다면, 비례 층화 추출 장점 집단을 ‘층’으로 관리해 빼놓지 않고 표본에 포함 시킬 수 있음 대표성이 ..
-
[OS] 운영체제의 자원 관리 기능 알아보기
운영체제의 자원 관리 운영체제의 주요 기능은 컴퓨터 자원을 효과적으로 관리하는 것이다. 컴퓨터의 핵심 하드웨어 자원인 CPU와 메모리는 CPU Scheduling(스케줄링)과 Memory Management(메모리 관리)을 통해 관리된다. 또한 주변 및 입출력 장치의 요청을 CPU가 효과적으로 처리하기 위해 Interrupt(인터럽트)를 도입했다. 1. CPU Scheduling(스케줄링) 1개의 CPU에서 다양한 프로세스를 수행하기 위해, 자원을 관리하는 방법 가장 효율적이면서, 특정 프로세스가 불이익을 받지 않도록 설정하는 것이 핵심 현재 CPU 자원을 뺏을 수 있는 스케줄링이면 Preemptive(선점형), 없으면 Non-preemptive(비선점형)이라고 함 FCFS(First Come First..
-
[Python] 프로그래머스 [3차] 방금그곡 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 들은 멜로디와 실제 곡을 비교하기 위해선, 재생 시간 만큼 곡의 멜로디를 늘려줘야 한다. 곡을 늘릴 때 # 이 있으면 개수를 세기 어려우니, 먼저 # 이 붙은 음을 변경해준다. 나머지 부분은 문제의 조건에 맞춰서 구현하면 된다. 재생 시간이 동일할 경우, 먼저 입력된 음악을 반환하라고 돼 있는데, 입력 시간을 기준으로 정렬하지 않아도 똑같이 정답으로 나온다. 이미 입력 시간 기준으로 입력된 거 같다. # 끝부분-처음 부분 연결돼 헷갈릴 수 있음 / 중간 멜로디만 겹칠 수 있음 # 재생 시..
-
[Python] 프로그래머스 택배상자 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 기존 컨베이어 벨트와 보조 컨베이어 벨트를 각각 Queue와 Stack으로 만든 뒤, 주어진 조건에 만족하도록 구현했다. # 1 ~ n 까지의 택배를 재 배열 # 기존 컨베이어 : queue -> 작은 수부터 빼낼 수 있음 # 보조 컨베이어 : Stack -> 큰 수부터 빼낼 수 있음 # 몇 개의 상자를 실을 수 있는지 # order의 상자가 나올 때 까지 pop from collections import deque def solution(order): order = deque(order..
-
[Python] 프로그래머스 메뉴 리뉴얼 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 Orders 배열의 원소 크기가 작고, 조합을 확인해야 하는 Course의 크기 또한 크지 않다. 따라서 모든 세트 조합을 구하더라도 시간 초과가 발생하진 않는다. 세트 조합을 구하는 과정에서 주의할 점은 알파벳 순서가 다르더라도 동일한 세트로 처리해야 한다는 점이다. 이후엔 문제에서 주어진 조건에 맞게 필터링하면 된다. # 각 손님들이 주문할 때, 가장 많이 함께 주문한 단품 메뉴를 코스 요리 메뉴로 구성 # 코스 요리 : 최소 2 가지 단품 + 최소 2 명의 손님이 주문했던 제품 만 ..
-
[Python] 프로그래머스 롤케이크 자르기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가짓수를 동일하게 케이크를 분리해야 한다. 앞 케이크 분리 시, 뒷 케이크의 일부 성분이 없어져 가짓수가 바뀔 수 있다는 것을 주의해야 한다. 이 생각을 안하고 이분 탐색으로 접근해서 풀었고, 결국 스스로 푸는데는 실패했다. 아래는 다른 사람의 코드를 보고 이해한 내용이다. 각 케이크 가짓수를 따로 저장해서 관리 우선 각 케이크의 idx 별 가짓수를 pt1_cnt, pt2_cnt에 저장한다. 모두 저장이 끝나면 pt1_cnt[i]와 pt2_cnt[i + 1] 이 동일한 지 확인하고, 그 ..
-
[Python] 프로그래머스 숫자 변환하기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 x에서 y 까지의 최소 이동 횟수를 구하기 위해서 BFS를 활용했다. 이때 x와 y가 같은 경우엔, 이동 횟수가 0으로도 도달 가능하기에 미리 예외 처리를 해줬다. # 최소 연산 횟수? # y 까지의 위치를 저장하는 배열 생성 후 BFS from collections import deque def bfs(map_info: list, start: int, end: int, n: int) -> int: queue = deque() queue.append(start) # BFS 시작 while..
-
[Python] 프로그래머스 삼각 달팽이 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 재귀를 활용한 풀이 : 코드 작성 실패 n 이 3 보다 클 경우, 전체 삼각형은 외부 삼각형, 내부 삼각형으로 분리할 수 있다는 점을 주목해 풀이를 시도했다. 코드 작성엔 실패했고, 다른 사람이 작성한 아래 코드를 보고 이해한 뒤 주석을 작성했다. arr = [] def draw(x, y, cnt, num): if cnt < 1: return number = num # 삼각형의 좌측 대각선 for i in range(cnt): arr[x + i][y] = number number += 1..
-
[Python] 프로그래머스 뒤에 있는 큰 수 찾기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 완전 탐색으로 접근할 경우 $O(N^2)$ 이고, numbers의 길이는 최대 100만이기 때문에 시간 초과가 발생한다. 뒷 큰수는 앞에서 부터 값을 보관해 뒀다가, 더 큰 값이 나오면 제거하고, answer 정보를 업데이트하는 방식으로도 얻을 수 있다. 이 경우 스택에 값 numbers의 idx를 저장해두고, numbers의 숫자가 가장 최근에 입력된 값과 유사한 지 비교하면 된다. # 자신보다 뒤 + 크면서 가장 가까이 있는 수 : 뒷 큰수 # 뒷 큰수가 없으면 -1 # 완전 탐색 불..
-
[OOP] Class와 Instance(Object) 알아보기 Feat. self, cls
Class 데이터로 어떤 문제를 해결하기 위해서, OOP 원칙에 따라 코드로 구현한 것이다. 다시 말하면 어떤 집단에 속하는 Attributes(속성)과 Methods(행위)를 코드로 구현해, 변수와 메소드로 정의한 것이다. 이러한 Class는 Object(객체)의 설계도 역할을 하기 때문에, 실제 메모리 상에 올라가진 않는다. 실제 메모리에 할당되는 것은 Class가 아닌 객체이고, 객체 각각은 instance라고 부른다. Object(Instance) Class에서 정의한 것(설계도)를 토대로 실제 메모리 상에 할당된 것(실제 사물)이다. 프로그램에서의 데이터와 행위를 묶어 만들어진, 실체이다. Class로 만들어진 여러 instance는 각각 독립적이다. Python의 self 과 cls ? sel..
-
[OOP] OOP(객체 지향 프로그래밍)의 개념과 특징 알아보기
OOP란? 필요한 데이터를 추상화하여 속성(Attributes)와 행위(methods)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이다. 데이터를 중심으로 필요한 기능을 함수로 구현하는 방식의 절차 지향 프로그래밍과 달리, OOP에선 데이터와 함수들을 묶고 이를 객체로 관리한다. 객체라고 하면 뭔가 말이 어렵고 한데, 그냥 우리가 일반적으로 사용하는 언어 구조와 비슷하다고 생각하면 이해하기 쉽다. 위 그림을 예시로 들면 우선 데이터는 '돈', '잔돈', '제품'이다. 앞서 절차 지향에선 데이터(돈, 잔돈, 제품)를 행위와 별도로 생각한다고 했다. 그래서 절차 지향에선 데이터에 대한 모든 행위를 '~돈을 ~', '~잔돈을~', '~제품을~'의 식으로 표..
-
[Git] Configuration의 Scope 확인하기
Local git config --local로 접근 가능 해당 레포에만 적용 됨 설정 파일의 경로: 레포/.git/config Global git config --global로 접근 가능 현재 사용자에만 적용 됨 설정 파일의 경로: 유저/.git/config System git config --system으로 접근 가능 현재 PC의 모든 사용자와, 레포에 적용 됨 설정 파일의 경로 : 프로그램/git/config 주의! 모든 것은 현재 사용 중인 로컬 PC의 기준이고, Github 서버에 업로드 된 원격 저장소 origin과는 무관함 참고 Configure git for Azure and GitHUB and BitBucket on one system i am working on multiple proje..
-
Github Actions에서 git diff로 이전 Commit 확인하기
문제 상황 Github Actions에서 git diff 명령어를 통해, 이전 Commit 정보 참고를 시도할 경우 다음과 같은 오류가 발생한다. 이때 입력한 branch 등의 이름이 잘못 되지 않아도, 동일한 메시지가 반복된다. git diff origin/main..origin/main^
-
[Github Actions] 기본 구성 요소 파악하기
Workflows 하나 이상의 Job과 그 내부 Step에 있는 기능들을 자동화하여 관리 가능 Workflows를 실행 시키는 트리거는 Event 라고 부름 Event로는 push, pull request, fork 등 Github 내 다양한 동작들이 지정될 수 있음 .github/workflows에 저장돼 있는 yaml 파일이 바로 Workflows를 정의하는 파일임 name: Update README # workflows의 이름 on: # Event 발생 시 실행 정보 push: branches: [ "main" ] pull_request: branches: [ "main" ] Jobs Workflows에서 독립적으로 수행할 작업들을 Job이라고 부름 각 Job은 각각 다른 서버에서 독립적으로 실행되..
-
[Git] 한글 깨짐 해결하기
문제 상황 깃 작업 중에서 diff나 status로 로그를 찍어볼 때, 한글이 깨져서 나오는 경우가 있다. git diff --name-only auto-readme..origin/auto-readme
-
[Python] 프로그래머스 큰 수 만들기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 DFS를 활용한 풀이 : 시간 초과 문자 조합을 구성하기 위해서 DFS를 활용했다. 조합 구성 시, 순서를 유지하기 위해서 start 변수를 도입해 탐색 범위를 제한했다. 시간 초과가 발생했다. 풀이의 시간 복잡도는 ${n \choose k}$ 인데, n과 k가 최대 100만 까지 가능하기 때문이다. 더보기 DFS 함수의 시간 복잡도 T(dfs) = (n-k) choose (k-1) + (n-k+1) choose (k-1) + ... + n choose (k-1) = (n+1) choos..
-
[Python] 프로그래머스 쿼드압축 후 개수 세기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 쿼드 압축은 매 시행 마다 압축이 가능한 지 확인하고, 불가능하다면 4개의 동일한 부분을 나눠서 다시 확인한다. 압축 시도 → 분할 후 압축 재 시도의 과정이 반복되기 때문에 재귀 함수를 활용할 수 있다. 압축의 형태를 비교하는 과정에서, 2차원 리스트 슬라이싱이 필요했다. 리스트를 2차원 슬라이싱 하려면, 다음과 같이 리스트 컴프리헨션을 사용하면된다. [row[j : j + n // 2] for row in arr[i : i + n // 2]] # (0의 개수, 1의 개수) # 재귀? ..
-
[Python] 프로그래머스 소수 찾기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가능한 문자열을 구성하기 위한 방법으로는 순열, 백트래킹을 활용한 DFS가 있다. DFS 과정에서 각 종이(숫자)가 한 번만 활용돼야 하기 때문에 is_used 라는 변수를 활용했다. # 가능한 문자열 구성하기 def dfs(numbers, n_len, num): global cnt, is_used, num_uniq # 문자열 길이 최대일 경우 if n_len == len(numbers): return for i in range(len(numbers)): if not is_used[i]:..
-
[Python] 프로그래머스 덧칠하기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 섹션이 이미 순서대로 정렬돼 있다. 그래서 앞에서부터(뒤에서부터) 차례로 칠하기만 해도 최소 덧칠 횟수가 만족된다. # N 개의 구역 (1 ~ N 라벨) # M 미터 -> 구역 초과 X # 반복해도 되지만, 최소화해야 함 # 끝에서 부터 확인하면 될 듯 -> 윈도우가 범위 안 넘어가면 색칠 # 순서 유지돼야 함 -> 윈도우 내 최소 값 보다 마지막 성분이 큰 경우 pop() def solution(n, m, section): cnt = 0 # 모든 영역을 다 칠할 때 까지 반복 while..
-
[Python] 프로그래머스 2 x n 타일링 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가로 - 세로 길이가 정해져 있기 때문에 DP로 풀 수 있었던 문제다. N 번째 위치에서 가능한 타일링은 가로가 1인 경우(N - 1)와 가로가 2인 경우(N - 2), 총 2가지 이다. 이를 점화식으로 나타내면 아래와 같다. DP[n] = DP[n - 1] + DP[n - 2] 추가로 오버 플로우를 방지하기 위해서, 연산 중간마다 나머지 연산을 진행했다. 이는 나머지 연산의 분배 법칙을 통해 가능하다. # (n x 2) 바닥 채우기 # n 번째 바닥 def solution(n): # 경..
-
Overflow(오버 플로우) 방지하기 : 나머지 연산 활용
문제 상황 코딩 테스트 문제를 풀다 보면, 다음과 같은 조건이 있을 때가 있다. 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요. 위와 같은 조건은 숫자가 너무 커져 발생하는 오버 플로우를 방지하기 위함이다. 하지만 최종 값에만 나머지 연산을 적용할 경우 여전히 오버 플로우가 발생할 때가 있다. # (n x 2) 바닥 채우기 # n 번째 바닥 def solution(n): # 경우의 수 저장 DP = [1, 2] for i in range(2, n): DP.append(DP[i - 2] + DP[i - 1]) return DP[n - 1] % 1000000007 # 최종 값에만 나머지 연산을 적용할 경우 이럴 땐 연산 과정 중간 중간 나머지 ..
-
asyncio의 RuntimeError: Event loop is closed 오류 해결 방법
원인 Python 3.8 이후 부터, 윈도우는 타 운영체제랑 다른 EventLoop를 기본 값으로 활용한다고 한다. 타 OS 기본 : SelectorEventLoop 윈도우 기본 : ProactorEventLoop 해결 방법 아래 코드를 입력해, 윈도우의 EventLoop를 SelectorEventLoop로 변경하면 된다. asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) 주의 사항 윈도우는 I/O Completion Ports를 활용해 비동기 처리 하기 때문에, SelectorEventLoop로 변경 시 아래와 같은 제약이 있다고 한다. 제약이 문제가 될 경우, Trio 라는 별도의 라이브러리를 사용하는 것이 좋다고 한다. ..
-
[Git] 히스토리에서 파일 이름 변경 정보 확인하기
사용 방법 git log --follow --patch 파일명 실행 결과 git log --follow 파일명 만 활용한 경우 파일 이름이 어떻게 변했는지 확인할 수가 없다. git log --follow 2_바이러스.py >> commit d2b40f8af3740a54298d2212a91e442ba84592df Author: ~ Date: Wed Feb 15 21:34:14 2023 +0900 [Rename] : solved, retry 폴더로 구분 commit e4929ce94ceae2f22d77f2a4ff0a21cff117691a Author: ~ Date: Tue May 17 16:52:44 2022 +0900 Add : 2_바이러스.py git log --follow --patch 파일명 을 활..
-
[Python] 프로그래머스 모음사전 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 단어의 최대 길이가 5 이하라서, 가능한 모든 단어를 모아 미리 사전을 구성해도 시간 초과가 발생하지 않을 것이라고 판단했다. 경우의 수 : $6^5 = 7776$ 단어 사전을 구성하기 위해서 중복 순열 product를 이용했고, 중복을 방지하기 위해서 set 자료형을 활용했다. # 길이 5 이하의 단어 # 중복 순열 만들어도 시간 초과 X from itertools import product def solution(word): word_dic = set() for p in product..
-
[Git] 예전에 commit한 파일 Github에서 확인하기
사용 방법 Github의 주소의 일부분을 확인하고 싶은 시점의 commmit id로 변경한다. 변경은 blob/commit-id/파일명 형식으로 하면 된다. 기존 주소 : main 의 파일 확인 예시 : https://github.com/github/codeql/blob/main/README.md 주소 변경 : 이전 commit의 파일 확인 예시 : https://github.com/github/codeql/blob/b212af08a6cffbb434f3c8a2795a579e092792fd/README.md 원리? Git은 파일 변경 히스토리를 blob에 담고, 이를 Tree가 가리키는 방식으로 버전을 관리한다. 최종적으로 Tree를 사용자의 Commit이 가리키도록 하여 원하는 시점의 데이터를 확인할 수..
-
[Python] 프로그래머스 [3차] 파일명 정렬 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 파일명에서 HEAD, NUMBER, TAIL을 구분하기 위해서 GROUP을 활용했다. 필요 없는 0 제거하기 int(문자열)을 사용하면, 앞에 있는 필요 없는 "0"을 자동으로 제거해준다. str.lstrip("0")을 활용할 경우, 숫자 "0"도 제거돼 오류가 발생한다. GROUPS 해당 GROUP에 패턴을 찾지 못했다면, group[i] 빈칸을 가지고 있다. 찾지 못한 경우를 위해 예외처리를 하지 않아도 된다. # 파일명에 포함된 숫자를 반영한 정렬 기능 구현 # 숫자 : 0 ~ 99..
-
[Python] 프로그래머스 [1차] 프렌즈4블록 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 제거할 (2 x 2) 박스를 찾기 위해서, 박스의 왼쪽 상위 좌표를 기준으로 완전 탐색했다. 박스 안에 제거할 좌표가 중복되는 것을 방지하기 위해 set 자료형을 활용했다. 제거할 좌표의 성분은 0으로 바꿔주고, 블록을 순회하여 0을 가장 위로 보냈다. # (2 x 2) -> 한번에 제거 -> 판별을 어떻게 할 것인지??? # 왼쪽 상위 좌표 [i, j] 기준 완전 탐색 # 제거된 후 블럭이 내려옴 -> 어떻게 처리 -> 열 별로 맵 탐색 -> 0 나오면 swap... def soluti..
-
[BS4] select()와 find()의 차이점
select() CSS 선택자를 활용해서 HTML 태그를 찾는 방식 더 다양한 조건을 활용해 직관적으로 찾을 수 있음 titles = soup.select("div.cont_thumb > p.txt_thumb") for title in titles: if title is not None: print(title.text) find() HTML 태그를 직접 찾는 방식 cont_thumb = soup.find_all("div", "cont_thumb") for cont in cont_thumb: title = cont.find("p", "txt_thumb") if title is not None: print(title.text) 참고 BeautifulSoup 모듈 find와 select의 차이점 - 복잡한 웹..
-
[Python] 프로그래머스 방문 길이 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 "출발 - 도착", "도착 - 출발" 모두 목적지와 시작점은 다르지만, 같은 길을 지난다. 이 점을 이용해서, 매번 방문 시 마다 "출발 - 도착", "도착 - 출발" 정보를 저장하는 방식을 통해, 처음 걸어본 길의 길이를 파악했다. 다루기 쉽게 시작점을 (5, 5)라고 생각하고 코드를 작성했다. # 이동 처리 def move(d, x, y): if d == "U": if x - 1 >= 0: x -= 1 elif d == "D": if x + 1
-
[Python] 프로그래머스 땅따먹기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 모든 경우의 수를 완전 탐색할 경우, 대략 $4^{100,000}$ 정도의 연산이 필요해 시간 초과가 발생한다. 따라서 다른 방법을 활용해야하고, 나는 DP를 활용했다. 매번 새로운 열만 밟을 수 있기 때문에, 현재 K 번째 열을 밟았다면, 이전엔 [K - 1, K - 2, K - 3]의 열만 밟을 수 있다. 결국 N 행의 K 번째 열을 밟았을 때의, 최대 값을 DP 테이블에 저장하면 문제를 풀 수 있다. DP[n][k] = land[n][k] + max(DP[n - 1][k - 1] +..
-
[OS] 운영체제의 정의와 기능 알아보기
운영체제란? 사용자(다른 소프트웨어)와 하드웨어 사이를 연결하는 역할을 하는 소프트웨어이다. 운영체제는 커널과 시스템 프로그램으로 구성된다. 운영체제를 커널과 시스템 프로그램으로 구분한 것은 메모리를 효율적으로 관리하기 위함이다. 운영체제도 결국 소프트웨어 이기 때문에, 메모리를 효율적으로 사용하는 것이 중요하다. 이를 위해서 운영체제 중 가장 중요한 일부의 부분(기능)만 항상 메모리에 적재해 두고 이를 커널(Kernel)이라고 부른다. 반대로 필요에 따라 그때마다 활용되는 기능들은 시스템 프로그램(System Program)이라고 한다. 운영체제의 기능 운영체제는 사용자와 하드웨어 사이를 효율적이고, 편리하게 연결 시키기 위해 다양한 기능을 제공한다. 기능을 통해 사용자가 원하는 작업을 간단하게 할 수..
-
[Python] 프로그래머스 스킬트리 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 스킬 트리만 만족하면 되기 때문에, 관련 없는 다른 스킬들은 확인하지 않아도 된다. 스킬 트리에 포함되는 스킬만 추출해서, 스킬을 찍은 순서를 확인하고 이것이 스킬 트리와 동일한 지 확인하면 된다. # 선행 스킬? 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬 # 중복이 없으니까, 필요없는 문자열 제거하면 될듯! import re def solution(skill, skill_trees): # 가능한 스킬 트리 개수 cnt = 0 # 확인할 스킬 정보 : 스킬 트리만 만족하면 되기 때문..
-
[Python] 프로그래머스 할인 행사 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 10일 동안의 할인 품목이, 원하는 품목과 동일할 경우에만 멤버십에 가입한다. 할인 품목의 개수 정보를 얻기 위해서 Counter를 사용했다. # 10일 동안 회원 자격 # 회원 : 하루 1 개만 # 10일 연속 일치할 경우에 가입 ! from collections import Counter def solution(want, number, discount): best_day = 0 want_number = dict(zip(want, number)) # 언제 가입하면 좋을 지 확인 for ..
-
[Python] 프로그래머스 오픈채팅방 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 마지막에 설정한 이름에 따라 기존 메시지는 전부 바뀌게 된다. 반복문을 통해 uid와 마지막 이름 사이 Hash를 구성하고, 이후 f-string을 통해서 출력했다. $2 * O(N)$ 정도의 시간 복잡도를 가지기 때문에, 시간 초과 없이 처리할 수 있다. # 입장 : 닉네임이 들어옴 -> 퇴장 : 닉네임님이 나감 # 닉네임 변경 방법 : 채팅방 나간 후, 새로운 닉네임으로 다시 들어감 / 채팅방에서 닉네임 변경 # 변경 -> 기존 출력 메시지 닉넴도 변경 # 유저 구분 -> uid 활용..
-
[OS] Burst(버스트)와 Bound(바운드) 알아보기
Burst(버스트) 버스트는 '한 작업을 연속적으로 처리하는 것'으로, 보통 작업 처리에 필요한 시간을 의미한다. 따라서 CPU(I/O) 버스트는 각각 CPU 명령 수행과 I/O(입출력 요청) 처리까지 걸리는 시간이라고 이해하면 된다. 프로그램은 CPU 버스트와 I/O 버스트가 번갈아가며 반복되는 방식으로 실행된다. I/O 버스트의 특징 I/O 버스트의 경우, 기본적으로 장치의 속도가 느리고, 추가로 커널 요청 작업까지 필요하기 때문에, CPU 버스트에 비해 상대적으로 긴 시간이 소요 된다는 특징이 있다. 실제로 I/O는 아래와 같은 복잡한 Cycle로 처리된다. CPU 버스트의 양상 CPU 버스트는 주로 CPU가 실행이 많이 필요한 작업을 수행할 때나, I/O 처리를 요청할 때 수행된다. I/O 요청 ..
-
[Python] 프로그래머스 주차 요금 계산 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 들어온 차는 나가지 않으면 23 : 59에 나간 것으로 가정한다. 이 경우 들어오고, 나간 시간의 차이를 구하는 것은 23:59 분과 현재 시각 사이 차를 구하는 것과 동일해진다. OUT과 IN을 서로 다른 기호를 가지도록 더해주면 결국 주차장에 머무른 총 시간을 구할 수 있다. # 차량별 주차 요금 계산 # 00:00 ~ 23:59 까지 누적으로 처리 -> 요금 일괄 정산 # 다음날 출차는 고려 X # 요금 계산 시 '올림' 처리 # 차량 번호가 작은 자동차부터, 차례대로 return!..
-
[Python] 프로그래머스 [3차] n 진수 게임 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 숫자들을 미리 N 진법으로 변환한 뒤, 대답 여부는 1 글자 씩 읽어서 확인했다. 튜브가 대답할 순서는 나머지를 통해서 확인했다. # 10 이상 부터는, 한 자리씩 말하기! # 자신이 말해야할 번호만 출력하면 됨 # n 진법으로 변환하기 def get_nbase(n: int, i: int) -> str: nbase = "" over_10 = {10 : "A", 11 : "B", 12 : "C", 13 : "D", 14 : "E", 15 : "F"} while i: q, r = divmod..
-
[Python] 프로그래머스 더 맵게 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가장 덜 매운 두 음식을 고르기 위한 방법으로 우선, 정렬을 생각해볼 수 있다. 하지만 K는 10억이라 정렬의 횟수가 많아지기 때문에 시간 초과가 발생할 것이다. 따라서 항상 최소값을 보장할 수 있는, 최소 힙 자료구조를 활용한다. 최소 힙을 이용할 경우, 각 push와 pop은 $\log N$의 시간 복잡도를 가지게 된다. # K가 10억 -> 반복 횟수가 매우 큼 # 100 만의 길이를 계속 정렬한다면 시간 초과가 발생! from heapq import heappush, heappop..
-
웹크롤링에 필요한 HTML, CSS 정보
HTML이란? 웹 페이지의 구조를 나타내기 위한 언어 태그로 구성돼 있음 태그 태그는 시작 태그와 종료 태그로 구성 내용 과 같은 형식 태그엔 추가적으로 속성(Attributes)이 있을 수 있음 내용과 같은 형식 자주 사용되는 태그와 그 역할 태그명 역할 div 구역 나누기 a 링크 h1(h2, h3…) 제목 p 문단 ul, li 목록 태그는 부모 태그와 자식 태그로 구성할 수 있음 아래 코드에선 의 자식 태그가 바로 속성 태그의 별명 : 크롤링 대상의 이름 id : 하나의 태그에만 적용 됨 class : 여러 태그에 적용될 수 있음 태그의 스타일 style : CSS의 속성들을 HTML에서 직접 지정할 때 활용 CSS란? 웹사이트의 디자인을 표시하기 위한 언어 글자 색 변경, 폰트 크기, 가로 세로 ..
-
Github Actions을 활용한 알고리즘 풀이 README 업데이트 자동화
알고리즘 문제를 풀고, 그 코드를 Github에 업로드하고 있다. 하지만 별도의 README 파일을 작성해두지 않아서 굉장히 어수선한 상태이다. 어떤 문제를 풀었고, 또 그 풀이를 어디서 확인할 수 있는지에 대한 정보가 전혀 없기 때문이다. '이제 정리해야지!'라는 생각에 README 파일을 직접 작성하려고 했다. 하지만 파일이 100개가 넘어서 굉장히 귀찮았다. '그냥 복붙 할까'라는 생각이 잠깐 들기도 했지만, 이왕 하는 거 코드로 한번 구현해 보자라는 생각이 들었다. README는 어떻게 작성? README를 통해 '문제 이름', '문제 링크', '풀이 파일 링크', '풀이 성공 여부' 정보를 제공하려고 한다. 현재 파일들의 경로는 baekjoon/solved/*/b1_1004.py(문제 이름)과 ..
-
[짧] Epoch, mini-Batch, Step 헷갈리지 않게 외우기
Epoch 전체 데이터를 모두 학습한 경우를 1 Epoch라고 한다. mini-Batch 전체 데이터를 일정한 크기로 나눠놓은 것으로, 여러 개(N)의 mini-Batch가 1 Epoch를 구성한다. 1 Epoch = mini-Batch $\times N$ Step $\theta$가 업데이트된 횟수로, 일반적으로 많이 활용되는 mini-Batch SGD에선 N과 동일하다.
-
[파이썬] 프로그래머스 피로도 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 던전의 최대 개수는 8개로, 각 던전 방문의 경우의 수는 8! = 40320이기 때문에 완전 탐색만으로도 풀 수 있다. 가능한 던전 방문의 순서를 얻기 위해서, 순열을 활용했다. # 던전 입장 조건 : 피로도 >= 최소 피로도, 던전 입장 후 : 피로도 -= 소모 피로도 # 최소 피로도 >= 소모 피로도 # 최대한 많이 탐험 -> 각 던전은 한번만 가능 # 가능한 경우의 수 : 8! : 40320 -> 완전 탐색으로도 풀 수 있음 from itertools import permutatio..
-
[파이썬] 프로그래머스 [3차] 압축 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 알파벳을 하나씩 더해서 새로운 단어를 만들고, 만약 그 단어가 사전에 없는 경우 저장한다. 이 경우 저장된 단어의 바로 이전 단어가 현재 사전에 중 가장 긴 단어이다. 마지막 단어가 사전에 있는 경우 체크가 되지 않기 때문에, 이를 방지하기 위해서 조건문을 추가했다. # 길이가 1인 모든 단어를 포함 하도록 사전 초기화 -> 알파벳 입력 # 현재 입력과 일치하는 가장 긴 문자열 w 찾기 -> 한 글자씩 더해가면서 있는지 확인 -> 만약 없다면, 새로 등록해야함! # w에 해당하는 색인 번..
-
Argument 때문에 jupyter notebook에서 NoneType 에러가 발생할 경우
원인 파이썬 파일 실행 시 !python3를 사용할 경우 Arguments가 인식되지 않아 NoneType 에러가 발생할 수 있다. !python3 파일명 해결 방법 %run 을 활용해서 파이썬 파일을 실행하자 %run 파일명
-
[파이썬] 프로그래머스 k진수에서 소수 개수 구하기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 정규 표현식을 활용한 풀이 1 : 에라토스테네스의 체 활용 → 시간 초과 작은 진법으로 변환 시, 에라토스테네스의 체로 저장 가능한 범위를 넘기 때문에 테스트 케이스 1을 통과할 수 없다. 100만을 2진수로 표현하면, 21개의 숫자가 필요한데, 그 이전에 분명 11111111111111...과 같은 숫자가 여러 번 나올 것 다양한 패턴을 한번에 확인하기 위해서, 정규 표현식의 Group을 활용했다. # 소수 판별 def get_prime(c): is_prime = [True] * (c ..
-
[파이썬] 프로그래머스 연속 부분 수열 합의 개수 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 성분의 개수($n$)을 늘려가며 부분 수열을 구성하면 되는 문제다. 끝점의 index가 범위를 초과할 경우를 처리해주는 것이 중요하다. 범위 초과 시 위 그림과 같이 표현할 수 있기 때문에 각 수열을 나눠서 합했다. def solution(elements): sum_unique = set() # 성분 개수 for n in range(len(elements)): # 시작점 for i in range(len(elements)): # 배열의 길이 초과할 경우 if n + i > len(elem..
-
[파이썬] 프로그래머스 전화번호 목록 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 처음 풀이 : 시간 초과 발생 접두어의 길이는 '최대 단어 길이 -1' 까지만 가능하다. 길이에 따라서 접두어 후보를 나누고, 이후 비교하는 방식으로 접근하려고 했다. 후보를 나누고, 비교하는 과정이 대략 $O(20 * (50000)^2)$이 되기 때문에 시간 초과가 발생했다. # 접두어 여부 확인 # 접두어? (최대 단어 길이 -1) 까지만 접두어가 될 수 있음 # 접두어 탐색 범위 : 나보다 길이가 더 긴 단어들만 확인 가능 # 길이에 따라서, 접두어 후보를 나누고, 이후 비교하면? ..
-
[파이썬] 프로그래머스 귤 고르기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 귤 k개를 종류를 최소화하면서 구하려면, 많은 개수를 가진 종류부터 차례로 선택하면 된다. 개수를 세기 위해서 Counter를 활용했다. # 귤 k 개 -> 서로 다른 종류 최소화! # Counter 사용 후, 개수 기준 내림차순 정렬 from collections import Counter def solution(k, tangerine): # 귤 종류 수 tan_uniq = 0 # 종류 별 개수 세기 type_cnt = Counter(tangerine) type_cnt = sorted(..
-
[파이썬] 프로그래머스 [1차] 뉴스 클러스터링 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 처음 풀 때는 문제 조건을 제대로 확인하지 않아, 특수 문자 / 공백을 제거해서 풀었다. 이 경우 aa1+aa2와 AAAA12가 동일해지는 문제가 생긴다. 특수 문자 / 공백을 미리 제거 하면 문제가 생기기 때문에, 알파벳 여부를 원소를 만들 때 확인했다. # 자카드 유사도 : (두 집합의 교집합 크기 / 두 집합의 합집합 크기 # 중복 문자에 대해서도 처리 가능 # 둘다 공집합인 경우 -> 1로 정의 from collections import Counter def solution(str..
-
[파이썬] 프로그래머스 n^2 배열 자르기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 $N = 10^7$이기 때문에 2 차원 배열을 선언하고, 각 성분에 값을 할당할 경우 시간 초과가 발생한다. 따라서 별도의 규칙을 찾아서 문제를 풀려고 했는데, 고민해도 생각이 안나서 다른 사람의 풀이를 참고해서 풀었다. 2 차원 행렬을 1 차원으로 펼칠 경우, 각 성분은 n으로 나눈 몫과 나머지로 표현할 수 있다. # n이 크기 때문에, n**2만 해도 시간 초과 발생! # 규칙을 찾아야 함 # 1 2 3 2 2 3 3 3 3 # (0,0) (0,1) (0,2) (1, 0) (1, 1)..
-
[파이썬] 프로그래머스 튜플 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 튜플은 원소의 순서를 고려해야 하기 때문에, 낮은 길이의 튜플부터 확인하면, 입력 순서를 확인할 수 있다. 각 성분으로 구성된 튜플을 얻기 위해서, 정규 표현식을 활용 했다. 숫자가 1번 이상 나오고, 이후 "," 와 숫자가 올 수도, 안 올수도 있도록 정규 표현식을 구성 했다. # 원소의 개수가 n, 중복되는 원소가 없는 튜플 # 튜플은 원소의 순서를 고려해야 함 -> 집합의 개수가 늘어날 수록 1 개 씩 추가 됨 # 이를 통해 튜플 원소의 순서를 알 수 있다! import re def..
-
[파이썬] 프로그래머스 위장 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 한 부위의 옷은 입거나, 안 입은 경우 2 가지만 존재한다. 입을 경우, 현재 부위에 속하는 옷 개수 만큼의 경우가 가능하고, 입지 않는 경우는 1 가지만 있다. 따라서 (현재 부위 옷의 개수 + 1)을 통해서, 모든 위장 경우의 수를 표현할 수 있다. 최소 1 개의 의상은 입어야 하기 때문에, 마지막에 1을 빼주면 전체 경우의 수를 얻을 수 있다. # n, m, k, l # nC1, mC1, kC1, lC1 -> n, m, k에 대한 선택 # 종류가 많은 경우 -> 시간 초과가 발생할 ..
-
[파이썬] 프로그래머스 행렬의 곱셈 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 행렬의 곱을 얻기 위해선 arr1의 행과 arr2 열 사이의 연산이 필요하다. arr2의 열 성분을 얻기 위해서 zip(*arr2)를 활용했다. *arr2를 통해 unpacking을 하면 각 행 별 리스트([] [] [])를 얻을 수 있고, zip을 사용하면 리스트의 n 번째 항 끼리 묶을 수 있다. 각 행의 n 번째 항 끼리 묶은 것은 결국 행렬의 열과 동일하다. # (a x b) * (b x a) = (a x a) # 행 - 열 성분 사이 곱 def solution(arr1, arr2..
-
[파이썬] 프로그래머스 괄호 회전하기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 괄호 회전을 쉽게 하기 위해서 deque.rotate를 활용했다. 올바른 괄호 쌍인지 확인하기 위해서 stack을 활용했다. # 괄호 회전 -> deque.rotate로 구현 # 올바른 괄호 여부 확인 : stack으로! from collections import deque def solution(s): # 올바른 괄호 문자열의 수 answer = 0 # 올바른 괄호 쌍 match = {"[" : "]", "(" : ")", "{" : "}"} # i 만큼 회전 for i in range..
-
[Python] deque의 최대 길이를 지정해서 선언하기
사용 방법 deque 선언 시 maxlen 파라미터에 인자를 전달한다. from collections import deque deque(maxlen = n)
-
[파이썬] 프로그래머스 [1차] 캐시 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 LRU : 가장 오랫 동안 참고되지 않은 캐시부터 제거하는 알고리즘 LRU를 사용하려면 사용 순 → 입력 순으로 정렬하는 캐시가 필요하다. # LRU : 최근에 사용되지 않은 캐시부터 교체 # 사용 순 -> 입력 순으로 정렬 필요 from collections import deque def solution(cacheSize, cities): # 실행 시간 answer = 0 cache = deque() for city in cities: # 대소문자 구분 X city = city.lowe..
-
[파이썬] 프로그래머스 멀리 뛰기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 항상 1칸 또는 2칸만 뛸 수 있기 때문에, 가능한 모든 방법의 수는 $a[n] = a[n - 1] + a[n - 2]$로 표현할 수 있다. 현재 칸에 도달 = 1 칸 전에서 뛴 경우 + 2 칸 전에서 뛴 경우 # 가능한 모든 방법의 수 # a1 = 1 # an = a(n - 1) + a(n - 2) def solution(n): answer = [i for i in range(n + 1)] for i in range(3, n + 1): answer[i] = answer[i - 1] + ..
-
[파이썬] 프로그래머스 점프와 순간 이동 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 나머지를 활용한 풀이 비용을 줄이려면 가능하면 항상 순간 이동을 해야 한다. $n$ 번째 위치는 $n // 2$에서 순간 이동해서 바로 가거나, 순간 이동 후 1 만큼 점프하여 갈 수 있다. 따라서 매번 2 로 나눴을 때, 나머지가 1인 경우에만 비용을 추가하면 된다. def solution(n): answer = 0 while n: q,r = divmod(n, 2) # 점프가 필요할 때 비용 추가 if r == 1: answer += 1 n = q return answer DP를 활용한..
-
[파이썬] 프로그래머스 예상 대진표 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 전체 대진표는 대결하는 두 쌍($0, 1$)과 순서로 표현할 수 있다. 순서는 숫자를 2 로 나눴을 때 몫으로 표현할 수 있기 때문에, $a$와 $b$가 몫이 같을 때 까지 라운드를 반복하면 된다. # 0 1 2 3 4 5 6 7 # 0 1 2 3 # 0 1 def solution(n,a,b): # 1 라운드부터 시작하기 때문에 answer = 1 # 몫 정보로 대결 여부 파악할 수 있도록 변경 # 몫이 같다면 둘이 매칭된 것 a, b = a - 1, b - 1 while a // 2 !..
-
[파이썬] 프로그래머스 N개의 최소공배수 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 N개 수의 최소 공배수를 구하기 위해선, 두 정수 사이 최소 공배수를 구한 다음, 그 최소 공배수와 다음 정수 사이 최소 공배수를 구하면 된다. 기존 최소 공배수가 다른 정수에도 적용 되기 위해선, (최소 공배수 * 상수 배) 형식이어야 하기 때문에 각각 최소 공배수를 구하는 과정에서 최악의 경우, 대략 $(100^2)**14$ 정도의 시간 복잡도가 발생하기 때문에, 유클리드 호제법을 활용해 최소 공배수를 찾았다. 유클리드 호제법을 활용한 최소 공배수, 최대 공약수 구하는 방법은 포스팅에..
-
[파이썬] 프로그래머스 구명보트 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 한 번에 최대 2명을 태울 수 있기 때문에, 최적의 구성은 무거운 사람 + 가벼운 사람을 태울 경우다. 무거운 사람, 가벼운 사람의 무게 합이 제한 무게를 넘는지 확인하기 위해서, 무게 순으로 people을 정렬 했다. 정렬 뒤엔 시작 점과 끝 점을 비교하기 위해서 투 포인터를 활용했다. # 한 번에 최대 2명 # 최적 -> 무거운 사람 + 가벼운 사람 def solution(people, limit): people.sort() answer = 0 # 투포인터 시작 - 끝 점 start,..
-
[파이썬] 순차 접근을 빠르게 : 투 포인터 활용하기
모든 사진과 내용은 강의를 참고 했습니다. 투포인터 2 가지 점(시작, 끝점)의 위치를 기록해서, 순차 접근을 빠르게 할 수 있도록 도와주는 알고리즘이다. 투포인터를 사용하면 기존 $O(N^2)$에서 $O(N)$로 시간 복잡도를 줄일 수 있다는 장점이 있다. 매 시행 마다 투 포인터의 시작, 끝 점은 1개 씩 움직이고, 각 점이 마지막 성분에 도달하면 끝나게 되기 때문에 $O(N)$ 임 활용 1 : 부분 합 구하기 투포인터는 수열의 부분 합을 구하는데 활용될 수 있고, 수열의 모든 수가 양수인 경우에만 가능하다. 모든 수가 양수여야 시작점을 오른쪽으로 옮길 때, 합을 구성하는 성분 수가 줄어 합이 줄어 들고, 끝점을 오른쪽으로 옮겨 부분 합을 구성하는 성분 수가 늘어 합이 늘기 때문이다. 투포인터를 활용..
-
[파이썬] 프로그래머스 카펫 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 노란 박스의 가로, 세로 정보에 따라서 갈색 박스의 정보가 결정 된다. 노란 박스의 가로, 세로는 박스 수의 약수이고, 가로는 그 중에서 큰 값이다. 따라서 노란 박스의 약수를 큰 수 부터 역으로 완전 탐색하면 문제를 풀 수 있다. 탐색 범위에 대해선, 가로의 길이가 세로 길이 보다 크거나 같기 때문에 제곱근 범위 까지만 찾으면 된다. # 노란 박스 정보 : 가로 x 세로 # brown = ((가로 + 2) * 2 + 세로 * 2) def solution(brown, yellow): an..
-
[파이썬] 프로그래머스 영어 끝말잇기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 중복 여부를 확인하기 위해서 set()을 사용했고, 그에 따라 마지막 단어를 확인하는 변수도 활용했다. words의 길이가 50 정도로 작은 편이기 때문에, 리스트를 사용해서 마지막 단어, 중복 여부 확인을 동시에 하는 것이 더 좋았을 거 같다. # 정답 : (먼저 탈락하는 사람의 번호, 몇 번째 차례에 탈락) def solution(n, words): answer = [0, 0] # 중복 단어 체크 word_set = set() last_word = "" # 끝말잇기 시작 for idx..
-
경사 하강법이 Gradient의 반대 방향으로 진행되는 이유
Intro Gradient descent(경사 하강법)은 최적화 기법 중 하나로, 손실 함수를 최소화하기 위해서 사용된다. 경사 하강법에선 효과적으로 $\theta$ 를 변화시키기 위해, 가장 가파른 경사 방향으로 $\theta$ 를 업데이트한다. 이때, 가장 가파른 경사일 때의 방향이 Gradient 방향 일 때 이므로, $\theta$ 는 Gradient의 반대 방향으로 업데이트된다. 누군가 나에게 경사 하강법을 간단하게 설명하라고 하면, 아마도 위에 적은 것처럼 말할 거 같다. 근데 저 설명을 듣는 입장에선, 아마도 왜 가장 가파른 경사일 때의 방향이 Gradient 방향이고, 왜 Gradient의 반대 방향으로 $\theta$ 가 업데이트 돼야 하는 지에 대해서 의문이 생길 거 같다. 그래서 위와..
-
Hypothesis Test(가설 검정)의 오류와 Critical value(임계값) 사이 관계 확인하기 Feat. 검정력, 유의 수준
검정의 오류? 가설 검정 과정에서 가설은 2 가지이고, 이는 Null Hypothesis(귀무 가설 : $H_0$)과 Alternative Hypothesis(대립 가설 : $H_A$)이다. $H_A$의 이름이 대립(대안)인 것은 $H_0$와의 관계 때문이다. 가설 검정의 중심은 $H_0$이다. 검정 결과에 따라 $H_0$를 기각하거나, 기각하지 못하냐 딱 2 가지이다. 이에 따라 $H_A$가 채택될 수도, 아닐 수도 있다. $H_0$을 중심으로 생각해보면, 가설 검정 시 발생할 수 있는 오류는 2 가지 이다. 제 1종 오류 : $H_0$가 참인데도, $H_0$을 기각한 경우 제 2종 오류 : $H_0$가 거짓인데도, $H_0$을 기각하지 않은 경우 = $H_A$가 참인데도, $H_A$을 채택하지 않은 ..
-
Hypothesis Test(가설 검정)과 Null hypothesis(귀무 가설), p - value 사이 관계 알아보기
Hypothesis Test(가설 검정)? Population(모집단)에 대한 어떤 특성(가설)을 주장하고 싶어도, 그 모집단을 직접 확인할 수 없는 상황이 대부분이다. 따라서 이럴 땐 Sample(표본)을 참고할 수밖에 없다. 하지만 표본은 모집단으로부터 랜덤하게 얻은 것이기에, 그 주장이 타당한 지 항상 고민해야 한다. 표본으로 모집단의 특성을 주장(가설)할 땐, 그 가설이 얼마나 타당한 지 확인하기 위한 작업이 필요하고 이를 가설 검정이라고 한다. 이때 가설 검정의 타당성은 p - value를 사용해 확률의 개념으로 표현한다. 검정의 타당성을 확률로 접근하는 이유는, 표본이란 모집단 입장에선 랜덤하게 추출된 것 중 하나에 불과하기 때문이다. 표본으로 인해 모집단에 대한 잘못된 판단을 내리지 않으려면..
-
[파이썬] 프로그래머스 다음 큰 숫자 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 완전 탐색을 활용해서 풀었다. 이 경우 시간 복잡도는 $N$ * $((\log C + C)) \times C$이다. $C$가 대략 $\log_{2}{10^6} = 20$ 정도라서 시간 초과가 발생하진 않는다. # 다음 큰 숫자 : 'n보다 크고, 2 진수 표현에서 1의 갯수가 같은 수' 중에서 가장 작은 숫자 # 시간 복잡도 : n * ((logc + c) * c) def solution(n): n_cnt = bin(n)[2:].count("1") check = n + 1 while Tr..
-
[파이썬] 프로그래머스 숫자의 표현 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 i, j를 각각 연속된 수의 시작과 끝으로 생각하면, 각 i 마다의 j를 찾으면 문제를 풀 수 있다. 합을 구하는 과정에서 동일한 연산이 계속 반복되기 때문에, 누적합을 미리 계산했다. def solution(n): answer = 0 # 누적합 cum_sum = [] for i in range(10001): cum_sum.append((i * (i + 1) // 2)) # 확인 for i in range(10001): for j in range(i + 1, 10001): if cum_s..
-
[파이썬] 프로그래머스 JadenCase 문자열 만들기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 문제 조건에 띄어쓰기가 여러 개 있을 수 있다고 나와서, 그냥 문자 단위로 확인했다. upper, lower 함수는 숫자가 섞여 있더라도, 문자에만 영향을 준다 def solution(s): answer = "" word = "" for char in s: if char == " ": answer += (word + " ") word = "" else: if not word: word += char.upper() else: word += char.lower() # 마지막 부분 answer..
-
[파이썬] 프로그래머스 개인정보 수집 유효기간 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 날짜 정보를 간단하게 처리하기 위해서 '일' 단위로 변경하여 문제를 풀었다. 2 중 리스트를 zip하기 위해서 *를 사용했다. def cnt_day(day: str) -> int: # 날짜 정보를 '일' 단위로 변경하는 함수 day = day.split(".") day = int(day[0]) * 12 * 28 + int(day[1]) * 28 + int(day[2]) return day def solution(today, terms, privacies): answer = [] # 비교하..
-
[파이썬] 프로그래머스 햄버거 만들기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 처음엔 str.replace(, , 1)를 활용해서 풀려고 했다. 이 경우 $O(N^2)$의 시간 복잡도를 가지기 때문에 시간 초과가 발생한다. def solution(ingredient): answer = 0 food = list(map(str, ingredient)) food = "".join(food) while food: # 한번에 1개의 문자열만 교체할 수 있도록 1을 설정 했다. temp = food.replace("1231", "", 1) if food == temp: bre..
-
[파이썬] 프로그래머스 문자열 나누기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 분리 전 문자열을 word 변수를 활용해서 관리했다. def solution(s): answer = 0 word = "" # 개수 세기 x_cnt, y_cnt = 0, 0 for char in s: # 새로운 단어 생성 if not word: word += char x_cnt += 1 continue # 글자 확인 if char == word[0]: x_cnt += 1 elif char != word[0]: y_cnt += 1 # 문자열 분리 if x_cnt == y_cnt: answer..
-
[파이썬] 프로그래머스 옹알이 (2) 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 문자열을 완전 탐색해 정해진 패턴을 찾는 방식으로 문제를 풀었다. 이전 패턴과 겹치는지 여부를 확인하기 위해서 idx를 활용했다. def solution(babbling): answer = 0 for bab in babbling: # 비교할 문자열 temp_c = "" # 이전에 나온 단어 확인 prev_idx = -1 for c in bab: temp_c +=c # 못 찾은 경우 중단 if len(temp_c) > 4: break # 체크 시작 for idx, word in enumer..
-
[FSDL 정리] 머신러닝 프로젝트 테스트(Testing) 하기 : 시스템 영역
ML 시스템 Testing 머신러닝의 경우 일반적인 소프트웨어 프로그램보다 Testing이 어렵다. 소프트웨어는 소스 코드를 프로그램으로 바꾸는 것이 주목적이지만, 머신러닝의 경우 추상적인 데이터와 모델을 활용하기 때문이다. 실제로 소스 코드 관리보다는 데이터를 관리하는 것이 추상적이고 난도가 높다. 또한 모델 학습 과정은 잘 정의되지 않아 복잡한 경우가 많고, 관련 디버깅 툴도 부족한 상황이다. 따라서 ML 시스템에선 주요 기능이 정상적으로 동작하는지 간단히 확인하는 Smoke test 기법을 주로 활용한다. Smoke test : 데이터 확인하기 데이터가 원하는 형태(null 값 여부, 칼럼 여부 등)로 잘 있는지 확인한다. 과정에서 상태를 기록하는 리포트를 작성하거나, 알림을 보낼 수 있도록 설정한..
-
[파이썬] 프로그래머스 기사단원의 무기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 약수의 개수는 약수의 정의와 소인수 분해의 성질로 확인할 수 있다. 약수(소인수)를 찾기 위해서 1(2) ~ N까지 전부 확인할 경우, 시간 복잡도는 $O(N^2)$이 돼 시간 초과가 발생한다. 약수(소인수) 탐색은 $\sqrt N$ 만큼만 확인해도 되는 점을 활용하면, 시간 복잡도를 $O(N\sqrt N)$으로 줄일 수 있다. from collections import defaultdict # 성분의 곱을 계산할 수 있다. from math import prod # 약수 개수 구하기 1..
인기 글
-
R^2(결정 계수, Coefficient of Determination) 알아보기
$R^2$(결정 계수)란? $R^2$(결정 계수)는 회귀 모델의 성능 평가 지표로, Dependent Variable(종속 변수) $y$의 총 변동(분산)을 회귀 모델 $wx$로 표현할 수 있는 정도를 나타낸다. 이를 수식으로 나타내면 다음과 같다. $$ R^2 = \frac{\sum(\hat{y_i}-\bar{y})^2}{\sum(y_i-\bar{y})^2} $$ 식에선 분모, 분자 모두 $\bar{y}$를 기준으로 분산을 측정한다. 이때 $\bar{y}$는 $y$의 평균이면서, 동시에 회귀 모델 $wx$와 관련 없는 Naive한 예측이다. 따라서 결정 계수는 $y$의 분산을 현 모델로 얼마나 나타낼 수 있는지 알려주는 지표면서, 동시에 Naive한 예측($\bar{y}$) 대비 모델($\hat{y}$..
-
Anaconda 환경에서 pip 사용하기
Anacoda에서 pip? Anaconda 환경에선 기본적으로 conda install을 이용해서 패키지를 설치한다. 하지만 원하는 버전의 패키지가 conda에 없는 경우가 있으면 pip install을 사용해야 한다. pip install로 패키지를 설치하면 base 환경에 설치돼 가상 환경 분리가 안된다는 단점이 있다. 이럴 때 가상 환경에 먼저 pip를 설치하고, pip install을 적용하면 사용 중인 환경에만 패키지가 설치된다. 현재 가상 환경에 pip 설치 하기 conda install pip 가상 환경을 만들 때 부터 pip를 설치하려면 다음과 같은 명령어를 사용하면 된다 conda create -n 이름 pip 예시 임의로 test라는 가상 환경을 만든 뒤 확인해보자. (base) ~/a..
-
[Network] Hub(허브, L1), Switch(스위치, L2), Router(라우터, L3), 공유기(L4) 차이점 알아보기
허브(더미 허브) : L1 장비 L1(Physical Layer)에서 동작하며 멀티 포트를 통해 여러 컴퓨터 및 네트워크 장비들을 연결해주는 장치이다. 신호를 증폭해주는 리피터이기도 하다. 허브는 L1 장비라서 통신 시 목적지로서 활용할 수 있는 MAC, IP 정보가 없다. 따라서 통신 시 모든 장비에게 데이터를 전송하게 된다. 결국 허브 내 장비가 많아지면 그 만큼 대역폭에서 손해를 보게 되는 구조이다. 스위치 : L2 장비 L2(Data-Link Layer)에서 동작하며 Frames(프레임)의 MAC 주소를 참고해 해당하는 장비에 데이터를 전달해주는 장치이다. 스위치는 해당 네트워크의 MAC 주소를 테이블로 저장하고 있는데, 입력된 프레임의 MAC 주소가 테이블에 없을 경우는 허브와 동일하게 모든 장..
-
Hydra 사용법 정리
Hydra? configuration을 모듈로 세분화하여 관리 가능 미리 정의한 configration을 hydra 환경에서 사용 실행된 hydra 환경에서의 실행 기록을 outputs/날짜/시간/.hydra/config.yaml 에 저장 어떤 configuration을 사용했는 지 모두 기록해 실험 관리에 도움 ├── outputs │ └── 2022-06-19 │ └── 19-23-30 │ ├── .hydra │ └── config.yaml | └── ... MNIST 분류 문제를 해결하는 경우 다음과 같이 config 구성 가능 Configuration 구성 모듈별 폴더를 생성해 configuration 구성 model에서 처럼 다양하게 구성해뒀다가 실험 환경에 맞게 변경 가능 ├── configs..
-
Affine 변환과 딥러닝
변환 → 공간을 변형 직선과 평형성을 그대로 유지하는 변환을 Affine 변환이라고 한다. Affine 변환의 일반식은 `Wx + b` 이며, 이는 Linear Transformation에 Traslation 항이 추가된 형태이다. Affine 변환의 전 - 후 과정을 시각화하면 다음과 같다. 위 그림을 보면 변환에 의해 격자 전체가 함께 이동한다는 것을 확인할 수 있다. 이처럼 변환에 의해 모든 점이 영향을 받아 이동하는 것은, 공간(Space)이 변형되는 것처럼 생각할 수 있다. 이 경우 변환의 역할이 공간을 변형시키는 것이라고 해도 무방할 것이다. 멀쩡한 공간을 굳이 변형하는 이유는 당연하게도 어떤 이득이 있기 때문이다. 실제로 변환에 의해 새롭게 얻은 공간에선, 기존에 풀지 못했던 문제를 해결할 ..
-
목적 함수(Objective function)와 최적화(Optimization)
목적 함수란? 머신러닝 모델의 평가지표는 손실(Loss)함수, 비용(Cost)함수, 목적(Objective) 함수 등 다양한 이름으로 불림 손실, 비용, 목적 함수의 명칭에 대해선 정확한 정의는 없지만 일반적으로 다음과 같이 생각하면 편함 A loss function is a part of a cost function which is a type of an objective function. 출처 결국 머신러닝 모델은 손실, 비용 함수는 줄이려고(minimise) 하며 목적 함수는 최적화(optimise)하려고 함 최적화하고 싶은 목적 함수는 최적의 모델을 확률 관점에서 볼 지 error 최소화 관점에서 볼 지에 따라서 다름 확률 관점에선 목적 함수를 최대화하고 싶어하고(Maximum Likelihood..
-
Classification Metrics(분류 모델 지표 ) 알아보기 : TPR, FPR과 ROC Curve 사이 관계 및 AUC
TPR, FPR → Positive 판단에 따른 성공, 실패 여부 True Positive Ratio(=Recall) : $\frac{TP}{TP+FN}$ 실제 Positive(양성)을 얼마나 정확히 분류 했는지 False Positive Ratio(=Fallout) : $\frac{FP}{TN + FP}$시 실제 Negative(음성) 중 잘못 분류한 비율 TPR, FPR 모두 Positive(양성) 판단에 따른 성공, 실패 여부를 다룸 이때 성공-실패 여부는 Positive(양성) 판단의 기준이 될 Threshold를 어떻게 설정 하느냐에 따라 다른 결과가 나오게 됨 ROC와 AUC? ROC : Positive 예측 시 Threshold 별 양상을 확인하기 위해, FPR을 x 축으로, TPR을 y 축..
-
2중 공유기 WOL/DDNS 설정
WOL이란? WOL(Wake On Lan)은 문자 그대로 Lan(인터넷)을 통해 PC를 부팅시킬 수 있는 기능이다. 원격 접속할 PC를 부팅하는데 활용할 수 있다. PC의 메인보드와 공유기 모두가 WOL을 지원해야지만 사용할 수 있는 기능인데, 다행히 대부분의 제품에서 지원하고 있다. WOL은 Magic Packet(매직 패킷)이라는 프레임을 통해 원하는 PC를 부팅시킬 수 있다. 이를 위해선 부팅하고 싶은 PC의 고유 주소를 프레임의 목적지로 제공해야 한다. 이때 활용되는 고유 주소가 바로 MAC이며 랜카드(NIC)에 귀속되는 고유한 값이다. 매직 패킷은 공유기 내 모든 통신 장비에 전달되고 이를 랜카드가 확인하면 PC를 부팅한다. 매직 패킷은 위 그림과 같이 FF FF FF FF FF FF에다 추가로..
-
[OOP] OOP(객체 지향 프로그래밍)의 개념과 특징 알아보기
OOP란? 필요한 데이터를 추상화하여 속성(Attributes)와 행위(methods)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이다. 데이터를 중심으로 필요한 기능을 함수로 구현하는 방식의 절차 지향 프로그래밍과 달리, OOP에선 데이터와 함수들을 묶고 이를 객체로 관리한다. 객체라고 하면 뭔가 말이 어렵고 한데, 그냥 우리가 일반적으로 사용하는 언어 구조와 비슷하다고 생각하면 이해하기 쉽다. 위 그림을 예시로 들면 우선 데이터는 '돈', '잔돈', '제품'이다. 앞서 절차 지향에선 데이터(돈, 잔돈, 제품)를 행위와 별도로 생각한다고 했다. 그래서 절차 지향에선 데이터에 대한 모든 행위를 '~돈을 ~', '~잔돈을~', '~제품을~'의 식으로 표..
-
Gradient Checkpointing이란
GitHub - cybertronai/gradient-checkpointing: Make huge neural nets fit in memory Make huge neural nets fit in memory. Contribute to cybertronai/gradient-checkpointing development by creating an account on GitHub. github.com 모든 사진과, 글은 위의 링크를 참조했습니다. Graident checkpointing? GPU 사용 시 사용 가능한 메모리를 늘리기 위한 방법 중 하나이다. 이를 통해 연산 시간이 늘어나는 대신, 메모리 사용량 이 줄어든다. 아래 그래프는 ResNet 모델에서 최대 메모리 사용량을 비교했는데 blocks(N)..
-
Independent(독립)와 Uncorrelated(상관 관계 없음) 알아보기
Independent(독립) 두 랜덤 변수의 Joint Probability(결합 확률)가 각 변수의 Marginal Probability(주변 확률)로 표현되는 경우를 의미한다. $$ P(X,Y)=P(X)P(Y) $$ Uncorrealted(상관 관계 없음) 두 랜덤 변수 사이 Correlation 관계가 없음을 의미하며, Correlation ($\rho_{X, Y}$) 가 0 인 경우이다. Correlation ($\rho_{X, Y}$) 은 두 변수 사이 선형적 관계를 보여주는 지표로, Covariance(공분산)을 각 변수의 표준 편차로 정규화한 값이다. $$ \begin{align*}\rho_{XY} &= \mathbf{E}\left[\frac{X-\mathbf{E}[X]}{\sqrt{\mat..
-
[파이썬] 최소 공배수, 최대 공약수 구하기
완전 탐색 활용 최대 공약수(GCD) : O(N)의 시간 복잡도 최소 공배수(LCM) : O(N*M)의 시간 복잡도 n, m = map(int, input().split()) # 최대 공약수 for i in range(max(n, m), 0, -1): if n % i == 0 and m % i == 0: print(i) break # 최소 공배수 for i in range(min(n, m), n * m + 1): if i % n == 0 and i % m == 0: print(i) break 유클리드 호제법 : 최대 공약수를 빠르게! 유클리드 호제법을 사용하면 최대 공약수를 재귀적으로 구할 수 있다. 이 경우 최대 공약수를 구하기 위해 필요한 시간 복잡도는 O(logN)이다. 유클리드 호제법은 다음과 같..
-
Cosine Similarity(코사인 유사도)와 Euclidean Distance(유클리드 거리) 알아보기
Intro 인공지능이 주어진 문제를 해결하기 위해서는 Feature(특성)을 적절하게 숫자로 변환해주어야 합니다. 특성을 성공적으로 숫자로 변환하는데 성공했다고 가정한다면, 특성은 벡터의 형태로 표현할 수 있습니다. 서로 다른 두 특성 벡터 사이의 관계를 분석하기 위해선 여러 기준이 있습니다. 이번 포스팅에선 그 중에서 많이 활용되는 Cosine 유사도와 Euclidean 거리에 대해서 알아보겠습니다. Cosine 유사도 코사인 유사도는 두 벡터의 내적을 벡터의 크기로 정규화하여 구하기 때문에, 두 벡터 사이 각도에 초점이 맞춰져있습니다. 따라서 각 Feature의 값 편차가 클 경우 효과적으로 사용할 수 있는 지표입니다. Euclidean(유클리드) 거리 유클리드 거리는 두 벡터 사이 차 성분을 제곱한..
-
[Python] 프로그래머스 택배상자 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 기존 컨베이어 벨트와 보조 컨베이어 벨트를 각각 Queue와 Stack으로 만든 뒤, 주어진 조건에 만족하도록 구현했다. # 1 ~ n 까지의 택배를 재 배열 # 기존 컨베이어 : queue -> 작은 수부터 빼낼 수 있음 # 보조 컨베이어 : Stack -> 큰 수부터 빼낼 수 있음 # 몇 개의 상자를 실을 수 있는지 # order의 상자가 나올 때 까지 pop from collections import deque def solution(order): order = deque(order..
-
asyncio의 RuntimeError: Event loop is closed 오류 해결 방법
원인 Python 3.8 이후 부터, 윈도우는 타 운영체제랑 다른 EventLoop를 기본 값으로 활용한다고 한다. 타 OS 기본 : SelectorEventLoop 윈도우 기본 : ProactorEventLoop 해결 방법 아래 코드를 입력해, 윈도우의 EventLoop를 SelectorEventLoop로 변경하면 된다. asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) 주의 사항 윈도우는 I/O Completion Ports를 활용해 비동기 처리 하기 때문에, SelectorEventLoop로 변경 시 아래와 같은 제약이 있다고 한다. 제약이 문제가 될 경우, Trio 라는 별도의 라이브러리를 사용하는 것이 좋다고 한다. ..
-
[Seaborn] Figure 하나에 Graph 여러 개 그릴 때 Legend 표시하기
plot 할 때 원하는 label을 지정 Legend에 표시하고 싶은 내용을 label 인자에 입력해주면 된다. d10_ft = check3[(check3['choice'] == 1)&(check3['decile'] == 10)]['TOTL_SQ_FT_CNT'] d1_ft = check3[(check3['choice'] == 1)&(check3['decile'] == 1)]['TOTL_SQ_FT_CNT'] f, ax = plt.subplots(1, 1) sns.distplot(d10_ft, label = 'decile 10',ax=ax) sns.distplot(d1_ft, label = 'decile 1',ax=ax) ax.legend() 참고 How to add legend to seaborn mult..
-
[Python] 프로그래머스 모음사전 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 단어의 최대 길이가 5 이하라서, 가능한 모든 단어를 모아 미리 사전을 구성해도 시간 초과가 발생하지 않을 것이라고 판단했다. 경우의 수 : $6^5 = 7776$ 단어 사전을 구성하기 위해서 중복 순열 product를 이용했고, 중복을 방지하기 위해서 set 자료형을 활용했다. # 길이 5 이하의 단어 # 중복 순열 만들어도 시간 초과 X from itertools import product def solution(word): word_dic = set() for p in product..
-
[파이썬] Type hint 사용법
Python에도 Type을 써야 하나? Python은 동적 타이핑 언어기 때문에 함수 및 클래스의 parameter type을 명시해주지 않아도 된다. 따라서 C++의 templates나 JAVA에서의 generic 없이도 함수 및 클래스를 type에 상관없이 재사용할 수 있다. C++로 예를 들면 template을 통해서 type을 임의로 선언해뒀다가 호출 시에는 type을 명시해줘야 한다. 이는 template으로 임시로 부여한 type을 대신할 명시적인 type을 입력하는 것으로 정적 타이핑 언어인 C++에선 필수적이다. #include #include using namespace std; template T sum(T a, T b){ // template으로 임의 type 할당 return a +..
-
[파이썬] Interpreter(인터프리터) 알아보기
Python(파이썬)의 Interpreter(인터프리터) 확인하기 파이썬은 인터프리터 언어라고 알려져있다. 따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다. 하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다! 컴파일러에 대한 오해 해결하기 컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어를 low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다. 실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다. 1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compil..
-
Sampling(표본 추출) 방식 별 특징과 추출법 결정 시 고려 사항
Probability Sampling(확률 표본 추출) Simple Random Sampling(무작위 추출법) 모집단 전체에 일련 번호(실제 혹은 개념적)를 부여하고, 랜덤하게 추출하는 방식 장점 추출 확률이 동일하기 때문에, 표본의 대표성이 크고, 오차 개입 여부가 적음 모집단에 대한 사전 지식 불필요 단점 대규모 표본일 때 효과적임 모집단에 대한 사전 지식을 활용할 수 없고, 표본 프레임(모집단 목록)을 파악하기 어려움 Stratified Sampling(층화 추출법) 모집단을 서로 겹치지 않는 여러 개의 ‘층’으로 쪼갠 뒤, 각 ‘층’에서 무작위로 추출하는 방식 ‘층’ 마다의 개수를 고려해 추출한다면, 비례 층화 추출 장점 집단을 ‘층’으로 관리해 빼놓지 않고 표본에 포함 시킬 수 있음 대표성이 ..
-
Docker 환경에서 ImportError: libGL.so.1: cannot open shared object file: No such file or directory 발생 시 해결 방법
문제 상황 opencv를 포함한 Docker 이미지를 만들 때 cv2의 의존 패키지가 없을 때 발생한다. 해결 방법 의존 패키지를 추가로 설치하거나 opencv-python-headless과 같이 애초에 서버용으로 제작된 라이브러리를 활용하자. opencv-python-headless 사용하기 RUN pip3 install opencv-python-headless 의존 패키지 직접 설치하기 RUN apt-get update && apt-get install libgl1-mesa-glx -y RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y 참고 ImportError: libGL.so.1: cannot open shared object fil..
-
Bias - Variance 이해하기
Intro 지도 학습 모델의 성능을 확인할 때는 과대 적합이나 과소 적합 여부를 정확하게 파악해야, 올바른 방법으로 모델을 개선할 수 있습니다. 과대 적합, 과소 적합은 Bias(편향)와 Variance(분산)과 깊은 관련이 있기 때문에 우선 편향과 분산을 이해하는 것이 중요합니다. 이번 포스팅에선 편향과 분산을 이해를 돕기 위한 내용을 정리했습니다. Bias - Variance? 먼저 그림을 통해서 편향과 분산에 대해서 이해해 봅시다. 그림에선 과녁의 중심과 다트 사이의 거리가 멀면 편향이 높다고 합니다. 또한 각 다트 사이의 거리가 멀게 되면 분산이 크다고 말합니다. 다트를 던지는 행위를 예측이라고 해봅시다. 이때 각 다트들의 위치는 곧 예측값이, 과녁의 중심은 실제값이 됩니다. 이를 통해 편향과 분..
-
Github Actions을 활용한 알고리즘 풀이 README 업데이트 자동화
알고리즘 문제를 풀고, 그 코드를 Github에 업로드하고 있다. 하지만 별도의 README 파일을 작성해두지 않아서 굉장히 어수선한 상태이다. 어떤 문제를 풀었고, 또 그 풀이를 어디서 확인할 수 있는지에 대한 정보가 전혀 없기 때문이다. '이제 정리해야지!'라는 생각에 README 파일을 직접 작성하려고 했다. 하지만 파일이 100개가 넘어서 굉장히 귀찮았다. '그냥 복붙 할까'라는 생각이 잠깐 들기도 했지만, 이왕 하는 거 코드로 한번 구현해 보자라는 생각이 들었다. README는 어떻게 작성? README를 통해 '문제 이름', '문제 링크', '풀이 파일 링크', '풀이 성공 여부' 정보를 제공하려고 한다. 현재 파일들의 경로는 baekjoon/solved/*/b1_1004.py(문제 이름)과 ..
-
[Python] pipreqes으로 사용한 패키지만 requirements.txt에 포함하기
pip freeze의 문제점 패키지 관리를 위해 일반적으로 pip freeze > requirements.txt를 사용한다. pip freeze는 편리하지만, 의존 패키지까지 모두 포함 시켜 가독성을 떨어트린다는 문제가 있다. 실제로 aiohttp, beautifulsoup4, GitPython, requests만 사용한 경우에도, requirements.txt는 다음과 같이 굉장히 지저분하게 생성된다. pip freeze > requirements.txt >> aiohttp==3.8.4 aiosignal==1.3.1 async-timeout==4.0.2 asyncio==3.4.3 attrs==22.2.0 autopep8==2.0.2 beautifulsoup4==4.11.2 certifi==2022.12..
-
[OS] Burst(버스트)와 Bound(바운드) 알아보기
Burst(버스트) 버스트는 '한 작업을 연속적으로 처리하는 것'으로, 보통 작업 처리에 필요한 시간을 의미한다. 따라서 CPU(I/O) 버스트는 각각 CPU 명령 수행과 I/O(입출력 요청) 처리까지 걸리는 시간이라고 이해하면 된다. 프로그램은 CPU 버스트와 I/O 버스트가 번갈아가며 반복되는 방식으로 실행된다. I/O 버스트의 특징 I/O 버스트의 경우, 기본적으로 장치의 속도가 느리고, 추가로 커널 요청 작업까지 필요하기 때문에, CPU 버스트에 비해 상대적으로 긴 시간이 소요 된다는 특징이 있다. 실제로 I/O는 아래와 같은 복잡한 Cycle로 처리된다. CPU 버스트의 양상 CPU 버스트는 주로 CPU가 실행이 많이 필요한 작업을 수행할 때나, I/O 처리를 요청할 때 수행된다. I/O 요청 ..
-
[Git] 한글 깨짐 해결하기
문제 상황 깃 작업 중에서 diff나 status로 로그를 찍어볼 때, 한글이 깨져서 나오는 경우가 있다. git diff --name-only auto-readme..origin/auto-readme
-
[Linux] tree에서 특정 폴더, 파일 제외하기
사용 방법 -I(대문자 i) 옵션을 활용하면 된다. 옵션 뒤 " " 영역에 제외하고 싶은 폴더, 파일 명을 와일드 카드 패턴으로 나타내면 된다. 코드 예시 제거 전 !tree -L 2 ./text_recognizer # 출력 ./text_recognizer ├── callbacks │ ├── imtotext.py │ ├── __init__.py │ ├── model.py │ ├── optim.py │ ├── __pycache__ │ └── util.py ... 제거 후 !tree -L 2 ./text_recognizer -I "__pycache__" # 출력 ./text_recognizer ├── callbacks │ ├── imtotext.py │ ├── __init__.py │ ├── model.py..
-
NLP Task 맛보기 - (2) NLU, QA
NLP는 NLU(Natural Language Understanding)와 NLG(Natural Language Generation)로 구분할 수 있습니다. 문자 그대로 NLU는 자연어 형태의 문장을 이해하는 기술이고 NLG는 자연어 문장을 생성하는 기술입니다. 결국 NLU와 NLG 모두 인간과 기계가 의사 소통할 수 있도록 도와주는 기술입니다. 이번 포스팅에선 NLU의 전반적인 내용과 QA에 대해서 다뤄보겠습니다. NLU? NLU는 자연어 형태의 문장을 이해하는 기술입니다. 이때 언어를 이해한다는 것은 2가지 측면으로 나눠서 생각할 수 있습니다. 바로 문법과 의미입니다. 따라서 기계가 만약 문법과 의미를 잘 알고 있다면 언어를 이해하고 있다고 할 수 있습니다. Syntatic : 언어를 이해한다면 주어..
-
[파이썬] Formatter와 Linter 알아보기
왜 필요? 똑같은 실행을 하는 코드여도 남이 짠 코드는 잘 안 읽힌다. 모두가 각자 나름의 규칙을 지켜서 최대한 깔끔하게 작성했겠지만 그 규칙이 남에게도 적용되기란 쉽지 않다. 이때, 각자가 최소한 정해진 규칙대로 코드를 작성하려고 노력하면 이해하는데 조금이나마 도움이 될 수 있다. 언어마다 각각의 코드 작성 규칙이 있는데 이를 스타일 가이드 또는 컨벤션이라고 한다. 파이썬에도 PEP8이라는 스타일 가이드가 있다. PEP 8 – Style Guide for Python Code | peps.python.org PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type P..
-
[Python] 프로그래머스 쿼드압축 후 개수 세기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 쿼드 압축은 매 시행 마다 압축이 가능한 지 확인하고, 불가능하다면 4개의 동일한 부분을 나눠서 다시 확인한다. 압축 시도 → 분할 후 압축 재 시도의 과정이 반복되기 때문에 재귀 함수를 활용할 수 있다. 압축의 형태를 비교하는 과정에서, 2차원 리스트 슬라이싱이 필요했다. 리스트를 2차원 슬라이싱 하려면, 다음과 같이 리스트 컴프리헨션을 사용하면된다. [row[j : j + n // 2] for row in arr[i : i + n // 2]] # (0의 개수, 1의 개수) # 재귀? ..
-
Overflow(오버 플로우) 방지하기 : 나머지 연산 활용
문제 상황 코딩 테스트 문제를 풀다 보면, 다음과 같은 조건이 있을 때가 있다. 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요. 위와 같은 조건은 숫자가 너무 커져 발생하는 오버 플로우를 방지하기 위함이다. 하지만 최종 값에만 나머지 연산을 적용할 경우 여전히 오버 플로우가 발생할 때가 있다. # (n x 2) 바닥 채우기 # n 번째 바닥 def solution(n): # 경우의 수 저장 DP = [1, 2] for i in range(2, n): DP.append(DP[i - 2] + DP[i - 1]) return DP[n - 1] % 1000000007 # 최종 값에만 나머지 연산을 적용할 경우 이럴 땐 연산 과정 중간 중간 나머지 ..
-
[파이썬] 프로그래머스 피로도 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 던전의 최대 개수는 8개로, 각 던전 방문의 경우의 수는 8! = 40320이기 때문에 완전 탐색만으로도 풀 수 있다. 가능한 던전 방문의 순서를 얻기 위해서, 순열을 활용했다. # 던전 입장 조건 : 피로도 >= 최소 피로도, 던전 입장 후 : 피로도 -= 소모 피로도 # 최소 피로도 >= 소모 피로도 # 최대한 많이 탐험 -> 각 던전은 한번만 가능 # 가능한 경우의 수 : 8! : 40320 -> 완전 탐색으로도 풀 수 있음 from itertools import permutatio..
-
[파이썬] 프로그래머스 숫자 짝꿍 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 공통된 숫자를 미리 확인한 뒤 필요한 숫자만 개수를 확인했다. 하지만 확인할 숫자의 개수가 10개 뿐이어서 굳이 그럴 필요는 없었던 거 같다. 0이 여러번 반복되는 문자열을 처리하기 위해서 정규 표현식을 사용 했다. from collections import Counter import re def solution(X, Y): answer = "" # 문자열로 변경 X, Y = map(str, (X, Y)) # 공통 숫자 확인 com_num = sorted(set(X) & set(Y), r..
-
Statistical Estimator(통계적 추정량)의 특성 알아보기
Estimator(추정량)이란? 추정량은 추정과 관련된 값이다. 그래서 우선 추정에 대해서 간단하게 알아보자. 추정은 표본을 활용해 모집단의 특성을 나타내는 값인, 모수(Parameter)를 추측하는 과정을 의미한다. 추정엔 특정한 값을 추측하는 점 추정과, 점 추정의 변동을 고려해 모수를 포함할 가능성이 높은 구간을 추측하는 구간 추정이 있다. 이러한 추정엔 결국 기준이 되는 값이 필요한데, 그것을 바로 추정량이라고 부른다. 추정은 다양한 추정량 중, 어떤 추정량을 활용할 것인지가 중요하고, 이에 따라 바람직한 추정량의 특성 또한 존재한다. 일반적으로 사용하면 좋은, 바람직한 추정량의 특성으로 Unbiasedness(불편성), Efficiency(효율성), Consistency(일치성), Suffici..
-
Dot-product Attention과 Scaling 필요성
Intro Attention Is All You Need 논문에선 $Q$와 $K$ 벡터의 유사도를 0 ~ 1 사이의 확률 값으로 정규화하기 위해서 Dot-product Attention를 사용한다. 이때, Dot-product Attention을 그대로 사용하지 않고 $K$벡터의 차원 값인 $d_k$를 활용하여 scaling된 형태로 사용한다. $$Attention(Q, K, V) = softmax(\frac{QK^{T}}{\sqrt d_k})V$$ scaling의 근거는 논문에서 언급되며 다음과 같다. $d_k$가 커지면 $QK^{T}$ 값이 커진다. $QK^{T}$ 값이 커지면 softmax 함수의 gradient vanishing이 발생한다. scaling을 통해서 gradient vanishing..
-
[논문 리뷰] Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence Scoring Tasks
1. 등장 배경 기존 BERT(Cross-encoder)는 STS Task를 해결할 때 두 문장 사이 [SEP] 토큰을 추가해 한번에 입력 처리 이 방법은 두 입력 문장의 self-attention을 통해 높은 성능 기록 하지만 두 문장 사이만의 관계를 확인하는 기존 BERT로 Semantic-Search나 Clustering에 활용하는 것은 매우 비효율적(massive computational overhead) 이를 해결하기 위해서 Siamese/Triplet 구조를 활용해 sentence-embedding을 얻을 수 있는 SBERT(bi-encoder)를 제안 SBERT는 BERT에 비해서 낮은 성능을 갖지만 적절한 dense-vector space(sentence-embedding)을 얻기 위해 많..
-
[리뷰] 팀 개발을 위한 Git, Github 시작하기
팀 단위 개발에 필요한 Git, Github의 개념과 실제 사용법을 다루고 있는 책이다. 찾아보니 저자 분들의 기존 Git 강의를 좀 더 발전 시켜서 책으로 까지 출판한 거 같다. 그래서 아래 링크를 참고하면 책이 대략적으로 어떤 느낌으로 서술돼 있는지 확인할 수 있을 것이다..! 초심자를 위한 Github 협업 튜토리얼 (with 토끼와 거북이) – 블로그 이사갔어요! https://milooy.github.io/ (wordpress.com) [무료] Git과 GitHub 시작하기 - 인프런 | 강의 (inflearn.com) 책은 ‘무조건 쉽게. 단, 제대로’라는 집필 목표에 충실하게 구성돼 있다. 따라서 Git과 Github를 먼저 GUI 환경에서 익히고, 이후 CLI 환경에서 레벨업할 수 있는 다..
-
Decision Tree(결정 트리) 구성과 Impurity(불순도) 알아보기
Decision Tree(결정 트리) 데이터를 통해 Branch를 구성하고 이를 통해 분류, 회귀까지 할 수 있는 모델이다. 이 중 분류 모델의 경우 Impurity가 최소가 되는 방향으로 Branch가 생성되며, 여러 Branch로 구성된 최종 형태가 거꾸로 세운 나무 같아 트리 모델이라고 부른다. Impuriy는 Entropy와 Gini index로 측정된다. Impurity 측정 지표 Impurity라는 이름처럼 Entropy, Gini index 모두 고유한 성분만 있을 때 최솟값을 가지고, 반반 섞여 있을 경우 최댓값을 가진다. 두 지표 중 Entropy는 $log$ 항이 있어, 상대적으로 계산에 더 오랜 시간이 걸린다. Entropy $$ E = -\sum_{k=1}^K p(y_k) \log_..
-
[OS] 운영체제의 자원 관리 기능 알아보기
운영체제의 자원 관리 운영체제의 주요 기능은 컴퓨터 자원을 효과적으로 관리하는 것이다. 컴퓨터의 핵심 하드웨어 자원인 CPU와 메모리는 CPU Scheduling(스케줄링)과 Memory Management(메모리 관리)을 통해 관리된다. 또한 주변 및 입출력 장치의 요청을 CPU가 효과적으로 처리하기 위해 Interrupt(인터럽트)를 도입했다. 1. CPU Scheduling(스케줄링) 1개의 CPU에서 다양한 프로세스를 수행하기 위해, 자원을 관리하는 방법 가장 효율적이면서, 특정 프로세스가 불이익을 받지 않도록 설정하는 것이 핵심 현재 CPU 자원을 뺏을 수 있는 스케줄링이면 Preemptive(선점형), 없으면 Non-preemptive(비선점형)이라고 함 FCFS(First Come First..
-
[Python] 프로그래머스 2 x n 타일링 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 가로 - 세로 길이가 정해져 있기 때문에 DP로 풀 수 있었던 문제다. N 번째 위치에서 가능한 타일링은 가로가 1인 경우(N - 1)와 가로가 2인 경우(N - 2), 총 2가지 이다. 이를 점화식으로 나타내면 아래와 같다. DP[n] = DP[n - 1] + DP[n - 2] 추가로 오버 플로우를 방지하기 위해서, 연산 중간마다 나머지 연산을 진행했다. 이는 나머지 연산의 분배 법칙을 통해 가능하다. # (n x 2) 바닥 채우기 # n 번째 바닥 def solution(n): # 경..
-
[Python] 프로그래머스 땅따먹기 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 모든 경우의 수를 완전 탐색할 경우, 대략 $4^{100,000}$ 정도의 연산이 필요해 시간 초과가 발생한다. 따라서 다른 방법을 활용해야하고, 나는 DP를 활용했다. 매번 새로운 열만 밟을 수 있기 때문에, 현재 K 번째 열을 밟았다면, 이전엔 [K - 1, K - 2, K - 3]의 열만 밟을 수 있다. 결국 N 행의 K 번째 열을 밟았을 때의, 최대 값을 DP 테이블에 저장하면 문제를 풀 수 있다. DP[n][k] = land[n][k] + max(DP[n - 1][k - 1] +..
-
[파이썬] 프로그래머스 전화번호 목록 풀이
문제 확인 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나의 풀이 처음 풀이 : 시간 초과 발생 접두어의 길이는 '최대 단어 길이 -1' 까지만 가능하다. 길이에 따라서 접두어 후보를 나누고, 이후 비교하는 방식으로 접근하려고 했다. 후보를 나누고, 비교하는 과정이 대략 $O(20 * (50000)^2)$이 되기 때문에 시간 초과가 발생했다. # 접두어 여부 확인 # 접두어? (최대 단어 길이 -1) 까지만 접두어가 될 수 있음 # 접두어 탐색 범위 : 나보다 길이가 더 긴 단어들만 확인 가능 # 길이에 따라서, 접두어 후보를 나누고, 이후 비교하면? ..
-
[Python] argparse 알아보기
argparse CLI를 통해 사용자 입력을 받아야 할 때 주로 활용한다. argparse.Argumentparser() 사용자 입력이 필요한 경우에 활용하자. 인자를 단순히 저장하는 것에 그치지 않고, 추가적인 행동을 명시해주고 싶을 때 활용하자 argparse.Namespace() 사용자 입력이 필요하지 않은 경우에 활용하자. argparse.py 구조 전체 코드에서 _AttributeHolder는 Action, Namespace, ArgumentParser만 상속한다. 인자를 저장하는 것이 모듈 목적인 점을 고려하면, 결국 Action, Namespace, ArgumentParser가 핵심인 것을 알 수 있다. 추가로 코드를 보면 ArgumentParser는 _ActionsCotainer 까지 상속..
-
[FSDL 정리] 분산 학습(Distributed Training) 알아보기
Full Stack Deep Learning - Lecture 2: Development Infrastructure & Tooling Software engineering, Deep learning frameworks, Distributed training, GPUs, and Experiment Management. fullstackdeeplearning.com 모든 사진과 글은 위 링크를 참고했습니다. 분산 학습 모델 파라미터와 데이터 배치의 메모리 사용량이 크지 않다면, 1개의 GPU로 모델 학습을 진행하면 된다. 만약 그렇지 않은 경우엔 여러 GPU를 동시에 활용하는 분산 학습을 활용한다. Data Parallelism(DP) DP란 1개의 GPU로 모델 파라미터는 저장할 수 있지만, 데이터 배치까..
-
[파이썬] static type checker
Type Hint(타입 힌트) 점검? 타입 힌트의 필요성을 느껴 사용했다면, 이제 힌트를 제대로 적었는지 확인해야 한다. 파이썬은 Dynamic typing(동적 타이핑) 언어라서, 잘못된 힌트를 적었더라도 실행엔 아무런 이상이 없다. 그래서 힌트가 제대로 됐는지 확인할 수가 없다. 파이썬에서 타입 힌트가 제대로 됐는지 확인하려면 별도의 Type Checker(타입 체커)를 사용해야 한다. 타입 체커는 mypy, pyright, pytype 등이 있는데 이 중에서 mypy와 pyright가 많이 활용되고 있다. 주의할 점 타입 힌트가 파이썬에 도입됐지만, 타입 체커가 아직 정식으로 지원되는 것은 아니라고 한다. 따라서 전체 프로그램 코드를 모두 확인하기 보다는, 확인이 필요한 함수나 클래스만 따로 떼어서..
-
[파이썬] 소프티어 GBC
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트를 방문하여 문제를 확인해주세요. 나의 풀이 구간 마다 조건을 나눠서 푸는 방법도 생각해봤지만 각 위치에서의 속도 정보를 저장해서 비교했다. 이 방법이 더 편하고 실수할 일도 없을 거 같아서 선택했다. import sys n, m = map(int, input().split()) # 제한 구간 정보 section_limit = [list(map(int, input().split())) for _ in range(n)] # 테스트 구간 정보 section_test = [list(map(int, input().split())) for _ in range(m)] # 제한 구간 정보 입력 speed_limit =..
-
Non-Parametric Density Estimation(비모수 밀도 추정) 알아보기
Density Estimation(DE)? 관측 데이터는 확률 변수에 의해 샘플링된 것으로 볼 수 있다. 이러한 관측 데이터를 많이 모으면 어떤 확률 변수에서 추출됐는지 추정이 가능할 것이다. 데이터를 통해 기존 확률 변수의 Density(PDF)를 추정하는 것이 바로 DE이다. PDF를 알면 확률 변수에 정보를 알 수 있기에 가치 있음 Non-Parametric Estimation 확률 변수의 형태를 미리 가정할 경우를 Parametric, 아닐 경우 Non-Parametric Model 이라고 한다. Non-Parametric Estimation은 변수에 대한 가정 없이 관측된 데이터만 가지고 DE를 진행한다. 다양한 방법 중 간단하게 Histogram, KDE만 알아보자. Histogram 데이터의..
-
Github Stats의 Maximum retries exceeded 오류 해결하기
어떤 오류? Github Stats를 쓰다보면 위와 같은 메시지가 나오면서 원하는 카드(배지)가 나오지 않는 경우가 있다. 물론 시간이 지나면 다시 정상적으로 표시되긴 하지만, 가능하면 문제를 해결하고 싶었다. 느낌에 나만 겪을 문제는 아닌 거 같아서 isseus 탭에 들어가보니 이미 해결 방법과 문제 원인까지 다 나와 있었다 ㅎㅎ 우선 문제의 원인은 오류 메시지(maximum retries exceeded)에도 나와 있듯, 배포자에게 너무 많은 request가 있어서 병목이 발생하는 것이다. 이를 해결하기 위해서 감당할 수 있는 request 수를 지속적으로 늘리고 있다곤 하는데, 언젠가 또 이런 문제가 발생할 수 밖에 없는 구조다. Deploy on your own vercel instance 결국 ..
-
[논문 리뷰] Conceptual Captions: A Cleaned, Hypernymed, Image Alt-text DatasetFor Automatic Image Captioning
MS-COCO의 문제점 COCO 데이터셋엔 그림은 없고, 사진만 있는 등 다양성이 떨어진다. 따라서 데이터가 high correlation을 가지게 된다. 이로인해 아이 사진에 대한 예측 결과를 확인하면 보이지 않는 사물에 대한 문장이 나오는 문제가 발생한다. 또한 파라미터 수가 점점 많아지는 모델들이 사용하기엔 데이터 수가 충분치 않다. Conceptual Captions 330만 개의 다양한 이미지-텍스트 데이터셋을 만들기 위해, 인터넷에서 얻을 수 있는 정보를 활용해 직접 새로 만들었다. MS-COCO의 문제점을 인식하고 만든 데이터라서 결과는 당연히 더 좋다. in front of a building, cake 등의 관련 없는 정보가 더 이상 안나온다. 마지막에 서류든 캐릭터를 COCO 데이터에선..
-
Python의 메모리 관리 방법 알아보기
Python의 모든 것은 객체다 파이썬의 메모리 관리 방법을 이해하려면, 우선 파이썬의 모든 것이 객체라는 것을 이해해야 한다. 이는 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참조하는 것이라는 말과 동일하다. 실제로 파이썬의 메모리 할당 과정은 다음과 같다. 그림에서 알 수 있듯, Heap 메모리 영역에 동적으로 할당된 객체를 모든 것(변수, 함수)들이 참조하는 구조다. 메모리가 동적으로 할당 된다는 것은, 결국 런타임 시 메모리가 할당된다는 것을 의미한다. 파이썬의 프로그램은 Byte-code(바이트 코드)를 인터프리터가 한 줄 씩 읽어가며 실행되기 때문에 동적 할당과 잘 맞다. 메모리 해제? 동적으로 메모리를 할당할 경우, 자료의 크기 등을 자유롭게 관리할 수 있어 편리하다는 장점이..
- 방문자수
전체 방문자
오늘 방문자
어제 방문자