1. 강의 자료
https://nlp.stanford.edu/IR-book/newslides.html
2. Rocchio Algorithm
- 연관성 있는 데이터(사용자 입력 - 게시물 클릭)는 올리고 나머지는 떨어뜨리는 식으로 가중하고 평균을 내어 centroid(클래스의 중심점을 만듦)
- 거리를 기반으로 어떤 클래스의 중심점과 가까운지를 판단하고 분류하면 됨
- 다른 두개의 특성을 갖는 하나의 클래스의 중심점을 찾을 경우 엉뚱한 위치에 중심점이 생성되어 잘못된 값을 도출할 수 있다.
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 |