Built in Type in Python

- NoneType: None . 실수형도아니고 정수형도 아니고,..

- Int : 컴퓨터 메모리에서는 2진수로 표현되고있는데, 10진수를 2진수로 표현하고있음. -inf ~ int로 표현할 수 없다.

- Float: 실수조차도 메모리에서는 2진수로 표현하기하는데, 0과 1사이의 무수히 많은 수가 있는데, 이를 표현하긴 불가능하다. 즉, 표현할수 있는 실수가 정해져있다. 유효숫자가 16자리가 이상이면 정확도가 떨어진다.

- Complex: 복소수를 표현

- Bool: True, False


조금 복잡한 구조: str, list (아직 만들지 않은 타입도 저장할 수 있다), tuple, dict, set <- Data structure: 한번에 여러개를 저장할 수 있게한다. 


Algorithm


입력을 받아 출력으로 변환하는 계산 과정.

Correct: 모든 입력에 대해 항상 올바른 출력을 내토 끝남. 어떤숫자든.

Solve: 타당한 알고리즘은 문자를 푼다.


Theta, Big-O, Omega Noation


Theta noat : f(n)으로 표현한 수식으로 표햔한 것같으로... g(n)으로. 정확하게 알고있는 것을 세타임. 양측 바운더리를 알고 있을 때 표기

이미 대표적으로 알고있는 함수들 g(n)이라고 할 떄, log n 

내가 만든 알고리즘은 f(n) = theta(g(n))

Big-O: g(n)에 대표적인 함수를 알고있을 떄, 상한을 알고있을 때. 최악의 경우의 표기법

Omega: g(n)에 대표적인 함수를 알고있을 떄, 상한을 알고있을 때


Approach


Incremental approach: 

Divide and conquer Approach (분할/정복/결합): 예, 왼쪽 반과 오른쪽과 따로따로 나눠서 생각해보자, 또 왼쪽반을 1/2, 1/2으로 나눠보자. 2개로 나눴을 때는 해결하기가 쉽다, 이를 정복(Conquer)한다고 한다. 예) Mergeg sort



Doubly Linked list



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Doubly Linked list
def delete(self, data):
    here = self.search(data) # 어디 있는지 찾아야함. bool으로 받음.
    if here:
        if here.prev != None: # 맨앞에 노드가 잇으면
            here.prev.next = here.next  # 나보다 전노드가 잇으면교체
        else:
            self.head = here.next
        if here.next != None: # Tail node
            here.next.prev = here.prev 
        else# tail인경우
            here.next
            
    
    
cs



Ciruclar lists 


Stack (LIFO:last in First Out ) vs Queue (FIFO)


stack은 파이썬의 list 을 쓰면된다. 굳이 구현할 필요 없다. 

원소를 넣는 것은 push한다고하고, 원소를 뺼떄는 pop하면된다.

스텍예제)

infix notation: 수식은 operand, opertor가 필요한데, 파이써든 C언어든 오퍼랜드 사이에 오퍼레이터를 넣어서 작성한다. 이를 infix natation이라 한다. 

그러나, 예를 들어서 CPU을 동작시키려면 postfix-expression줘야한다. 이렇게 만들면 괄호가 필요가 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# postfix expression 
 
def eval_post(e);
    'e: string. operand : 1자리수, operator:4칙연산'
    stack = []
    for k in e:
        if k not in ('+''-''*''/'):
            stack.append(int(k))
        else:
            op2 = stack.pop()
            op1 = stack.pop()
            if k == '+':
                stack.append(op1 + op2)
    return stack.pop()
    
cs


Queue:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Queue
 
class ListQueue:
    def __init__(self):
        self.size = 0
        self.items = []
 
    def enqueue(self, data):
        self.items.insert(0, data)
        self.size += 1
    
    def dequeue(self, data):
        data = self.items.pop()
        self.size -= 1
        return 
 
    def __str__(self):
        return str(self.items)
 
 
cs



Tree


Hierachical form of data strucutres (<->sequential form)

- Parent-child relationship between the items

- Root: the ancestor of all other nodes in the tree. (최상위 조상)

- Application: Parsing expression, Sorting, Searches, Document(XML, HTML)


Parent Node: 부모 노드

Root node:최상위 노드

Subtree: tree내 그 하위 트리,

Degree: children node의 수

Leaf Node: children이 없는 노드

Edge: 노드-노드의 연결선

Sibling: 부모가 같은 노드. 형제노드

Level: root에서 몇개 내려왔는가? (e.g root level = 0임)

Height of tree: 트리의 길이. 가장 긴 노드의 (e.g. A-B-F-L : height 4이다)

Depth: 루트로부터 몇개내려왔는지?


Binary: 각 노드의 children이 최대 2개이다. children이 없을수도있고(leaf), 하나 있을수도있고 2개있을 수도 있다.


Quick-sort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def partition(A, first, last):
'마지막 원소보다 큰애들은 뒤로 작은애들은 앞으로 보내는 함수'
    x = A[last]
    i = first - 1
    for j in range(first, last): # last 전까지만 봄. last 은 이미 어사인함
         if A[j] <= x:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i+1] ,A[last] = A[last], A[i+1]
    return i+1
 
 
def quicksort(A, first, last):
    'first, last : int. index number'
 
    if last - first > 0
        p = partiion(A, first, last)
        quicksort(A, first, p-1)
        quicksort(A, p+1, last)
 
 
cs



반응형


 산업/주제 분류

 질문

 비고

 예상응답
 산업공통

Support / Confidence / Lift 을 설명하여라

 여름용모델... 겨울용모델로 따로 만들수도;; 
  장바구니 알고리즘 단점에 대한 해결법을 제시하여라. 모든 상품에 대해서 추천이 나오지 않을 수 있다. 어떻게 할 것인가?    1. 자주사는 상품만 

2. Rule이 안나오는 상품에 대해서는 어떤 p(A)->P(A) 해당 카테고리 내 베스트 상품을 넣기도 함.

 

딥러닝에서 부스팅 방법을 활용하지 않는 이유가 무엇이라고 생각하나? 

  
 

당신은 왜 데이터 사이언티스트인가요? 

  SKT 전무가 물어봄

3가지를 잘해야하는데...
데이터 사이언티스트라고 얘기하기보단 소신을 갖고 얘기하는 편이.. 

  다른 경쟁자에 비해서, 어떤 우월점을 가지고 있죠? 압박이 아니라..  
 

 최근에 딥러닝은 ROI가 안좋아

  
  당신을 왜 뽑아야하나요?  
 

 데이터 엔지니어

 

1. 대용량 인프라구축

2. 로그 플로우 디자인

3. 실제 서비스 인프라의 베이스라인을 잡음 

  머신러닝 엔지니어 

빅데이터 인프라 활용

현실 서비스에 유용한 feature를 적용 및 서비스 개선

연구의 현실성/타당성을 검증한 뒤 실제적용 

  선행연구 엔지니어

 계속 갈 수는 없을듯? 예) 네이버렙스->분사. 카카오AI도 마찬가지.

논문이나 선행 획득해야하는 기술을 follow up

가장 관심이 높은 분야

모두 살아남기 어렵다 

 CRM

모든 고객의 가치는 동일한가? 악플을 다는 사람은 어떤 가치인가?

1. 돈을 많이 쓰는 고객

2. 일반고객

3, 불량고객 

Background: 본인이 잘 아는 부분에 대해, 악플을 많이 달긴 하더라. 전체서비스에 대해 불만이 다 있는 것은 아니고, 특정 컨텐츠에 대해서만 불만이 있거나 

 

 비용관점 vs 모객 관점?

유지비용보다 더 큰 이익이 되는 고객만 vs 고객 한명이라도 더 모집 

 
 

 자발적 이탈 vs 비자발적 이탈

예) 비자발적 이탈: 사용요금 미수

자발적이탈모델을 만들 때는 비자발적 이탈 사용자는 제외하고 모델을 만들어야함.

 

 조기사망/사고사/자연사

- 게임사: 게임 컨텐츠를 충분히 즐기고 그만두는 경우 

- 사고사: 중간에 다른 외부요인으로 그만두는 경우

- 조기사망: 조기 이탈

 

 화장품(아모레퍼시픽) - CRM

 한 번만 (단일 구매 행동) 구매전략을 세우기 위해서, 분석대상에 포함시킬 것 인가?   한번만 사는 사람들은 자기 니즈에 있어, 크로스셀링의 관점에서는 고객이 아닐 수 있다(?)
  카테고리까지는 추천해주는 경우는 안산제품중에서 어떻게 추천해줄것인가? 특정제품을 더 추천해줄것인가? 아니면 카테고리까지만 보여줄것인가?  해당 트렌젝션(립스틱)이 발생한 경우,  A:최대판매량, B:MD추천, C: 인구학적정보가 유사한 인구가 많이 산 제품 등

항공사

 신규 노선 또는 부진노선을 이용할 확률이 높은 고객을 사전에 예측하고, 그 고객의 속성을 파악할 수 있다면?

Background:  항공사는 대부분 에이전시를 이용해서 판다. 

 상용수송: 사람을 태우는게 아니라, 화물운송등.. (여행이 45% 나머지가 55%가 화물운송)

- 대부분 노선을 1회 이용한다.2~5회 이상은 왔다갔다하는 거일 수 있음

- 대상기간 내 한번만 가는 경우-> 연관성분석하기가 어려움.

- 과거 노선이 현재 폐지되었을 수 있음.

- 한 도시에 여러 공항이 생겨있을 수 있음.

 - Web graph로 시각화 하여+ Assocication Rule 적용 (룰적용시에는 min_sup을 결과보면서 조정을 해야할 듯)


Support 을 기본적으로 보고, Lift 1이상을 보는 게 좋을듯

 컨텐츠(카카오)

 서비스 이탈 vs 작품이탈

지금까지 쭉 읽고있었는데, 매일보다가 안들어오는 경우. 전체 컨텐스 서비스가 아니라, 서비스내 작품 내 관점

이탈이 되기전 관리하자

 

 

이탈 가능성 변수를 생성 

 

[열람패턴]

작품수와 열람수가 줄어드는자

열람 패턴이 불규칙한지

여 장르를 보는사람이 낮고

영화 또는 방송만 보는 사람은 이탈가능성이낮다

최신편수가가 많을수록 가능성 낮음

[작품] 연재종료/휴재 

[유상구매] 유상구매를 하는 사람일수록

[이탈경험] 복귀기간, 이탈경험

[환경] 여러 단말기일수록 낮을듯

컨텐츠(NC소프트)

 프로젝트 했던 과정에 대한 질문

 실무진면접

 
 

 입사 후 진행하고 싶은 프로젝트에 대화

  

 

 전직장 퇴사이유에 대한 질문

 

 

 카카오

#graph 이론
#tree 이론
#quick_sort 구현
#divide and conquer이 쓰인 유명한 알고리즘 예시
#l1, l2 차이 비교. 하는 이유
#likelihood의 개념, 확률과 likelihood의 차이
#코드에서 time이 얼마나 걸릴지? O(n2) 등등 
  
    


딥러닝은 병렬처리 가능/ SVM은 병렬처리의 최적화가 어렵다다던데;;


Background


고객획득과정: 예) 5억들어 MASS 광고(방문자 10만명) -> 2주생존율 (10%, 방문자 1만명) -> 구매 전환율 (50%, 방문자 5천명).

AARRR: 고객 획득과정:

 -> Acqusition, Activation, Retention, Referral, Revenue 구매전환율을 고려해서 역산해서 광고비를 계산해서 비용을 산정하기도 함

https://www.greensystem.vn/en/blog/product-manager-framework-aarrr-metrics.html


신용평점모형(평점표 모형, Scorecard model)




Abbreviations


 CLTV(Customer Life Time value)

 AARRR model: Acqusition, Activation, Retention, Referral, Revenue 


반응형

'Data science' 카테고리의 다른 글

오토마우스: 간호사, 의사 보수교육 사이버연수 자동클릭  (0) 2022.10.29
Data structure  (0) 2020.01.28
Network analysis  (0) 2019.11.20
Undersampleing & Oversampling  (0) 2019.07.08
Regular expression  (0) 2019.03.12

Network 이란? Nodes와 Ties로 구성되어있는 개체. 텍스트로 구성되어있는 것을 semantic network.


Nodes: 단어/객체

Ties


- Ties: 정의 단어들간의 관계. 이 관계를 중요하게 고려해야한다. Co-occurence을 기준으로(Within 문장/문단/문서). 예를 들어, 문장 내에서 동시에 출현하는 것을 한 동시출현으로 볼것인지, 문단으로 볼것인지, 문서로 볼 것인지. 이 정보를 추출 하는 것이 가장 중요하다.

- Weight: Co-occurences

- Direction /


Objective


1. 단어의 공통적인 출현(단어 사이의 유사도)

2. 선택된 단어에 대해서, 어떤 관계를 맺고이는지를 확인할 수 있다. 문서마다 얼마나 다른지도 확인 할 수 있음. (관계가 같다 라는 귀무가설을 두고 통계적 검정을 할 수 있다. 네트워크끼리도 샘플링 분포를 그려서 차이를 둔다. 샘플링 분포를 시뮬레이션 방법으로 사용한다(Montecalo marcov chain)

 - 시뮬레이션을 할 때, 리샘플링(Resampleing)을 주로하는데: Bootsraping(replacement) / Permuation(without replacement)이 있다. 

3. 문서나 단어의 특성을 표현(For embedding, vectorization)


*단어를 선택할 때, 1) 이론적인 백그라운드를 이용하여 선택하거나, 단어의 빈도(예, 탑10 단어)를 이용해서 선택함

각각의 노드에 대한 측정값

Degree centrality: degree(직접적으로 연결된 다른 노드의 수)가 얼마나 많은지. 해당노드의 degree / N -1 (N: 노드 수)

Betweeness centrality: 해당 노드가 다리 역할을 하는지 안하는지 

(sigma_st = node s 부터 node t까지의 가장 짧은 path의 총 합. sigma_st(v):은 v을 통해서 가는 가장 짧은 path의 수

Clossness centrality: 다른 노드와 더 가깝게 연결된 노드가 더 중심적인 역할.

Eigenvector centrality: 다른 노드의 중심도에 의해 해당 노드의 중심도가 결과. 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import networkx as nx
import itertools
 
= nx.Graph()
g.nodes()  # 노드 확인
g.add_nodes_from(unique_nouns)
 
for pair in list(itertools.combinations(list(unique_nouns), 2)):
    if pair[0== pair[1]:
        continue
    for sent in final_sentences:
        if pair[0in sent and pair[1in sent:
            if pair in list(g.edges()) or (pair[1],pair[0]) in list(g.edges()):  # Tie가 이미 있으면 가중치 추가
                g[pair[0]][pair[1]]['weight'+= 1  # 1 증가
            else:
                g.add_edge(pair[0], pair[1], weight=1 )  # Tie가 없으면 이미 가중치 감소
                
g.edges()  # EdgeView: 엣지확인
g['carrot']  # 해당 노드에 대해 어느정도 가중치가 있는지
cs



Quadratic Assignment procedure


Tie

Simulation 방법중 resampling 을 사용한다. iid에 영향을 받지 않는다. 노드 생기는건 iid가 아니다. Simultion 

두 네트워크 내의 차이가 얼마나 차이가 나는지지를 QAP을 이용해서.

Square matrix간의 correltation. 인접행렬


gcor 값가지고는 p-value차이가 안나는데,

QAP을 가지고 차이가 있는지 확인할 수 있다.


반응형

'Data science' 카테고리의 다른 글

Data structure  (0) 2020.01.28
데이터사이언티스트 면접  (0) 2020.01.15
Undersampleing & Oversampling  (0) 2019.07.08
Regular expression  (0) 2019.03.12
머신러닝 모델 분류  (0) 2019.03.12

2013년에 인공신경망 분야의 유명한 컨퍼런스인 신경정보처리시스템(NIPS, Nueral information processing systems)에 소개된 논문입니다. 단어나, 진단명, 음식명 등과 같이 어떤 개념들을 임베딩할 때 사용할 수 있을 것 같아, 공부겸 아래와 같이 국문번역을 진행해봤습니다.


원문: Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., & Dean, J. (2013). Distributed representations of words and phrases and their compositionality. In Advances in neural information processing systems (pp. 3111-3119).





Requirement Background knowledge



조밀행렬간의 곱(Dense matrix multiplication): 

(source : https://github.com/maxeler/Dense-Matrix-Multiplication)


Skip-gram:







Abstract


  최근 소개된 Continous Skip-gram 모델은 간결한 구문이나 의미론적 단어 관계를 활용할 수 있는 분산벡터표현모델이다. 본 연구에선는 벡터와 훈련속도를 향상시킬 수 있는 여러가지 모델들을 제안한다. 출현빈도가 높은 단어들을 샘플링함으로서,  본 연구에서는 좀 더 일반적인 벡터표현을 학습하고, 속도를 향상시킬수 있었다. 또한, 이에 계층적 네거티브 샘플링(Negative samping)이라고 부르는 소프트맥스(Hierachial softmax)에 대한 대한도 제시한다. 벡터표현에 대한 제한점은 단어의 순서에 대한 차이가 없단는 것과 관용구같은 표현이에 대해서는 표현이 불가능하다는 것이 있다. 예를 들어 'Canada' + 'Air'의 합친 의미는 'AirCanada'라고 할 수 없다. 이러한 예제로부터, 텍스트 내에 구의 의미를 찾는 간단한 방법을 제시하고, 많은 구에 대한 훌륭한 벡터표현을 학습하다는 것이 가능함을 보였다.




Introduction


  벡터공간에서의 단어의 분산표현(Distributed representation)은  유사한 단어를 그룹핑 하고, 벡터공간에 표현할 수 있게 함으로써 알고리즘을 학습시키는 것을 가능하게 자연어처리분야에 큰 진보를 가져왔다. Rumelhart 외 2인이 1986년에 제한 방법이 가장 초기에 제안된 방법인데, 이러한 방법은 통계적인 방법을 이용하였다. 이후에, 벡터표현은 기계번역이나 자동음성인식 등 자연어처리 여러분야에 응용되어 사용되었다.

  최근에 Mikolvo et al 은 Skip-gram 모델을 소개했는데, 많은 양의 비정형 텍스트에 대해서도 단어의 향상된 벡터표현을 가능하게 했다. 이전에 사용되었던 신경망구조와는 달리, Skip-gram은 조밀행렬간의 곱(dense matrix multiplications)을 하지 않는다. (역주: Requirment에 제시한 그림과 같이 행렬이 매우 큰 경우에 각 연산을 하려면 상당한 계산비용이 드는데 이러한 과정이 없다는 의미이다.) 반면 아래와 같이 (Figure 1), 각 벡터를 신경망으로 연결해서 표현하기때문에, 계산비용에 있어 요율적이다. 


 인공신경망을 이용한 단어의 표현은 학습된 벡터를 명시적으로 많은 패턴들로 인코딩해주기 때문에 매우 흥미롭다. 또한, 많은 패턴들이 선형해석으로 가능하다 (역주: 선형으로 연산하면 우리가 알고있는 연산처럼 생각할 수 있다는 의미로 생각됨. 다음의 예시를 참고) . 예를 들어, 벡터(Madrid) - 벡터(Spain) + 벡터(France)을 하면 벡터(Apple)과 같은 벡터보다, 나라-수도의 관계이기 떄문에, 벡터(Paris)가 나올 것이다.


 본 연구에서는 원래 Skip-gram 모델을 여러가지를 활용하여 발전시킨것을 소개한다. 본 연구는 훈련과정에서 출현빈도가 높은 단어들을 샘플링하여 훈련속도를 약 2배에서 10배까지 향상시킨 결과를 보여줄 것이고, 상대적으로 출현빈도가 낮은 단어에 대해서도 좀 더 향상된 단어의 표현이 가능했음을 보여줄 것이다. 또한, 노이즈대조추정(Noise Contrastive Estimation, NCE)의 간단한 변형을 제시하여, Skip-gram의 훈련속도를 향상시키고, 사전연구와 비교했을 때 출현빈도가 높은 단어의 표현이향상됨을 보여줄것이다.


 단어의 표현은 관용적표현구 각각 분리할 수 없는 것에 대해서는 불가능하다는 것에 제한점은 있다. 예를 들어, 'Boston Globe'는 신문인데, 이를 'Boston'과 'Globe'로 분리하여 의미를 조합하면 젆혀 다른의미가 되기 때문에 이러한 과정에는 제한이 있다. 그러므로, 단어를 나누지말고 전체 구(global phrases)을 한번에 벡터로 표현하는 것이 더 표현이 정확할 수 있다. 그외, 단어의 벡터를 구성하는 목적으로사용될 수 있는 Recursive autoencorder가 이러한 경우에 사용될 수 있다.


 단어기반부터 구 기반까지의 모델의 활용인 상대적으로 간단하다. 첫째로, 우리는 많은 구를 활용하여, 각각의 구를 토큰화(tokenization)하여 각각 토큰을 훈련에 사용하였다. 이렇게 사용된 구의 표현을 제대로 벡터에 표현되었는지 확인하기위해서, 단어와 구를 포함하는 유추문제를 테스트 세트로 개발하였다. 전형적인 유사적 쌍은 "Montreal":"Montreal Canadien"::"Toronto":"Toronto Maple leaf"인데, Montreal Canadien - Montreal + Toronto 를하면 Toronto Maple leaf가 나온다는 것을 확인했다. (역주: 몬트리얼 케너디언은 하키팀이고, 토론토 메이플 리프도 케나다팀이다. 따라서 몬트리얼이라는 지역을 제외하면, 하키팀이라는 개념만 암고, 토론토를 추가했으므로 토론토 하키팀이 되야하므로 Toronto maple leaf가 나온 것이다.)


 마지막으로, Skip-gram의 또다른 성질에 대해서 설명할 것이고, 간단하게 벡터를 더하는 것이 새로운 의미를 줄 수 있다는 사실을 확인했다. 예를 들어, '러시아'+'강(River)'는 ''볼가강"과 유사도가 높고, "독일"+"수도(Capital)"은 "베를린"과 유사도가 높음을 확인했다.



The Skip-gram model


Skip-gram 모델의 훈련 목적은 문헌 내에 주변단어들을 예측할 수 있는 단어의 표현을 찾는 것이다. 더 정확히는 어떤 문장이 w1, w2, w3... wt의 단어의 조합으로 이루어졌을때, Skip-gram의 훈련 목적은 평균 로그 확률(the average log probability)을 최대화 하는 것이다. 본 문헌에서는 축약된 내용이 너무 많아, "word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method." 논문을 따라서 설명하는 것이 더 편할 것 같아 다음과 같이 추가하였다. 


앞서, 몇가지 용어를 정의할 필요가 있다.

  • Corpus (말뭉치): 문장의 조합
  • Context : 현재 단어의 예측하고자하는 주변단어
Word2vec의 훈련단

 w을 단어의 뭉치(corpus)라고하고, 그 주변문맥을 c라고 하자. 그러면 이는 조건부 확률로 어떤 단어 w가 나오면, c가 나올 확률을 제시할 수 있는데 이를 표기하면 다음과 같다.


그리고, 어떤 문헌이 같이 주어졌을 때, 파라미터(ceta)을 찾기위해서는 아래와 같이 말뭉치의 확률을 최대화 하는 방향으로 최적화를 한다. 예를 들어, 원문이 "나는 사과를 먹는다"였다라고 하면, [   ] 사과를 [    ] 에서 앞단어와 뒷단어를 찾는 확률을 구하는 것이 Skip-gram의 주 목적인데, 여기서 w가 '사과를'을 의미하고 전/후 단어가 c을 의미한다. 위와 같은 상황에서, 텍스트 전체가 있고, 최적화하고싶은 파라미터가 있는 경우에는 다음과 같은 조건부 확률을 최대화 하는 방향으로 모델을 만들어야한다. 여기서 c(w)은 단어 w 에대한 세트이다. 




w는 단어를 의미하고. Wo는 출력될 단어, Wi는 입력되는 단어를 의미한다. 또한, p(w|w) 은 다시 아래와 같은 수식을 따른다.

(source:https://arxiv.org/pdf/1402.3722.pdf)



Vw는 입력 단어가 표현된 벡터를 의미하고 ,V'w은 출력단어에 대한 벡터의 표현값이다. 


위의 식과 아래 식을 종합해보면, 첫번째 식 1/T * sum (sum())을 최대화 하려면, 결국에 log p(w|w)가 최대화 되어야한다. 결국 p(w|w)가 최대화 되어야한다는 의미이다. p(w|w)가 크려면 결국 분자가 커지거나, 분모가 작아져야하는데 그러려면 아래와 같은 수식으로 다시 풀어서 쓸 수 있을 것 같다. 분자가 최대화 된다는 말은 









Q. Skip-gram의 가중치의 전치행렬이 다를수 있다는데, 이게 다를수가 있나?


food2vec을 만들어서 특정 원소를 보면, 가공식품에 대한 요소가 있을거고, 어떤 요소를보면 다이어트에 유리한 요소가 잇을 것인데 이러한 요소에 대한 차이를 확인해보자.

반응형

SMOTE



반응형

'Data science' 카테고리의 다른 글

데이터사이언티스트 면접  (0) 2020.01.15
Network analysis  (0) 2019.11.20
Regular expression  (0) 2019.03.12
머신러닝 모델 분류  (0) 2019.03.12
Reshape and Pivot table  (0) 2019.03.08






파이썬은 컴파일 언어인가? 인터프리터 언어인가?



 컴퍼일 언어는 원시코드를 컴파일이라는 과정을 통해 기계여로 번역한 파일을 만들고, 만든 파일만을 가지고 파일을 통해 실행시킨다. 즉실행파일만 미리 만들어두는 것이다. 그러나, 컴파일 과정이 오래걸리고, 실행시키는 컴퓨팅 환경에 많이 영향을 받지만, 컴파일 파일(실행파일)만 있으면 되니까, 매우 빠른 속도로 실행될 수 있다. 

 예) C, C++


 인터프리터 언어


 - 인터프리터(해석기)에 의해서 원시 소스코드(진짜 코드)를 한 줄씩 읽어 실행하는 언어이다. 즉 Line by Line으로 읽을 수 있다.

 - 컴파일 언어보다 더 느리게 실행된다. 이는 미리 컴파일 시켜놓아, 바로 실행되는 형태가 아니기 때문이다.

 - 장점으로는, 코드를 빠르게 실행시켜볼 수 있고, 대화식(내가 입력하면서, 컴퓨터가 바로 출력하는 형태)로 코드를 개발 할 수 있기에, 교육용으로 사용되는 경우가 많다.

 - 예, Python, JavaScript, PHP





파이썬 개요 및 특징


파이썬은 1989년 귀도 반 로섬에 의해 개발되었다.


특징으로는 다음과 같다

    • 플랫폼 독립적: 이는 어느 운영체제 관계없이, 또는 PC, 모바일등과 같이 다른 환경에서 사용 가능하다는 의미이다. 
    • 인터프리터식: Line by line + 대화식으로 사용가능
    • 객체지향적: 자료형을 숫자, 문자, 자료구조들을 파이썬 객체라고하는 어떤 상자안에 저장된 형태로 만들어 사용
    • 동적 타이핑 대화형언어(dynamically typed): 예를 들어, 변수 A를 문자형으로 지정했다고 하고, 이를 숫자형으로 마음대로 바꿀 수 있다. 다른 언어들은 미리 메모리 공간을 잡아 놓기 때문에, 변수의 형태를 마음대로 변경하는것을 지원하지 않는다. (=This implies that dynamic typed languages do not require the explicit declaration of the variables before they’re used) [1]
    • 기본 제공하는 함수(기능)은 거의 없고, 대부분 많은 기능이 라이브러리로 구성됨


요약하자면, 가독성(문법 간결), 확장성(라이브러리), 접착성(C로 구현된것도 쉽게 만들어 붙일 수 있음, 반대도 가능), 유니코드, 동적타이핑(동적언어 + 인터프리터 언어)




파이썬의 메모리관리: 저수준컴퓨팅 ~ 가비지 컬렉션 & 레퍼런스 카운팅


파이썬의 뒷단에는 내가 지정한 변수들을 어떻게 관리하고, 메모리를 어떻게 할당/관리하는지에 대하 설명이다. [2]저수준(Low-level computing) 컴퓨팅과, 파이썬에서의 저수준 컴퓨팅, 내부 메모리 관리 알고리즘에 대해 추가적인 이해를 하고 싶다면, 본 섹션을 참고하길 바란다.

 우선, 우리가 A4용지내에 수학문제를 풀고자한다면, 변수와 공식들을 써내려가면서 문제를 풀고자 할것이다. 이처럼 메모리 자체를 어떤 공책이라고 생각하면 편하다. 메모리(A4노트, 또는 책)에 변수를 지우개로 지워서 다시쓸수도있고, 더 추가적으로 쓸수도 있고, 내가 갖고있는 공책(메모리)가 부족할 수도있다. 그러나, 우리는 노트 장 수가 한정적이기 때문에 메모리 관리에 대해 배울 필요도 있다. 또한, 여백의 A4공간을 어떻게 공식을 써내려갈지도 고민해야한다. 다행히 히는 파이썬에서 알아서 해준다.



CPython?

우선, 파이썬 기본 실행(Default Python Implementation)는 CPython이라는 C로 써진 것인데, pyc파일 이나 pycache 폴더를 본적 이 있다면, 이는 bytoecode로 가상환경에서 인터프리팅된것이다. CPython도 있고, IronPython(MS에서 다운)도 있고, Jypthon도 있고.. 여러가지가 있다. 우선 여기서는 CPython에서도만 이야기하자면, Cpython은 위에서 언급했듯이 C로 쓰여진것이고, 파이썬 bytecode을 인터프리팅 하는 실행계획 같은거다. 이 CPython에 메모리 관리에 필요한 구조와 알고리즘 코드가 들어있다. 따라서, 파이썬의 메모리 관리를 알고자한다면, 우리는 CPython에 대해 좀더 이해를 한다.


CPython도 역시 객체로 구성되어있는데, (예를 들어, 파이썬에 string type)같은 것이다. PyObject라고 불린다. 이 PyObejct는 모든 파이썬 객체의 조부모에 해당하는 객체인데 Ob_refcnt, ob_type을 포함하는데 이에 해당하는 설명은 다음과 같다.

  • ob_refcnt: 레퍼런스 수(Reference count)
  • ob_type: 포인터(다른 타입을 지정하는 포인터)

레퍼런스 카운터는 가비지 콜렉터(Garbage collection)에 사용되고, pointer는 실제 오브젝트의 타입을 가리키는데 사용된다. 오브젝트 타입은 파이썬 오브젝트에서 사전형(dict)s나 숫자(int)형과 같은 것을 설명하기위한 구조이다.


Carbage collection(가비지 콜렉터)

다시 A4 용지에 수학문제를 풀고자한다고 생각해보자. 임의로 변수 X에 대해서 식을 풀어쓰다가 Z가 필요해서 써내려갔다. 그런데 사실 Z는 안쓰게되서 A4 한구석에 Z라고만 써놓기만했다면, 수식에서는 전혀 쓸모가 없기때문에, Z를 지워도 무관할 것이다. 이와 같이, 파이썬 코드내에서 언급이 되지 않는(Unreferenced) 객체들은 지워야하는데, 이럴 때 Reference count가 0인 경우에 그 파이썬 객체를 삭제하게 된다. 레퍼런스 카운트에 대해서 조금 더 자세한 예를 들면, 아래와 같다.


1
2
3
4
5
6
7
ref = [5,6,7]
# ref 객체가 5,6,7을 가르키고 있기 때문에, 레퍼런스 카운트가 1이다
my_ref = ref
# 또한, my_ref가 ref의 주소를 가리키지만, 이는 사실 [5,6,7]을 가르키기 때문에 레퍼런스 카운트가 2이다.
 
my_sum = sum(my_ref)
# 이렇게 원래 주소값이 있던 것을 계속 참조하게되면, 레퍼런스 카운트가 올라간다.
cs

객체 ref가 [5,6,7]을 직접 저장하고 있는것이 아니라, 주소값만 가지고 [5,6,7]을 가르키고 있는 것이다. 그렇기 때문에 이에 대한 레퍼런스카운드가 1이다. 3번라인은 my_ref객체가 ref객체를 가르키는 것처럼보이지만, 사실은 ref가 가지고있는 [5,6,7]에 대한 주소를 가르키기 때문에 my_ref 도 [5,6,7]을 가르키는 주소값만 가지고 있다. 즉 1번과 3번라인의 주소값이 동일하게 가르키고 있기 때문에 레퍼런스 카운트가 2이다. 이는 id(ref) 와 id(my_ref)을 출력해보면 동일한 주소값을 가지고 있음을 알 수 있다. 또한 6번라인처럼, 이전에 주소값에다가 연산을 또 하면 레퍼런스 카운트가 증가한다. 이처럼 레퍼런스 카운트가 증가하는 반면, 필요가 없는 경우 삭제되는데, 레퍼런스 카운트가 0이 되는 경우 변수를 삭제한다.


CPython의 메모리 관리 

Python Carbage collection, reference counting 썬 [작성중]..



[3]


반응형

'Data science > Python' 카테고리의 다른 글

Hashable 이란? 쉬운 설명: python  (0) 2020.10.10
numpy debugging  (0) 2020.02.08
python 시각화 : Seaborn  (0) 2019.06.10
Python 시각화: 기본  (0) 2019.05.30
3. Numpy 한 페이지 요약  (0) 2019.05.13

+ Recent posts