1. 강의 자료

https://nlp.stanford.edu/IR-book/newslides.html

 

2. Rocchio Algorithm

- 연관성 있는 데이터(사용자 입력 - 게시물 클릭)는 올리고 나머지는 떨어뜨리는 식으로 가중하고 평균을 내어 centroid(클래스의 중심점을 만듦)

- 거리를 기반으로 어떤 클래스의 중심점과 가까운지를 판단하고 분류하면 됨

- 다른 두개의 특성을 갖는 하나의 클래스의 중심점을 찾을 경우 엉뚱한 위치에 중심점이 생성되어 잘못된 값을 도출할 수 있다.

 

Rocchio Algorithm의 오류

 

 

2. KNN

- NLP에서는 효율이 꽤나 좋음

- 대상의 주변의 k개만큼 보고 유사한지 확인하는 것

 

 

3. 실습

1) 랜덤 좌표 생성

from random import randint

N = 100
D = list((randint(1, 100), randint(1,100)) xfor _ in range(N))

 

2) 랜덤 좌표 그리기

import matplotlib.pyplot as plt

X = [d[0] for d in D]
Y = [d[1] for d in D]
plt.scatter(X, Y)
plt.show()

 

3) 랜덤으로 생성된 값을 값으로 분류해서 위아래로 나눔

[랜덤값 생성 후 값 분류]

from random import randint

N = 100
D = list((randint(1, 100), randint(1,100)) for _ in range(N))

C = list(0 if sum(d)>100 else 1 for d in D)
sample = (50, 50)

 

 

[출력]

import matplotlib.pyplot as plt

X = [d[0] for d in D]
Y = [d[1] for d in D]

colorMap = ["r", "g", "b"]

for i in range(len(C)):
    plt.scatter(X[i], Y[i], facecolor="none", edgecolors=colorMap[C[i]], linewidths=.5)
    
plt.show()

 

 

 

4) 값분류 테스트

- 50, 50 좌표에 점을 하나 생성하고 주위의 가장 가까운 포인트를 K만큼 뽑고 어디에 가장 많이 속했는 지 확인

[euc, cos 차이 구하는 함수]

from math import sqrt
# rel(d,q) => sim(d,q) n in VS
def euc(x1, x2):
    return sqrt((x1[0] - x2[0])**2 + (x1[1] -x2[1])**2)

def cos(x1, x2):
    innerProduct = x1[0]*x2[0] + x1[1]*x2[1]
    return innerProduct/(euc(x1, [0,0]) * euc(x2, (0,0)))

 

 

[랜덤 값, 중앙 값 생성]

from random import randint
N = 100
D = list((randint(1, 100), randint(1,100)) for _ in range(N))

C = list(0 if sum(d)>100 else 1 for d in D)
sample = (50, 50)

 

 

[주변 데이터와 거리값 구하기]

similarity = [0.0 for _ in range(N)] # 0.0으로 초기화
for i in range(len(C)):
    similarity[i] = euc(D[i], sample)

 

[주변 K개 출력]

K = 9 # 보통 C=짝수이면, K=홀수
candidates = list() # 인덱스
#[(i, s) for i, s in zip(range(N), similarity)]

candidates = sorted(list(enumerate(similarity)), key = lambda x:x[1])[:K]
candidateKeys = [c[0] for c in candidates]
candidateClass = list(0 for _ in range(2))
for i in candidateKeys:
    candidateClass[C[i]] += 1


for i in range(len(C)):
    plt.scatter(X[i], Y[i], facecolor= "k" if i in candidateKeys else "none", edgecolors=colorMap[C[i]], linewidths=.5)
    
    if i in candidateKeys:
        plt.text(X[i], Y[i], candidates[candidateKeys.index(i)][1])
        
plt.scatter(sample[0], sample[1], facecolor="r" if candidateClass[0] > candidateClass[1] else "g", edgecolors=colorMap[-1])
plt.show()

 

 

[각도차 구하기(cos)]

similarity = [0.0 for _ in range(N)] # 0.0으로 초기화(
for i in range(len(C)):
    similarity[i] = cos(D[i], sample)

 

[역정렬하여 출력하기]

K = 9 # 보통 C=짝수이면, K=홀수
candidates = list() # 인덱스
#[(i, s) for i, s in zip(range(N), similarity)]

candidates = sorted(list(enumerate(similarity)), key = lambda x:x[1], reverse = True)[:K]
candidateKeys = [c[0] for c in candidates]
candidateClass = list(0 for _ in range(2))
for i in candidateKeys:
    candidateClass[C[i]] += 1


for i in range(len(C)):
    plt.scatter(X[i], Y[i], facecolor= "k" if i in candidateKeys else "none", edgecolors=colorMap[C[i]], linewidths=.5)
    
    if i in candidateKeys:
        plt.text(X[i], Y[i], candidates[candidateKeys.index(i)][1])
        
plt.scatter(sample[0], sample[1], facecolor="r" if candidateClass[0] > candidateClass[1] else "g", edgecolors=colorMap[-1])
plt.show()

 

4. 확률

- P(X) => Function, 즉 함수이다

- 0~1값으로 나옴

- 어쩌고 저쩌고 이지만 결국 확률에 사전 지식을 반영할 수 있는 모델과 결과값들의 누적에 의해 나타나는 모델이 있다.

D = HHTHT

n = 5

p = @ => 앞면이 나올 확률

k = ah = 3

P(D|@) = @^ah*1-@)^ar

'데이터 분석가 역량' 카테고리의 다른 글

Day 27 ] 기사 분류  (0) 2019.06.10
Day 25 ] Naive Bayes  (0) 2019.06.05
Day 21 ] Project2 유사도 분석  (0) 2019.05.29
Day 20] 내 파일로 분석해보기  (0) 2019.05.29
Day 19 ] Deep Learning  (0) 2019.05.27

+ Recent posts