[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. 수치여야 알고리즘에 적용이 가능.
      
    
댓글남기기