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
引数を使用して最近傍を見つける方法を設定し、その後、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
を含めました。 不明な人物のデータに近い 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()
関数の詳細については、この リンク を確認してください。