MATLAB での K 最近傍点の検出

Ammar Ali 2023年6月20日
MATLAB での K 最近傍点の検出

このチュートリアルでは、MATLAB で knnsearch() 関数を使用して k 最近傍を見つける方法について説明します。

MATLAB で knnsearch() を使用して K 最近傍点を見つける

KNN は k 最近傍点とも呼ばれ、データ セット内のポイントの k 最近傍点を見つけるために使用される分類アルゴリズムです。 たとえば、入院患者のデータを含むデータセットがあり、年齢と体重が推測できる人を見つけたいとします。

病院にいるすべての患者の年齢と体重、および KNN アルゴリズムで見つけたい人物の推定年齢と体重を渡すことができ、未知の人物に最も近い患者のデータが返されます。 上記のタスクを実行するために、MATLAB の knnsearch() 関数を使用できます。

knnsearch() 関数内の最初の引数として既知の患者の年齢と体重を渡し、2 番目の引数として不明な人の年齢と体重を渡す必要があります。 この関数は、未知の人に最も近いデータセットからインデックスまたは行番号を返します。

たとえば、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 アルゴリズムは最近傍を 1つだけ返しましたが、K 引数を使用して最近傍の数を設定し、最近傍の数を定義することもできます。

NSMethod 引数を使用して最近傍を見つける方法を設定し、その後、euclideancityblockchebyshev などの方法名を定義することもできます。

Distance引数を使用して、デフォルトでeuclideanに設定されている、ポイント間の距離を見つけるために使用される方法を変更することもできます。 その後、seuclideancosinecityblock などのメソッドの名前を定義できます。

デフォルトでは、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 を含めました。 不明な人物のデータに近い 2 人の患者が出力されていることがわかります。

上記の例では、1 人の最近傍のみをチェックしましたが、複数の人物の最近傍も見つけることができます。 上記のプロパティは、データ セットによって結果が変わる場合があります。

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 の観測値が含まれ、距離を見つけるために使用される方法は euclidean であり、近隣の数は 6 です。

predict() 関数を使用して、新しいオブザベーション (1) を使用してクラス名を予測しました。オブザベーションの列ベクトルを作成することで、複数のオブザベーションを使用することもできます。

また、最近傍を見つけるために使用される方法、ポイント間の距離を見つけるために使用される方法、および knnsearch() 関数の場合に変更したのと同じ方法でバケット サイズを変更することもできます。

predict() 関数から、予測スコアとクラス名の予想コストという 2つの出力を取得することもできます。 save コマンドを使用してトレーニングしたモデルを保存し、MATLAB で load コマンドを使用していつでもロードすることもできます。

保存コマンドは、MATLAB の現在のディレクトリ内でトレーニングしたモデルを含む .mat ファイルを作成します。それを再度読み込みたい場合は、.mat ファイルが現在のディレクトリに存在する必要があります。 MATLAB で使用されます。

save および load コマンドの基本的な構文は次のとおりです。

save model_name
load model_name

fitcknn() 関数の最初の入力引数は観測を含むテーブルで、2 番目の引数は予測したいクラス名を含みます。 これは、categorical、string、logical、numeric、cell、または character 配列である必要があります。

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