기계 학습 알고리즘: KNN 분류기

안녕하세요! 인기 있는 기계 학습 알고리즘인 KNN Classifier에 대해 이야기하는 이 게시물에 오신 것을 환영합니다. 우리는 그것이 무엇인지 살펴보고 파이썬을 사용하여 직접 작성할 것입니다.

이 게시물에서 코드를 찾을 수 있습니다: https://github.com/ashwins-code/machine-learning-algorithms/blob/main/knn-classifier.py

KNN 분류기는 무엇이며 어떻게 작동합니까??



KNN은 K-Nearest-Neighbours의 약자입니다. KNN 분류기는 데이터 조각을 분류하는 일반적인 기계 학습 알고리즘입니다.

데이터 분류는 해당 데이터를 특정 범주에 넣는 것을 의미합니다. 예를 들어 텍스트 데이터를 행복, 슬픔 또는 중립으로 분류할 수 있습니다.

KNN 분류기가 작동하는 방식은 여러 데이터 포인트와 각각의 분류를 포함하는 일부 초기 훈련 데이터를 갖는 것입니다. 새로운 데이터를 분류하라는 요청을 받으면 교육 데이터에서 k개의 가장 가까운 데이터 포인트를 찾습니다(일반적으로 두 포인트 사이의 직선 거리를 계산하는 유클리드 거리를 사용하여 계산됨).

k개의 가장 가까운 데이터 포인트를 얻은 후 이러한 데이터 포인트의 가장 일반적인 분류를 찾아 분류하려는 새 데이터의 분류로 반환합니다.



분류 문제



다음은 우리가 만들려는 KNN 분류기를 사용하여 해결하고자 하는 분류 문제입니다.

RGB 값이 주어지면 빨간색, 파란색 또는 녹색으로 분류하려고 합니다.

RGB 값이 무엇인지 모르는 경우 색상에 빨강, 녹색 및 파랑이 얼마나 많이 포함되어 있는지 보여줍니다. RGB 값에 포함될 수 있는 최대 숫자는 255입니다. 예를 들면 다음과 같습니다.

(255, 200, 140)


첫 번째 숫자는 색상의 빨간색 정도, 두 번째 숫자는 녹색 정도, 세 번째 숫자는 색상의 파란색 정도입니다. 이제 다음이 이해가 되어야 합니다.

(255, 0, 0) #Red
(0, 255, 0) #Green
(0, 0, 255) #Blue


문제의 맥락에서 (195, 50, 0)과 같은 값은 (255, 0, 0)에 가장 가깝기 때문에 빨간색으로 간주합니다.

코드!



먼저 수학적 계산을 위해 numpy를 가져오겠습니다.

import numpy as np


이제 주어진 목록의 모드를 반환하는 함수를 만들어 봅시다.

def get_mode(l):
    mode = ""
    max_count = 0
    count = {}

    for i in l:
        if i not in count:
            count[i] = 0
        count[i] += 1

        if count[i] > max_count:
            max_count = count[i]
            mode = i

    return mode


KNN Classifier 클래스를 생성해 봅시다.

class knn_classifier:
    def __init__(self):
        self.data_points = []
        self.classifications = []

    def add_example(self, data_point, classification):
        #Adding training data points

        #self.data_points contain the data points themseleves, self.classification contain their respective classifications
        self.data_points.append(data_point)
        self.classifications.append(classification)

    def classify(self, input, k = 3):
        #Classifies new data
        classification = sorted(self.classifications, key = lambda x: np.linalg.norm(np.subtract(input, self.data_points[self.classifications.index(x)])))[:k]
        #The above line may seem confusing. It sorts self.classification by the euclidean distance between each classification's respective data point and the input data point
        #"classification" is ultimately sliced to contain the classifications of the k closest data points

        # Returns the final classification
        return get_mode(classification)


마지막으로 새로운 분류기를 설정하고 일부 값을 분류해 봅시다!

classifier = knn_classifier()
training_data_points = [
    [[255, 0, 0], "red"], 
    [[0, 255, 0], "green"], 
    [[0, 0, 255], "blue"],
    [[250, 5, 5], "red"],
    [[5, 250, 5], "green"],
    [[5, 5, 250], "blue"],
    [[245, 10, 10], "red"],
    [[10, 245, 10], "green"],
    [[10, 10, 245], "blue"],
]

for point in training_data_points:
    classifier.add_example(point[0], point[1])

print (classifier.classify([250, 0, 0], k = 3))
print (classifier.classify([100, 180, 50], k = 3))
print (classifier.classify([50, 50, 190], k = 3))


우리의 산출물

red
green
blue


효과가있다! 여기에 모든 코드가 함께 있습니다.

import numpy as np


def get_mode(l):
    mode = ""
    max_count = 0
    count = {}

    for i in l:
        if i not in count:
            count[i] = 0
        count[i] += 1

        if count[i] > max_count:
            max_count = count[i]
            mode = i

    return mode

class knn_classifier:
    def __init__(self):
        self.data_points = []
        self.classifications = []

    def add_example(self, data_point, classification):
        #Adding training data points

        #self.data_points contain the data points themseleves, self.classification contain their respective classifications
        self.data_points.append(data_point)
        self.classifications.append(classification)

    def classify(self, input, k = 3):
        #Classifies new data
        classification = sorted(self.classifications, key = lambda x: np.linalg.norm(np.subtract(input, self.data_points[self.classifications.index(x)])))[:k]
        #The above line may seem confusing. It sorts self.classification by the euclidean distance between each classification's respective data point and the input data point
        #"classification" is ultimately sliced to contain the classifications of the k closest data points

        # Returning the final classification
        return get_mode(classification)


classifier = knn_classifier()
training_data_points = [
    [[255, 0, 0], "red"], 
    [[0, 255, 0], "green"], 
    [[0, 0, 255], "blue"],
    [[250, 5, 5], "red"],
    [[5, 250, 5], "green"],
    [[5, 5, 250], "blue"],
    [[245, 10, 10], "red"],
    [[10, 245, 10], "green"],
    [[10, 10, 245], "blue"],
]

for point in training_data_points:
    classifier.add_example(point[0], point[1])

print (classifier.classify([250, 0, 0], k = 3))
print (classifier.classify([100, 180, 50], k = 3))
print (classifier.classify([50, 50, 190], k = 3))

좋은 웹페이지 즐겨찾기