우분투, 파이썬, 텐서플로우, 넘파이, 도커, 통계, 컴퓨터구조 등 회사일을 하면서 얻은 모든 지식을 여기다가 정리한다.
Ubuntu 명령어 모음
:
du -sh * # 현재 폴더 용량 확인
FDISK
:
mount
:
달린 device list보는 법
parted -l
fdisk -l
mkdir /home/id/data
mount /dev/sdc1 /home/id/data
즉 폴더만들고 parted -l로 새로 단 장비의 device 이름(sda,sda,sdc)를 보고 그 내부에 partition번호(1,2,3,...)을 보고 해당 partition을 지정한 폴더(/home/id/data)에 mount시킨다.
Vim 명령어 모음
정규표현식 모음
Discard Data or Fix Data
Feature Engineering은 다음으로 구성되어 있다.
feature selection, feature extraction, feature scaling, create new feature
No Free Lunch Theorem In Machine Learning
:데이터에 대한 어떠한 가설도 없다면, 어떤 모델을 다른 모델보다 더 좋아할 이유가 없다. 따라서 데이터에 대한 도메인 지식이 반드시 필요하다는 것.
Dropout시
tf.placeholder_with_default쓰기(값 안넘기면 default값(1로 두고)을 사용함으로써 test할 때랑 train할 떄 구분 지어줌)
SVM(Support Vector Machine)
:데이터를 뿌려놓고 확률을 생각하지 않고 decision boundary를 구하는 방법
decision boundary를 margin(decision boundary과 가장 가까운 점(a training instance)과의 거리)이 크게 찾고 싶은 것
decision boundary를 support하는 vector를 찾는 것이 목표(결국 너비가 가장 큰 road에 걸려져있는 vectors를 support vector라 한다.)
wx+b가 양수가 나오면 w방향으로의 점들임(w는 평면의 법선벡터)
confidence level = y_i(wx_i+b), y_i는 positive case에 1, negative case에 -1을 assign, 이렇게 함으로써 모든 training instances에 대해 confidence level은 항상 양수
confidence level이 최대가 되게하는 (w,b)를 찾는게 목표(임의의 training instance에 대해 모두다 wx+b=0인 평면에 정사영 시킨 벡터로 벡터를 분리해서 보면 바로 이해가 됨)
x_0와 decision boundary와의 거리는 (wx_0+b)/||w||가 된다.
만약 decision boundary가 존재한다면, 그리고 그때 support vectors를 wx_1+b = a, wx_2 + b = -a라 하자. (a는 임의의 양수)
그럼 다음과 같은 optimization problem이 된다.
max over (w,b) 2a/||w|| s.t. (wx_j+b)y_j >= a for all j in training instance
a를 편의상 1로 두고 역수취해 min 문제로 바꾸면
min over (w,b) ||w|| s.t. (wx_j+b)y_j >= 1 for all j in training instance
즉 quadratic programming(w의 크기->2차)
Hard margin SVM이란, 어떠한 error case도 허용하지 않는 것
Soft margin SVM이란, error case에 penality를 줌(즉 허용하되 penalty를 부여, decision boundary와 떨어진 거리에 비례하게 혹은 error case의 개수만 고려)
Hard margin SVM은 현실에서 구현이 힘듦(대개는 에러가 생김), Hard나 Soft모두 linear decision boundary를 찾는게 목표, 어쨌든 선형 decision boundary를 찾아야하는데 error case가 생긴다면 Soft margin SVM써야함
Kernel Trick을 이용하면 Hard Margin이면서 nonlinear decision boundary를 찾을 수가 있음.(데이터의 원래 차원에선 nonlinear이지만, feature mapping에 의한 차원 확장 공간에선 linear decision boundary임)
Soft margin SVM에서
penalty상수에다가 error case 개수를 min에 추가하는 방법이 있을 수 있다. 이건, 모든 error case가 동등하게 penalty줘야하는 경우
penalty상수에다가 support vector를 넘어서는 순간부터 penality를 주는 형태가 있다.
전자는 0/1 loss(decision boundary를 넘어서는 순간부터 error줌), 후자는 hinge loss(decision boundary를 넘지 않았어도 support vector를 넘어서면 penalty 부과)
0/1 loss인 경우가 잘 쓰이지 않는 2가지 이유, 형평성문제(아주 틀린놈이랑 조금 틀린놈이랑 같은 취급), quadratic programming 구현이 어려움
후자에서 hinge loss인 경우 optimization problem은 다음과 같다.
min over (w,b) (||w||+C*sum over all j ξ_j s.t. y_j(wx_j+b) >= 1- ξ_j and ξ_j >=0 for all j in training instances.
(여기서 1-ξ_j를 이해하는게 관건, 원래는 >=1이었는데, >=1-ξ_j란 원래 있어야할 >=1영역보다 떨어진 정도를 1-ξ_j 로 나타낸 것)
후자는 Quadratic Programming이 쉽게 풀림 ξ_j를 slack variable(부가변수)라 한다.
Constraints를 Soften했다고 해서 Soft margin SVM이라 하는 것
Kernel Trick이란, 다른 차원으로 보내서 내적으로 정의되어있지만, 다른 차원으로 보내는 feature mapping function을 구하지말고 구하는 방법을 가리킨다. lagrange multiplier를 구하는 dual
https://www.youtube.com/watch?v=dP9CDyR0L3E
이거부터 보면서 마무리 정리하면 됨
Quadratic Programming
:다변수, 차수는 최대 2차인 함수를 max/min optimization, constraint는 1차로 표현되는 형태릐 문제를 가리킨다.
nonlinear programming의 대표적인 예
Quadratic Residue
:이차잉여를 배우는 이유는 정수계수정수방정식을 풀 때 그냥 풀기는 어려워서 합동식으로 범위를 제한하고 Chinese Remainder Theorem를 써서 구하는게 큰 그림. 이를 위해 일차, 이차 등 합동방정식을 해결먼저하는게 필요하고 그 때 이차잉여, 르장드르 기호 도입 등이 필요함
Decision Tree
:
n:features 총 개수
m:training instances의 총 개수
Parameters(scikit learn기준)
max_depth:tree의 depth의 상한을 설정
presort:학습이전에 데이터를 sort를 먼저 할 지를 정한다. m이 천단위로 적을 땐 True, 만단위이상일 땐 False하는 것이 학습 속도에 도움이 된다.
criterion:gini or entropy, cost function을 계산하여 feature를 greedy하게 나눌 때, impurity를 gini value를 쓸 지 entropy를 쓸 지 정한다. gini와 entropy가 성능 차이가 뚜렷하지 않으므로 계산이 빠른 gini가 default, 두개가 만들어낸 tree가 다를 때를 보면은 gini가 the most frequent class를 독자적인 branch로 두는 경향이 있고 entropy는 balanced tree를 만들어 낸다.
min_samples_split:leaf가 아닌 node가 split될 후보가 되기위한 최소 samples개수, 즉 만약 node_k가 samples가 153인데 min_samples_split가 160이면 학습시 node_k에서 쪼개는 것은 더이상 생각 안함
min_samples_leaf:leaf가 가질 수 있는 최대 samples 개수, 만약 node_k가 samples=7이고 쪼개지면 1과 6으로 쪼개지는 상황인데 min_samples_leaf가 2이면 1<2이므로 쪼개지지 않게 함
max_leaf_nodes:leaf의 최대개수 상한
max_features:학습시 각 node에서 feature를 고르는데 feature 고려 후보 개수 상한, 즉 max_features=5이고 모든 feature개수가 50일 때, 각 node에서 50개 중 임의의 5개의 feature만 택해서 greedy하게 best feature, threshold를 찾아낸다. 적을수록 regularize하는 것이고 overfit risk 낮춤
splitter:각 node에서 greedy하게 택한 best feature를 쓸지, 아니면 random하게 feature택하고 threshold만 적절하게 학습으로 찾을 지 선택
학습과정
:
Cost(feature_name, threshold_value) = left_ratio * left_impurity + right_ratio * right_impurity 가 최소가 되게하는 feature_name과 threshold_value를 택한다.
즉 the purest subsets(weighted by their size)가 되게끔
이후 각 node마다 위의 과정을 반복하여서 feature_name과 threshold_value를 차례로 설정해나간다. 더이상 training instance가 나눠지지 않을때까지 나누거나 max_depth로 설정한 값까지 나눈다. 즉 greedy하게 학습한다.
greedy하기 때문에 optimal solution인지는 알 수가 없다. optimal solution을 찾는 것은 NP-Complete로 알려져 있으며 O(exp(m))로 알려져 있다.
regression의 경우
Cost(feature_name, threshold_value) = left_ratio * left_variance + right_ratio * right_variance 가 최소가 되게하는 feature_name과 threshold_value를 택한다.
여기서 left_variance란, left에 속하게 되는 instances의 y값의 편차를 가리킨다.
학습할 때의 계산복잡도는 O(n*m*log(m))이다.
restriction없이 그냥 decision tree를 학습한 후에 모든 children nodes가 leaf인 node중에서 chi-square test using p-value 해서 null hypothesis:이 node를 children과 두는게 성능 향상되는게 우연이다, 라고 둔 확률이 일정 threshold(hyperparameter)보다 크면 accept하고 node의 children를 삭제하는 형태의 constraint를 두기도 한다. pruning(가지치기)라고 한다.
학습후
:
각 node는 다음의 데이터를 갖는다.
feature_i criteria, ex) length > 0.2, 통과되면 왼쪽 node로 감
gini value(1 - (a_1/samples)^2 - (a_2/samples)^2....), 즉 작을수록 좋고, impurity를 measure하는 metric중 1가지 or entropy (parameter인 criterion을 default가 gini)
(entropy는 각 class의 training instance분포를 기준으로 구함, training instance가 0인 class는 summand로 넣지 않음)
samples(통과된 training instance의 개수),
value=[a_1,a_2,...a_class개수]로 각 training instances의 class별 개수,
class(이 node에 있으면 predict한 class값)
tree_clf.predict_proba("feature value list")를 통해 임의의 instance(feature value list로 실현된)를 입력하면
instance가 도착한 node의 samples와 value를 이용하여 instance가 어떤 class인지 predict한 값과, 그 class일 확률을 계산한다.
그 class일 확률 및 다른 class일 확률은 samples와 value를 이용하여 a_1/samples, a_2/samples,...를 통해 계산한다. 즉 training instances들의 그 node에 분포한 확률을 뱉는 것일 뿐. 즉 test instance의 feature값이 무엇이든, 같은 node에 도착하면 class distribution은 같게 나온다.
predict할 때의 계산 복잡도는 O(log(m))이다. Worst case는 O(m), 즉 모든 leaf가 training instance를 1개씩만 갖는 상황. (꼭 한개의 node에 여러 samples가 있을 필요가 없음, 특정 class의 samples가 다 있어야 하는 것도 아님)
따라서 아무리 많은 training instance로 학습하였어도, prediction은 빠르다.
특징
:
데이터 전처리를 거의 필요로 하지 않는다. scaling, centering따위 필요하지 않음
nonparametric(parameter가 없다는 뜻이 아니라, 있지만, 학습 이전에 정하지 않는 다는 의미), 따라서 overfit위험이 크므로 max_depth같은걸 지정함
regularization은 hyperparameter(max*을 줄이거나 min*을 늘리거나 하여 overfit 예방)
decision tree는 기준을 orthogonal하게 잡아버림, 따라서 rotation된 data에 대해선 generalization performance가 약함->PCA쓰고 decision tree쓰면 해결됨
학습데이터의 small variance이 학습된 decision tree 모양을 크게 바꿀 수 있음->instable
scikit-learn의 경우 decision tree를 학습시킬 때마다 (max_features같은게 설정되어 있다면)같은 training data set이어도 다른 모델들이 나올 수 있다. 왜냐하면 random하게 feature를 택하기 때문->instable
이러한 instable문제 때문에 random forest(decision tree의 bagging version)이 등장함
Random Forest
:
Autoencoder
:input, hidden layers, output으로 구성
데이터의 효과적인 표현(coding)을 learning
대개는 더 작은 사이즈로 dimensionality reduction
알아서 적절한 features만 뽑아낼 것(without label and domain knowledge)
->Autoencoder
사용하는 곳
-feature detectors, feature extraction, dimensionality reduction
-generative model
Autoencoder가 단순히 identity가 아닌 이유
-사이즈를 줄여나간 latent feature space
-변형된 Autoencoders(input은 with noise, output은 without noise)
구성
encoder=recognition network
decoder=generative network
output=reconstructions
loss=reconstruction loss
internal representation=latent feature
internal representation < input
이 때 undercomplete autoencoder라 한다
Simple Autoencoder(즉 layer가 가장 적게)에서
activation function을 안쓰면 PCA와 같다.
Deep Autoencoder
주의사항:너무 딥하게 만들면, 모든 training instance마다 1개의 숫자로 대응시켜버려서
training accuracy는 좋지만 generalize는 못할 수가 있음
전략1:Tying Weights
transpose를 활용하여 같은 weight를 둠으로써 학습할 weight개수를 낮추고 deep하게 가능
fully_connected쓰지말고 직접 행렬을 정의하는게 이때는 훨씬 간결하다
이 때 주의사항
weights1과 weights2만 regularizer에 넣고
weights3과 weights4는 넣으면 안됨
bias는 tied도 regul도 안했음
전략2:한번에 한개의 autoencoder학습시키기
매우 deep한 autoencoder에서 유용하다(효율적인 학습)
즉 한번에 2개의 weight와 2개의 bias를 학습시키자.(그동안 나머지 weight와 bias는 고정)
이때 phrase가 증가함에 따라 input을 매번계산하지않게 하기 위해
값을 저장해두고 쓰기
Visualizing Features
방법1: layer에서 각 뉴런마다 가장 값이 높게 나오는 training instance찾기, 이 때 layer가 top에 있을 때가 효율적임, lower에 있을 때는 매우 추상적이고 값도 적을 가능성이 높다. 예를 들면 first neuron이 가장 높은 값이 있을 때, 그 때의 training instance가 고양이 사진이라면 다른 고양이 사진에서도 first neuron값이 높게 나올 것이다.
방법2:각 뉴런마다 직전 웨이트값을 transpose하여 plot해보기, weight값의 크기를 통해 그 뉴런이 어떤 feature를 찾으려는지 시각화됨
방법3:임의의 랜덤 input(image)를 넣고 내가 관심있는 neuron이 좀 더 activate하게되게 이미지를 수정해나가기(backpropagation)
(Classification의 pretraining 으로 사용할 경우, 그냥 Classification의 성능을 볼 수도 있다.)
Regularization implement example
:
regularizer = tf.contrib.layers.l2_regularizer(l2_reg)
initializer = tf.contrib.layers.variance_scaling_initializer()
X = tf.placeholder(tf.float32, shape=[None, n_inputs])
weights1_init = initializer([n_inputs, n_hidden1])
weights2_init = initializer([n_hidden1, n_hidden2])
weights1 = tf.Variable(weights1_init, dtype=tf.float32, name="weights1")
weights2 = tf.Variable(weights2_init, dtype=tf.float32, name="weights2")
weights3 = tf.transpose(weights2, name="weights3") # tied weights
weights4 = tf.transpose(weights1, name="weights4") # tied weights
biases1 = tf.Variable(tf.zeros(n_hidden1), name="biases1")
biases2 = tf.Variable(tf.zeros(n_hidden2), name="biases2")
biases3 = tf.Variable(tf.zeros(n_hidden3), name="biases3")
biases4 = tf.Variable(tf.zeros(n_outputs), name="biases4")
hidden1 = activation(tf.matmul(X, weights1) + biases1)
hidden2 = activation(tf.matmul(hidden1, weights2) + biases2)
hidden3 = activation(tf.matmul(hidden2, weights3) + biases3)
outputs = tf.matmul(hidden3, weights4) + biases4
reconstruction_loss = tf.reduce_mean(tf.square(outputs - X))
reg_loss = regularizer(weights1) + regularizer(weights2)
loss = reconstruction_loss + reg_loss
Tensorboard
:
now = datetime.utcnow().strftime("%Y%m%d%H%M%S")
root_logdir = "tf_logs"
logdir = "{}/run-{}/".format(root_logdir, now)
mse_summary = tf.summary.scalar('MSE', mse)
file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph())
이렇게 학습시마다 다른 텐서보드를 얻기위해 폴더명에 실행시간을 추가시켜버리는 테크닉가능
summary_str = mse_summary.eval(feed_dict={X: X_batch, y: y_batch})
step = epoch * n_batches + batch_index
file_writer.add_summary(summary_str, step)
이렇게 텐서보드에 표현하고 싶은 필요한 스칼라값을 (학습중에서도 생기는,배치나 에퐄사이에)추가하여 학습, 그러면 events파일로서 저장되어 텐서보드에 표현가능
ROC(Receiver Operating characteristic curve)와 AUC(Area Under Curve)
:
False Positive란 예측값이 Positive인데 틀린(False) case, 즉 실제론 Negative인데 Positive라고 예측한 경우, Type I error
False Negative란 예측값이 Negative인데 틀린(False) case, 즉 실제론 Positive인데 Negative라고 예측한 경우, Type II error
False Positive Rate란 FP/N, 즉 실제 Negative에서 False Positve의 비율, 낮을수록 Negative인 것을 Negative라고 잘 판단
True Positive Rate란 TP/P, 즉 실제 Positive에서 True Positive의 비율, Recall이라고도 불리며 높을 수록 Positive인 것을 Positive라고 잘 판단
ROC란 어떤 binary classifier의 threshold를 다양하게 하여 x축을 FPR, y축을 TPR으로 하여 그린 곡선이다. 해석은 다음과 같다.
-[0,1]x[0,1]에서 그린 곡선이다.
-y=x위의 점인 경우 accuracy가 50%이다.(단 FPR=TPR=0.9인 경우랑 FPR=TPR=0.1인 경우 전자는 그래도 Positive인 것을 Positive라 판단하는 성능은 좋으며, 후자는 Negative인 것을 Negative로 판단하는 성능은 좋음)
-같은 binary classification문제에서 2개의 모델을 threshold를 다양하게하여 ROC curve를 각각 그려 2개를 그린다. 이 때 두 모델중 어느 것이 성능이 더 좋은 지를 판단하는 것을 AUC를 사용하여 구한다. (즉 2개 모델에서 threshold를 뭘하든 모델자체의 성능을 평가하기 위함)
-(FPR, TPR)=(0.9, 0.1)인 경우 엄청 성능이 낮음, random보다도 성능이 낮은 경우
-AUC가 높다->(FPR,TPR)이 좌측 상단에 있다->Better Case->즉 2모델 중 AUC가 높은게 Better Case(threshold가 존재)한다.
-실제로 어떤 threshold hold를 쓸 지는 TPR와 FPR중 무엇이 더 중요한지(즉 Problem마다 다름)를 생각하고 정한다.
Ridge, Lasso, L1, L2, regularization
:
ridge regression이란 bias말고 weight를 l2 norm구해서 l2 norm자체를 loss에 추가한 것
lasso regression이란 bias말고 weight를 l1 norm구해서 l1 norm 자체를 loss에 추가한 것
lasso는 여러 feature중 의미없는 feature를 걸러내는 데 사용
ridge는 weight의 절댓값을 줄임으로써 모델의 generalization의 성능을 끌어올리고자 하는 것
특히 training data가 적을 때 사용
Docker
:
장점
-용량 줄이기. 가상머신은 운영체제를 하나 새로 까니까 용량이 더 든다.
-빠르다. 가상머신은 CPU를 쪼개서 쓰므로 느릴 수 밖에 없다. 프로세스 차원으로 격리시켜 사용하는 도커는 OS를 분리하진 않으므로 기존 자원을 그대로 사용하므로 빠르다.
-
특징
-리눅스 전용
-sudo로만 실행가능, 매번 sudo쓰기 싫으면 sudo usermod -aG docker egoing을 실행시켜 현재 계정을 도커계정에 추가시키면 된다.
-image와 container로 구성, image란 실행파일과 라이브러리의 총합, container란 image를 실행해둔 상태를 가리킨다.
설치하기
-sudo wget -qO- https://get.docker.com/ | sh
사용하기
어떠한 패키지를 사용하는데에 있어서 그것을 일일이 다 설치하기보단 그것을 미리 설치해둔 좀 더 큰 이미지를 받아 실행시킴으로써 패키지 관리자를 사용할 수가 있다.
-우분투 이미지 다운받아 실행하기
push
ex)docker push ~~~~
자기가 만든 이미지를 서버로 공유하는 것
docker와 dochub와의 관계는 git과 github와 비슷하다.
pull
ex)docker pull ubuntu:14.04
우분투 14.04 패키지 시스템이 구성된 이미지를 받아온다.
우분투의 커널을 제외한 모든 리눅스 배포판이 이미지안에 포함되어있다.
ex)docker pull nginx:latest
이처럼 버전을 latest라 두면 가장 최신버전의 이미지를 받아온다.
images
ex)docker images
현재 docker가 갖고 있는 이미지의 리스트를 반환한다.
search
ex)docker search ubuntu
현재 dochub에 있는 ubuntu가 포함된 이미지 리스트를 반환한다.
결과 리스트에서 앞에 아이디가 적혀져있지 않은 것은 도커에서 지원하는 공식 이미지들이다.
하지만 결과 리스트가 너무 많아서, docker.com에서 browse 탭에서 ubuntu라 검색하면 Tags에 버전들 목록이 있으며 그것을 참고해서 docker pull ubuntu:14.04 같이 입력하여 사용하면 된다.
run
ex)docker run -i -t ubuntu:14.04 /bin/bash
설치된 이미지를 통해 container를 실행시키고 들어가는 명령어
/bin/bash를 쳐줌으로써 이미지에 있던 bash파일을 실행하면서 container를 실행
docker는 기본적으로 실행할 메인 실행파일(현재는 /bin/bash)을 함께 실행시켜야 container가 유지되고, 이것을 종료함으로써 container를 종료한다.
-i:interactive환경을 제공
-t:가상터미널환경을 제공
이후 container 내에서 어떠한 패키지들을 설치하면 그것은 원래 운영체제에서는 설치되지않고 container 내에서만 설치가 된다. 마찬가지로 기존 운영체제에 설치된 패키지를 container 내에서 사용할 수가 없다. 완전 독립
ex)docker run -i -t --name bg ubuntu:14.04 /bin/bash
--name을 통해 container의 이름을 붙여 실행시킬 수 있으며, 이는 후에 container를 재실행하기 쉽게 만든다. 만약 name을 지정하지 않았다면 docker가 알아서 이름을 만든다.
container내에서의 패키지 설치 및 사용 등은 container-level에서 독립적이다. 즉 하나의 image로 여러개의 container를 만들어서 사용할 수가 있으며 각개의 container는 독립적으로 운용된다.
ex)docker run -d --name hello-nginx nginx:latest
-d:detached, 백그라운드로 실행, 그렇다보니 bash같은 실행파일을 지정해주지 않아도 된다.
start
ex)docker start "container id"
ex)docker start "container name"
ex)docker start bg
container의 id나 name을 이용하여 container를 실행시킨다. 이 경우 container가 실행되지만 안으로 들어가지는 않는 상태가 된다.
attach
ex)docker attach "container name"
start로 실행시켰던 container로 들어가는 명령어
ps
ex)docker ps
현재 실행중인 container 목록이 나온다.
ex)docker ps -a
과거에 종료했던 container까지도 포함해서 목록이 나온다.
ex)docker container rm "container id"
docker rmi "image_name" 했을 때 특정 container가 사용중이므로 삭제가 안될 때가 있다. 그 때 docker ps해도 container가 켜지지 않았음에도 에러가 날 때가 있는데, 그땐 docker ps -a로 과거 container history를 본 다음에, 확실히 container를 제거해줘야한다. 그때 docker container rm "container_id"가 필요하다.
ctrl+p+q
container 내에서 container를 종료시키지 않고 빠져나오는 명령어
만약 container를 종료시키면서 빠져나오고 싶다면 exit 혹은 ctrl+d를 써서 bash를 꺼주면 된다.
stop
ex)docker stop "container name"
container밖에서 현재 실행 중인 container를 종료시키고 싶을 때 사용하는 명령어
rm
ex)docker rm "container name"
특정 container가 관심없어서 지우고 싶을 때 사용
rmi
ex)docker rmi "image name"
docker가 갖고 있던 image중에서 image를 삭제하는 명령어
exec
ex)docker exec "container name" touch /hello.txt # touch란 파일 만들기 명령어이다.
밖에서 container의 우분투에서 명령을 실행시킬 수가 있다.
commit
ex)docker commit "container id" "image name"
만든 container를 image로 뜨는 명령어이다.
nvidia-docker2설치과정
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo docker pull nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
cp
ex)docker cp "host파일경로" "container name":"container 내부경로" # host->container 파일복사
ex)docker cp "container name":"container 내부경로" "host파일경로" # container->host 파일복사
ex)docker cp docker-cp-test anchore:test
참고자료
http://pyrasis.com/docker.html
https://opentutorials.org/course/128/8657
https://nicewoong.github.io/development/2018/03/06/docker-commit-container/
https://hiseon.me/2018/02/19/install-docker/
https://github.com/NVIDIA/nvidia-docker/issues/838
Git
:
버전관리 시스템 중 하나(version control system)
파일이름을 바꾸지 않으면서도 버전관리, 즉 변경사항을 관리한다.
게다가 backup, recovery, collaboration(다른 사람과 협업) 등이 가능
설치방법
:
sudo apt-get install git
or
sudo yum install git
git init
ex)git init
프로젝트 폴더 내에서 실행하면 이 폴더를 버전관리를 하겠다고 git에게 알려주는 명령어
이후 프로젝트 폴더 내에 .git이란 폴더가 생기고 여기에 모든 작업 내역들이 저장된다.
git status
ex)git status
버전관리를 하겠다고한 폴더내에서 실행하면 현재 폴더 내에 파일들의 status를 알려준다.
git add "file명"
ex)git add f1.txt
git에게 파일을 관리(track)하라고 명령하는 명령어
git init하고나서 이후에 새로 추가된 파일들에게 주로 필요하며, init된 폴더내에 있다고해서 버전관리가 다 필요한 파일들이 아니기때문에, 새로 만들때마다 git add해주어야 한다.
최초 track을 하기 위해서도 git add를 쓰지만, 이후 파일을 수정하고나서 git status하고나면 "modified"가 나오는데, 이때 바로 git commit하여 새버전을 만드는게 안된다.
이때 새 버전을 만들때도 git add "file명" 해주어야 한다.
즉, git add는 1. track(변경이 된건지 아닌건지), 2. make new version, 2가지를 위함에 필요하다.
즉, git은 내가 commit하고 싶은 파일만 등록해서 commit할 수 있게 add를 둔 것, add를 통해서 stage(commit 대기파일들)에 파일을 등록시킨다.
작성자 profile 등록
git config --global user.name bg
git config --global user.name bg@gmail.com
이렇게 함으로써 버전에 작성자 profile을 등록할 수 있다.
git commit
실행하게되면 stage(commit 대기파일들)에 있는 것을 commit한다.
git status한 내용들이 하단에 주석으로 깔리고 상단에는 버전메시지를 입력하게끔 vim으로 .git/COMMIT_EDITMSG파일이 열린다.
버전메시지(commit message)란, 새 버전의 유의미한 변화를 적어주면 된다.
이후 commit하여 생성된 버전이 저장되는 곳을 repository라 한다.
git log
버전메시지들의 log가 남는다. 버전 작성자의 profile과 버전을 만든 data도 출력한다. 그리고 각 commit의 id도 출력한다.
git log -p
버전메시지들의 log와 함께 각 버전마다 직전버전과의 변화를 출력한다.
기본적으로 버전관리라함은 git init한 폴더 자체를 1개의 버전으로 보기 때문에, 각 버전마다 새로생긴 파일, 수정된 파일 등의 변화를 볼 수가 있다.
git log "commit id"
해당 commit id의 이전 log만 출력한다.
git diff "commit id1".."commit id2"
commit id1과 commit id2 사이의 log -p만 출력, -는 commit id1의 내용, +는 commit id2의 내용을 출력한다.
git diff
작업한 변경사항들을 보여준다. 대개는 commit하기전에 확인차원에서 써본다. add하기 전의 파일들의 수정사항들을 확인하는 것이다. add한 파일들의 수정사항들은 나오지 않는다.
git reset
(버전을 되돌리는 방법이므로, 주의해서 사용해야함, 프로젝트 폴더 전체를 백업떠두고 하는 걸 추천)
git revert
Python3
:
sudo apt-get install python3-pip
pip3 freeze > requirements.txt
pip3 install -r requirements.txt
Numpy
:
Clustering
:
결과에 따른 종류:
Hard clustering:각 instance가 단일 cluster에 속하는 경우
Soft clustering:각 instance가 각 cluster에 속하는 정도를 나타낸 경우
알고리즘에 따른 종류:
K-means clustering:
n개의 instance를 m(<=n)개의 cluster에 속하게끔 분류를 한다. 이 때 C_1, C_2, ..., C_m개의 cluster에 속하는 instances의 평균을 μ1,μ2,...,μm이라 할 때 C_k에 속하는 임의의 instance와 평균사이의 거리제곱의 합이 최소가 되게하는 C_1,C_2,...,C_m을 설정하는 것을 목표로 한다. 방법은 Assignment Step과 Update Step을 반복적으로 시행하여 얻는다.
먼저 initial values of means를 설정한다. 이후 Assignment(각 점마다 가장 가까운 mean의 cluster에 배정), Update(각 cluster의 새 mean을 구함)
이후 Assignment를 하여도 변함이 없을 때 종료한다.
특징:
거리(distance)함수를 L2 외 다른 것을 씀으로써 변형 K-means clustering이 가능
만들어진 cluster가 convex하지 않으면 clustering이 실패하거나 means가 엉뚱한 값이 될 수가 있다.
초기 mean 설정에 대한 여러 방법들이 존재
최적 cluster 개수 k를 설정하는 여러 방법들이 존재(거리제곱의 합이 최소 중에 최소가 되는 k 선택, 물론 k=n이면 0이 되지만, k<<n인 k 중에서 거리제곱의 합이 급격히 변화하는 k를 택하거나, silhouette(각 점(i)마다 cluster 내의 다른 점들과의 평균거리(a(i))와 다른 cluster 각각의 평균거리(즉 다른 cluster 내의 점들과의 거리의 평균)의 최솟값 (b(i))를 구한다. 이렇게 각 데이터 i마다 a(i), b(i)를 바탕으로 silhouette score s(i)를 구하고 s(i)의 값에 따라 i가 cluster에 잘 배정됐는지를 해석한다. wiki에서 silhouette clustering을 검색, s(i)값이 높을 수록 좋으며, cluster 개수 k를 증가시키며 평균 silhouette score값이 최대가 되는 k를 택한다. 혹은 이전의 거리제곱의 합이 최소인 것과 동시에 silhouette score를 각 군집마다 결과를 내서 함께 고려하여 k를 결정하기도 한다. Calinski-Harabasz index(군집간 산포와 군집내 산포의 비율을 이용, https://scikit-learn.org/stable/modules/clustering.html#calinski-harabaz-index 참고)를 이용하여 k를 결정하기도 함(물론 silhouette, 거리제곱합 등도 함께 이용)
DBSCAN(Density-Based Spatial Clustering of Applications with Noise):
특징:
non-convex 문제를 해결할 수 있음
k를 먼저 선언하지 않아도 된다.
Ensemble
:
이론 배경은 Law of large number에 있다.
Pandas
: