分類問題研究ノート-KNN原理

最近傍アルゴリズム-KNN

場合:

kNNアルゴリズムの指針となるイデオロギーは、「朱の近くにいる人は赤で、インクの近くにいる人は黒です」であり、あなたの隣人はあなたのカテゴリーを推測することができます。
ことわざにあるように、「物は種類ごとに集まり、人はグループごとに分けられます」。AとBの2人がいると想像してみてください。Aはトムソンの一流の邸宅に住んでいて、Bは郊外の老人に住んでいます。最も直感的な判断は次のとおりです。Aは金持ちである可能性が高い、B珍しいことではありません。AとBの銀行カードの残高は確認していませんが、Aを通じて豊かなコミュニティに住んでいると判断できます。KNNアルゴリズムのアイデアを紹介します:「あなたが近くに住んでいる人は誰でも彼と同じタイプの人である可能性が高い」。

定義-ウィキペディアから:

パターン認識では、k最近傍アルゴリズム(k-NN)は、分類と回帰に使用されるThomasCoverによって提案されたノンパラメトリック手法です。[1] どちらの場合も、入力は特徴空間で最も近いk個のトレーニング例で構成されます。出力は、k-NNが分類または回帰のどちらに使用されるかによって異なります。

  • k-NN分類では、出力はクラスメンバーシップです。オブジェクト
    は、その近傍の複数の投票によって分類され、オブジェクト
    、そのk最近傍の中で最も一般的なクラスに割り当てられます
    (kは正の整数で、通常は小さい)。k = 1の場合、オブジェクト
    はその単一の最近傍のクラスに単純に割り当てられます
  • k-NN回帰では、出力はオブジェクトのプロパティ値です。
    この値は、k最近傍の値の平均です。

原理:

KNNアルゴリズムの原理を一文で説明すると、新しいデータに最も近いK個のサンプルを見つけることであり、サンプルの最大のカテゴリが新しいデータカテゴリとして使用されます。
ウィキペディアの写真からの引用:上の写真に
ここに画像の説明を挿入
示すように小さな青い四角と小さな赤い三角形で表される2種類のサンプルデータと、写真の中央にある緑の円でマークされたデータがあります。分類するデータ。

  • K = 3の場合、緑色の点の最も近い3つの点は2つの小さな赤い三角形と1つの小さな青い正方形です。少数派は多数派に属します。統計的手法に基づいて、分類される緑色の点は赤色に属すると判断されます。トライアングルワンタイプ。
  • K = 5の場合、緑色の点の5つの最近傍は2つの赤い三角形と3つの青い正方形であるか、少数派が多数派に属します。統計的手法に基づいて、分類される緑色の点は青色の点に属すると判断されます。 。正方形の1つのタイプ。

したがって、主に2つの詳細、K値の選択とポイント距離の計算があります。

長所と短所:

利点:

1.シンプルで実装が簡単: KNNアルゴリズムは、実際には最後にモデルを抽象化するのではなく、データセット全体をモデル自体として直接扱います。新しいデータが来ると、の各データと比較されます。データセット。したがって、KNNアルゴリズムの利点のいくつかを見ることができます。まず、アルゴリズムが単純で、トレーニングが不要なほど単純であるということです。サンプルデータが整理されている限り、それは終わり、新しいデータです。予測に使用できます。
2.境界が不規則なデータの方が効果が良い:最終的な予測は、未知のデータを中心点として使用し、円内にK個のデータが含まれるように円を描くことであると想像できます。境界線、それは線形分類器よりも優れています。線形分類器は分類するための線を引くこととして理解できるため、不規則なデータは、それを左側と右側に分割するための線を見つけるのが困難です。

短所:

1.小さなデータセットにのみ適しています:このアルゴリズムが単純すぎるため、新しいデータが予測されるたびにすべてのデータセットを使用する必要があります。したがって、データセットが大きすぎると、非常に長い時間がかかります。非常に大きなストレージスペースを占有します。
2.データの不均衡の影響が良くない:データセット内のデータが不均衡で、一部のカテゴリデータが特に大きく、一部のカテゴリデータが特に小さい場合、この方法は失敗します。これは、特に大量のデータが最終的に投票でより競争上の利点があります。
3.データの標準化を行う必要があります。計算に距離を使用するため、データディメンションが異なる場合、値が大きいフィールドの影響が大きくなるため、データを標準化する必要があります。たとえば、すべてを変換します。 0-1の間隔に。
4.特徴の次元が多すぎるデータには適していません:小さなデータセットしか処理できないため、データの次元が多すぎると、各次元のサンプルの分布が非常に小さくなります。たとえば、サンプルは3つしかなく、各サンプルには1つの次元しかありません。これは、各サンプルの3次元の特徴よりもはるかに明白です。

距離計算:

さまざまな「距離」の適用シナリオを簡単に要約すると、
空間:ユークリッド距離、
パス:マンハッタン距離、
チェスキング:チェビシェフ距離、上記の3つの統一された形式:ミンコウスキー距離、
重み付け:標準化されたユークリッド距離、
寸法と依存関係を除外:マハラノビス距離、
ベクトルギャップ:角度コサイン、
コーディング差:ハミング距離、
セット近似:ジャッカード類似度係数と距離、
相関:相関係数と相関距離。

(興味のある学生は自分で質問できます)
ユークリッド距離などの一般的な使用法:
2次元平面を例にとると、2次元空間内の2点のユークリッド距離の計算式は次のとおりです。

ここに画像の説明を挿入
この中学校には接触した実際には、(x1、y1)と(x2、y2)の距離が計算されます。多次元空間に拡張すると、式は次のようになります:
ここに画像の説明を挿入
最も単純で失礼なKNNアルゴリズムは、予測されたポイントとすべてのポイントの間の距離を計算し、保存して並べ替え、最初のK値を選択してどのカテゴリがもっとたくさん。
最小距離の読み取りを展開します。
ここに画像の説明を挿入

  • p = 1の場合、マンハッタン距離です。
  • p = 2の場合、それはユークリッド距離です。
  • p→∞のときはチェビシェフ距離です

さまざまな変数パラメータによると、最小距離は一種の距離を表すことができます。
標準化されたユークリッド距離(標準化されたユークリッド距離)、標準化されたユークリッド距離は、単純なユークリッド距離の欠点の改善スキームです。標準ユークリッド距離の考え方:データの各次元のコンポーネントの分布が異なるため、最初に各コンポーネントを同じ平均と分散に「標準化」します。
サンプルセットXの数学的期待値または平均(平均)がmで、標準偏差(標準偏差、分散の根)がsであるとすると、Xの「標準化変数」X *は次のように表されます。(Xm)/ s、および標準化された変数の値数学的な期待値は0で、分散は1です。
つまり、サンプルセットの標準化プロセスは次の式で表されます。
ここに画像の説明を挿入

標準化された値=(事前に標準化された値-コンポーネントの平均値)/コンポーネントの標準偏差は、
2つのn次元ベクトルa(x11、x12、...、x1n)とb(x21、x22)を取得するための簡単な導出によって取得できます。 、...、x2n)次の間の標準化されたユークリッド距離の式:
ここに画像の説明を挿入

K値の選択:

一般に、相互検証(サンプルデータは、トレーニングデータと検証データの一部を分割するための6:4など、特定の比率に従ってトレーニングデータと検証データに分割されます)を通じて、小さいK値の選択から開始します。 Kの値を増やしてから、検証セットの分散を計算し、最後に、より適切なK値を見つけます。交差検定によって分散を計算すると、大まかに次のグラフが得られます。
ここに画像の説明を挿入

kを大きくすると、学習するサンプルが多くなるため、一般的なエラー率が最初に減少し、分類効果が向上します。K値が大きいほど、エラー率が高くなります。たとえば、合計35個のサンプルがある場合、Kが30に増加すると、KNNは基本的に無意味になります。したがって、Kポイントを選択するときは、より大きな臨界Kポイントを選択できます。それが増加または減少し続けると、エラー率が増加します。
経験則:kは通常、トレーニングサンプル数の平方根よりも低くなります。

次に、KNNアルゴリズムのアイデアを要約します。

つまり、トレーニングセットのデータとラベルがわかっている場合は、テストデータを入力し、テストデータの特性をトレーニングセットの対応する特性と比較して、トレーニングセット内で最も類似している上位K個のデータを見つけます。に、テストデータが対応します。のカテゴリは、Kデータで最も多く発生するカテゴリです。アルゴリズムの説明は次のとおりです
。1)テストデータと各トレーニングデータ間の距離を計算します
。2)増加する関係に従って並べ替えます。距離の;
3)最小距離Kポイントを選択します;
4)最初のKポイントのカテゴリの発生頻度を決定します;
5)テストデータの予測分類として最初のKポイントの最も高い頻度のカテゴリを返します。

Pythonアイリスの場合:

from sklearn import datasets 
#sklearn模块的KNN类
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
np.random.seed(0)
#设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的

iris=datasets.load_iris() #获取鸢尾花数据集
iris_x=iris.data #数据部分
iris_y=iris.target #类别部分
#从150条数据中选140条作为训练集,10条作为测试集。permutation 接收一个数作为参数(这里为数据集长度150),产生一个0-149乱序一维数组
randomarr= np.random.permutation(len(iris_x))
iris_x_train = iris_x[randomarr[:-10]] #训练集数据
iris_y_train = iris_y[randomarr[:-10]] #训练集标签
iris_x_test = iris_x[randomarr[-10:]] #测试集数据
iris_y_test = iris_y[randomarr[-10:]] #测试集标签
#定义一个knn分类器对象
knn = KNeighborsClassifier()
#调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签
knn.fit(iris_x_train, iris_y_train)
#调用预测方法,主要接收一个参数:测试数据集
iris_y_predict = knn.predict(iris_x_test)
#计算各测试样本预测的概率值 这里我们没有用概率值,但是在实际工作中可能会参考概率值来进行最后结果的筛选,而不是直接使用给出的预测标签
probility=knn.predict_proba(iris_x_test)
#计算与最后一个测试样本距离最近的5个点,返回的是这些样本的序号组成的数组
neighborpoint=knn.kneighbors([iris_x_test[-1]],5)
#调用该对象的打分方法,计算出准确率
score=knn.score(iris_x_test,iris_y_test,sample_weight=None)
#输出测试的结果
print('iris_y_predict = ')
print(iris_y_predict)
#输出原始测试数据集的正确标签,以方便对比
print('iris_y_test = ')
print(iris_y_test)
#输出准确率计算结果
print('Accuracy:',score)
"""
输出结果:
iris_y_predict = 
[1 2 1 0 0 0 2 1 2 0]
iris_y_test = 
[1 1 1 0 0 0 2 1 2 0]
Accuracy: 0.9
"""
可以看到,该模型的准确率为0.9,其中第二个数据预测错误了。

おすすめ

転載: blog.csdn.net/Pioo_/article/details/109723433
おすすめ