[Daily Contents] 빅데이터 KNN


KNN

새로운 데이터가 주어졌을 때 기존 데이터 가운데 가장 가까운 K개 이웃의 정보로 새로운 데이터 예측

  • (가)
  탕수육 초밥 짜장면
마이콜 2 8 1
길동 7 2 9
사오정 8 1 7
팔계 1 9 1
오공 9 2 9
둘리 1 8 2
  • (나)
  탕수육 초밥 짜장면
희동 9 1 ??

(가)표를 바탕으로 (나)표의 ?? 칸에 들어갈 데이터를 예측하는 것이 KNN

  • 희동과 음식 취향이 닮은 유저의 데이터를 기반으로 ?? 칸 예측
  • 탕수육, 초밥 데이터를 기반으로 희동과 닮은 음식 취향 유저 추출
  • 해당 유저의 짜장면 데이터들로부터 {평균 혹은 빈도수}를 희동의 짜장면 데이터로 예측

KNN
S1 : 모든 User 데이터와의 거리 계산
S2 : 가까운 거리에 있는 K개의 User 데이터 찾기
S3 : 평균, 빈도 등으로 아이템 선호도 예측

https://github.com/sweetchild222/vanilla-algorithm

k = 3
user = [9, 1, 0]
neighbor_list = [
	[2, 8, 1],
    [7, 2, 9],
    [8, 1, 7],
    [1, 9, 1],
    [9, 2, 9],
    [1, 8, 2]]

prediction = predict(user, neighbor_list, k)

print('Predict %f', % (prediction))
def predict(user, neighbot_list, k):
	k_near_neighbors = get_neighbors(user, neighbors_list, k)

    predict_candidate = [row[-1] for row k_near_neighbors]
    print('predict_candidate : ', predict_candidate)
    prediction = max(set(predict_candidate), key=predict_candidate.count)
    return prediction
def predict(user, neighbot_list, k):
	distances = list()
    for neighbor in neighbor_list:
    	dist = euclidean_distance(user, neighbor)
        distance.append((neighbor, dist))
    distances.sort(key=lambda tup: tup[1])

    print('neighbors distance : ', distances)

    near_neighbors = list()
    for i in range(k)
    	near_neighbors.appned(distances[i][0])

    print('near neighbors : ', near_neighbors)

    return near_neighbors
def euclidean_distance(user, neighbor):
	distance = 0.0
    for i in range(len(user)-1):
    	distance += (user[i] - neighbor[i])**2
    return sqrt(distance)

KNN_Similarity Distance Measure

https://dbrang.tistory.com/1201

Q&A

Q. K가 하나 멀리 떨어져 있을 때는 좋지 않을 듯하다.
A. 좋지 않다. 그런 것은 Noise가 많이 낀 데이터라고 한다.
   그럴 경우 Pre-processing을 거쳐서 Noise를 사전에 제거하는 것 또한 방법.
Q. Euclidean Distance와 Cosine Similarity, Manhattan distance 등과의 차이는?
A. 거리를 재는 방식은 여럿 있고, 위의 예시 외에도 더 있을 수 있다.
Q. 2차원으로 표현되어 간편한데 3, 4차원으로까지 쓰는 경우가 많이 있는가.
A. 3, 4차원, 5차원, 10차원 등 많다. 오히려 2차원인 경우가 적다.
Q. 새로운 데이터가 들어올 때마다 새로 계산해야 하는가?
A. 그렇다.
Q. 데이터 간의 비 수치적 교사성도 점수를 주는 것이 나은가?
A. 수치여야 알고리즘에 적용이 가능.

댓글남기기