본문 바로가기
Programming_Collective Intelligence/8.가격모델링

kNN을 활용한 가격 추정

by 볼록티 2020. 1. 7.
728x90
반응형

 이전에 만든 예제 데이터를 토대로하여 와인의 적당한 가격을 추정해보도록 한다.

 

 kNN(k-nearest-neighbor) 방법을 사용해보자. 우선 해당 물품과 가장 비슷한 것 k 개를 찾아 가격이 같다고 가정을 한다. 그 다음 관심있는 물품과 유사한 물품들을 고르고, 알고리즘이 그들의 평균 가격을 계산한 후 이 물품의 적당한 가격을 추정한다. k 는 마지막 결과를 얻기 위해 평균을 낼 물품의 개수(비슷한거)를 말한다. k가 1이다? 그럼 가장 비슷한거 1개를 뽑아서 그 가격과 완벽히 일치한다고 할 것이다. 2개 이상되야 평균내어서 적당하게 가격을 산정할 수 있을 것이다. 바가지를 좀 덜 쓸 수 있다고 할 수 있다.

 

plt.plot(숙성기간,가격, 'o', color='b')
plt.xlabel('age')
plt.ylabel('price')

 50 개만 추려서 그래프에 기간에 따른 가격을 보았다. 선형적인 느낌보다는 아무래도 등급이라는 또다른 변수가 있기 때문에 쉽사리 어떤 상관성을 찾아보기는 힘들다. 그렇기 때문에 k를 1을 해버리게 되면 너무 편향된 추정치를 얻기 십상이라는 것이다. 주변을 잘 둘러보고 결정해야한다.

 이제 지정한 k개의 유사 그룹을 정하는데 있어서 그 기준인 유사도를 구해보도록 한다.

 

 

 유사도 결정하기 

 유클리디안 거리를 사용한다.

 

import math
def euclidian(v1,v2):
    d=0.0
    for i in range(len(v1)):
        d+=(v1[i]-v2[i])**2
    return math.sqrt(d)

euclidian(x[0]['input'], x[1]['input'])

거리는 53.1730 으로 출력되었다. 쌍이 될 수 있는 모든 경우의 수에 맞게 계산을 하는 것이다.

 

 

 

 kNN 코드

def getdistance(data, vec1):
    distancelist=[]
    for i in range(len(data)):
        vec2=data[i]['input']
        distancelist.append((euclidian(vec1, vec2),i))
    distancelist.sort()
    return distancelist

 위의 함수는 데이터 셋 내의 모든 다른 벡터와 주어진 벡터로 getdistance 함수를호출하여 큰 리스트 안에 결과를 넣는다. 이 리스트를 정렬하여 가장 근접한 물품이 위에 오도록 만든다.

 

 아래의 함수를 통해서 상위 k개의 price의 평균 값을 리턴한다.

def knnestimate(data, vec1, k=3):
    #정렬된 거리들을 얻음
    dlist=getdistances(data, vec1)
    avg=0.0
    
    #상위 k개 결과의 평균을 구함
    for i in range(k):
        idx=dlist[i][1]
        avg+=data[idx]['result']
    avg=avg/k
    return avg
    
    knnestimate(data, (95.0,3.0))
    
    #결과: 32.21257

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'Programming_Collective Intelligence > 8.가격모델링' 카테고리의 다른 글

교차검증  (0) 2020.01.08
kNN + 가중치  (0) 2020.01.07
예제 데이터 셋 생성  (0) 2020.01.07

댓글