MATLAB에서 K-최근접 이웃 찾기

Ammar Ali 2023년6월20일
MATLAB에서 K-최근접 이웃 찾기

이 튜토리얼에서는 MATLAB에서 knnsearch() 기능을 사용하여 k-최근접 이웃을 찾는 방법에 대해 설명합니다.

MATLAB에서 knnsearch()를 사용하여 K-최근접 이웃 찾기

k-최근접 이웃이라고도 하는 KNN은 데이터 세트에서 포인트의 k-최근접 이웃을 찾는 데 사용되는 분류 알고리즘입니다. 예를 들어, 병원 환자의 데이터가 포함된 데이터 세트가 있고 나이와 체중을 추측할 수 있는 사람을 찾고자 합니다.

우리는 병원에 있는 모든 환자의 나이와 체중, 찾고자 하는 사람의 추정된 나이와 체중을 KNN 알고리즘에 전달할 수 있으며, 알려지지 않은 사람과 가장 가까운 환자 데이터를 반환합니다. MATLAB의 knnsearch() 기능을 사용하여 위 작업을 수행할 수 있습니다.

알려진 환자의 나이와 체중을 knnsearch() 함수 내부의 첫 번째 인수로 전달하고 알려지지 않은 사람의 나이와 체중을 두 번째 인수로 전달해야 합니다. 이 함수는 알려지지 않은 사람과 가장 가까운 데이터 세트에서 인덱스 또는 행 번호를 반환합니다.

예를 들어 MATLAB에 저장된 병원 데이터 세트를 사용하여 나이와 체중에 따라 알려지지 않은 사람을 검색해 봅시다. 아래 코드를 참조하십시오.

clc

load hospital;
X_data = [hospital.Age hospital.Weight];
Y_data = [30 162];
Ind = knnsearch(X_data,Y_data);
hospital(Ind,:)

출력:

ans =

               LastName             Sex     Age    Weight    Smoker    BloodPressure      Trials
    HLE-603    {'HERNANDEZ'}        Male    36     166       false     120          83    {1×2 double}

위의 코드에서 병원 데이터셋은 환자 100명의 이름, 성별, 나이, 체중, 혈압, 흡연 정보를 담고 있다. 데이터 세트의 내용을 보려면 작업 공간 창 내부에서 데이터 세트를 두 번 클릭하여 열 수 있습니다.

이 예에서는 알 수 없는 사람에 대한 정보만 알고 있기 때문에 연령 및 체중 매개변수만 사용했지만 다른 매개변수도 사용할 수 있습니다.

KNN 알고리즘은 가장 가까운 이웃 하나만 반환했지만 K 인수를 사용하여 가장 가까운 이웃의 수를 설정하고 가장 가까운 이웃의 수를 정의할 수도 있습니다.

또한 NSMethod 인수를 사용하여 가장 가까운 이웃을 찾는 데 사용되는 방법을 설정할 수 있으며 그 후에 euclidean, cityblock 또는 chebyshev와 같은 방법 이름을 정의할 수 있습니다.

또한 Distance 인수를 사용하여 기본적으로 euclidean으로 설정된 점 사이의 거리를 찾는 데 사용되는 방법을 변경할 수 있습니다. 그런 다음 seuclidean, cosine 또는 cityblock과 같은 방법의 이름을 정의할 수 있습니다.

기본적으로 KNN 알고리즘은 50개의 포인트를 리프 노드로 사용하지만 BucketSize 인수를 사용하여 변경하고 포인트 수를 전달할 수도 있습니다. KNN 알고리즘은 주어진 데이터에서 클러스터를 만들고 버킷 크기를 늘리면 포인트가 많은 클러스터가 줄어듭니다.

knnseach() 함수가 반환하는 인덱스는 기본적으로 정렬됩니다. 그러나 SortIndices 인수를 사용하여 정렬 프로세스를 끄면 인덱스의 원래 순서를 얻을 수도 있습니다. 그런 다음 false를 전달해야 합니다.

예를 들어 위에서 설명한 속성을 변경하고 결과를 살펴보겠습니다. 아래 코드를 참조하십시오.

clc

load hospital;
X_data = [hospital.Age hospital.Weight hospital.Smoker];
Y_data = [30 162 true];
Ind = knnsearch(X_data,Y_data,'K',2,'NSMethod','euclidean','Distance','chebychev','SortIndices',false);
hospital(Ind,:)

출력:

ans =

               LastName             Sex
    HLE-603    {'HERNANDEZ'}        Male
    VRH-620    {'MITCHELL' }        Male


               Age    Weight    Smoker
    HLE-603    36     166       false
    VRH-620    39     164       true


               BloodPressure
    HLE-603    120          83
    VRH-620    128          92


               Trials
    HLE-603    {1×2 double}
    VRH-620    {1×0 double}

위의 코드에서는 알 수 없는 사람이 흡연자인지 여부를 고려하여 데이터 세트의 또 다른 매개 변수인 Smoker를 포함했습니다. 이제 알 수 없는 사람의 데이터에 가까운 두 명의 환자가 있음을 출력에서 볼 수 있습니다.

위의 예에서는 한 사람의 최근접이웃만 확인했지만 여러 사람의 최근접이웃도 찾을 수 있습니다. 위의 속성은 데이터 세트에 따라 결과가 변경될 수 있습니다.

knnsearch() 함수는 k-가장 가까운 점을 찾지만 주어진 점까지의 특정 거리 내에서 가장 가까운 모든 점을 찾으려면 MATLAB에서 rangesearch() 함수를 사용할 수 있습니다. rangesearch() 기능에 대한 자세한 내용은 이 링크를 확인하십시오.

knnsearch() 기능을 사용할 때의 문제는 코드가 실행되는 시스템에 따라 큰 데이터 세트에서 시간이 걸린다는 것입니다. 그러나 기계 학습에서는 코드가 정말 빠르기를 원하므로 프로세스를 교육과 테스트로 나눕니다.

훈련 과정에서 주어진 데이터 세트에 대해 모델을 훈련하는데 시간이 좀 걸립니다. 학습된 모델을 저장하고 입력에서 출력을 예측하려는 경우 사전 학습된 모델을 사용하여 몇 초 안에 결과를 예측할 수 있습니다.

KNN 분류기를 사용하여 모델을 교육하려면 fitcknn() 함수를 사용하여 모델을 교육한 다음 predict() 함수를 사용하여 새 입력에 대한 출력을 예측할 수 있습니다.

예를 들어 꽃 데이터 세트를 사용하여 KNN 분류기를 사용하여 모델을 교육한 다음 predict() 함수를 사용하여 꽃 클래스를 예측해 보겠습니다. 아래 코드를 참조하십시오.

clc

load fisheriris
X_data = meas;
Y_data = species;
MyModel = fitcknn(X_data,Y_data,'NumNeighbors',6,'Standardize',1)
X_new = 1;
class_name = predict(MyModel,X_new)

출력:

MyModel =

  ClassificationKNN
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
          NumObservations: 150
                 Distance: 'euclidean'
             NumNeighbors: 6


  Properties, Methods


class_name =

  1×1 cell array

    {'versicolor'}

X_data에는 위 코드에서 꽃의 150개 붓꽃에 대한 꽃잎 측정값이 포함되며 Y_data에는 150개 붓꽃에 해당하는 붓꽃 또는 클래스 이름이 있습니다. 출력에서 볼 수 있듯이 모델에는 3개의 클래스 이름과 각 클래스에 대한 150개의 관측값이 포함되어 있으며 거리를 찾는 방법은 유클리드이고 이웃 수는 6입니다.

우리는 predict() 함수를 사용하여 새 관찰값(1)을 사용하여 클래스 이름을 예측했습니다. 관찰값의 열 벡터를 생성하여 여러 관찰값을 사용할 수도 있습니다.

knnsearch() 함수의 경우와 마찬가지로 가장 가까운 이웃을 찾는 방법, 점 사이의 거리를 찾는 방법, 버킷 크기를 변경할 수 있습니다.

또한 predict() 함수에서 예측 점수와 클래스 이름의 예상 비용이라는 두 가지 다른 출력을 얻을 수 있습니다. 또한 save 명령을 사용하여 훈련한 모델을 저장하고 MATLAB에서 load 명령을 사용하여 언제든지 다시 로드할 수 있습니다.

저장 명령은 .mat 파일을 생성합니다. 이 파일에는 MATLAB의 현재 디렉터리 내에서 교육한 모델이 포함되며 다시 로드하려면 .mat 파일이 현재 디렉터리에 있어야 합니다. MATLAB에서 사용합니다.

saveload 명령의 기본 구문은 다음과 같습니다.

save model_name
load model_name

fitcknn() 함수의 첫 번째 입력 인수는 관측값을 포함하는 테이블이고 두 번째 인수는 예측하려는 클래스 이름을 포함합니다. 범주, 문자열, 논리, 숫자, 셀 또는 문자 배열이어야 합니다.

fitcknn() 기능에 대한 자세한 내용은 이 링크를 확인하십시오.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

관련 문장 - MATLAB Function