헬창 개발자

KNN 최근접 이웃 [파이썬] 본문

데이터 분석

KNN 최근접 이웃 [파이썬]

찬배 2022. 4. 23. 21:41

1. K-최근접 이웃이란?

K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘은 지도 학습에서 사용되는 간단하고 직관적인 분류 및 회귀 알고리즘입니다. 주어진 데이터 포인트의 라벨을 예측하기 위해, 해당 데이터 포인트와 가장 가까운 K개의 이웃 데이터 포인트를 참조합니다. 이웃들의 라벨 정보를 바탕으로 예측을 수행합니다.

2. KNN 알고리즘의 기본 개념

  • 분류: K개의 가장 가까운 이웃의 클래스 라벨을 확인하고, 가장 많이 등장하는 클래스로 예측합니다. 예를 들어, K=3일 때, 가장 가까운 3개의 이웃 중 2개가 클래스 A에 속하고 1개가 클래스 B에 속하면, 예측 클래스는 A가 됩니다.
  • 회귀: K개의 가장 가까운 이웃의 값을 평균하여 예측 값을 결정합니다. 이웃의 평균 값이나 중간 값을 사용하여 예측을 수행합니다.

3. KNN 알고리즘의 단계

  1. 데이터 준비: 훈련 데이터와 테스트 데이터를 준비합니다.
  2. 거리 계산: 테스트 데이터 포인트와 모든 훈련 데이터 포인트 간의 거리를 계산합니다.
  3. 가장 가까운 이웃 선택: 계산된 거리 기반으로 K개의 가장 가까운 이웃을 선택합니다.
  4. 예측: 선택된 이웃의 라벨을 기반으로 예측을 수행합니다.

 

가정

선택할 후보(K)의 데터의 개수 정하기

-> 이미 알고있다고 가정하며, 전문가에 의해 조정 가능함

동작

주어진 기준 벡터(튜플)에 대하여 각 벡터간의 거리를 계산 -> 유클리드 거리 사용

dist(A,B) = ?

dist(A,C) = ?

dist(A,D) = ?

dist(A,E) = ?

기준 벡터와 가장 가까운 후보(K)개의 벡터 선택

후보의 벡터들의 클러스터를 조사하여 다수결 원칙을 적용하여 기준 벡터의 클러스터 결정

입력데이터

Daniel의 클러스터 분류 하기 -> yes or no

class knnAg:
    def __init__(self, k):
        self.pivot = ['daniel', 37, 50, 2, '?'] # '?' 분류 데이터
        self.table = [['john', 35, 35, 3, 'yes'], # 비교 데이터
                ['rachel', 22, 50, 2, 'no'],
                ['ryan', 63, 200, 1, 'no'],
                ['james', 59, 170, 1, 'no'],
                ['jack', 25, 40, 4, 'yes'],
                ['mitchell', 36, 75, 2, 'yes'],
                ['boris', 44, 65, 3, 'no']]
        self.k = k
        
    def dist(self, v1, v2): # 유클리드 거리 함수
        self.sum = 0
        for i in range(len(v1)):
            self.sum = self.sum + (v1[i]-v2[i])**2
        return self.sum**0.5
    
    def knn(self): # knn
        self.dist_list = []
        
        for i in range(len(self.table)):
            self.d = self.dist(self.table[i][1:4], self.pivot[1:4]) #daniel씨의 모든 거리 구하기
            self.dist_list.append(self.d)
            
        print(self.dist_list)
        
        flag = 0
        for h in range(self.k):
            midx = self.dist_list.index(min(self.dist_list)) #최소 거리 인데스 추출
            
            if self.table[midx][4] == 'yes':
                flag = flag + 1
                print(self.table[midx])
            else:
                print(self.table[midx])
            self.dist_list.pop(midx) # 다음 최소 거리를 위해 팝
            self.table.pop(midx)
            
        if flag > self.k / 2: # 최소거리 flag가 k/2 이상이면 참, 사용자 파라미터
            return 'yes'
        else:
            return 'no'

aaaaaaaaa= knnAg(3) #k=3 개의 비교
aaaaaaaaa.knn()

 

Comments