機械学習-[3] KNNアルゴリズムの理論と例

1.事件から話す

映画分類の例:

Image.png

これは、特徴としての戦いの数とキスの数に基づく分類です。最後のレコードは分類されるデータです。

KNN分類プロセスが比較的単純である理由の1つは、モデルを作成する必要も、トレーニングする必要もないこと、および非常に理解しやすいことです。例の戦闘数とキス数をx軸とy軸とすると、2次元の座標を簡単に確立でき、各レコードは座標内のポイントになります。不明なポイントについては、最も近いポイント、番号が多いカテゴリ、不明なポイントが属するカテゴリを探します。

2.アルゴリズムの説明

KNN(K Near Neighbor):k個の最近傍、つまり、各サンプルはk個の最近傍で表すことができます。

KNNアルゴリズムのアイデア:
KNNはノンパラメトリック機械学習アルゴリズムです(機械学習では、モデルパラメータはモデルトレーニングを通じて学習され、ハイパーパラメータは手動で調整されます。混乱を避けるために注意してください)。KNNを使用するには、最初に既知のデータセットDが必要です。データセットに不明なラベルが付いているサンプルデータxについて、xとDのすべてのサンプルポイント間の距離を計算し、xに最も近い最初のk個の既知の距離を取り出すことができます。データについては、k個の既知のデータのラベルを使用してxに投票します。どのカテゴリが最も投票数が多く、どのカテゴリxが最も多いか、これがKNNの一般的な考え方です。

1.ハイパーパラメータ:モデルを実行する前に決定する必要のあるパラメータです。たとえば、kに最も近い隣接アルゴリズムのk値や距離などです
。2。ハイパーパラメータを決定する一般的な方法:ドメイン知識、経験値、実験的調査。

注:一般に、Kの値は比較的小さく、20を超えることはありません。

アルゴリズムの一般的な手順は次のとおりです。

  • テストデータと各トレーニングデータの間の距離を計算します。
  • 値の小さいものから大きいものへと並べ替えます。
  • kの値を決定し、最初のkポイントを選択します。
  • 最初のkポイントのカテゴリの頻度を決定します。
  • テストデータの予測カテゴリとして、最初のkポイントの中で最も頻度の高いカテゴリを返します。

KNNアルゴリズムをいつ使用するのですか?

KNNアルゴリズムは、分類と回帰予測の両方に使用できます。ただし、業界は主に分類の問題に使用されます。アルゴリズムを評価するとき、私たちは通常、次の3つの観点から始めます。

  • モデルの説明
  • 計算時間
  • 予測する能力;
3.距離の測定方法

KNNアルゴリズムの最も重要な部分は、距離の計算です。一般的に、距離関数d(x、y)を定義するには、次の基準を満たす必要があります
。1)アイデンティティ:d(x、x)= 0 //自分までの距離は0です
2)非負性:d (x、y)> = 0 //距離は負ではありません
3)対称性:d(x、y)= d(y、x)// AからBまでの距離がaの場合、BからAまでの距離も次のようになります。 a
4)直接性:d(x、k)+ d(k、y)> = d(x、y)//三角形の規則:( 2つの辺の合計が3番目の辺よりも大きい)

距離の計算には多くの方法があり、離散固有値計算法と連続固有値計算方法に大別できます。以下では、連続データの類似性を計算するために一般的に使用される測定方法を紹介します。

ミンコウスキーの距離
ミンの距離は、時空間間隔を指す場合があります。

n次元空間に定数として2つの座標x、y、pがあり、数値点PとQの座標がP =(x1、x2、...、xu)とQ =(y1、y2、...、yu)であるとします。最小スタイルの距離は次のように定義されます。
ここに写真の説明を挿入
注:uはxとyの添え字変数、u = 1,2、... nです。

[1] p = 1の場合、距離はマンハッタン距離(マンハッタン距離)です。

[2] p = 2の場合、距離はユークリッド距離であり、これは一般的に使用されるユークリッド距離です。

[3] pが無限大に近づくと、距離はチェビシェフ距離(チェビシェフ距離)に変換されます。
ここに写真の説明を挿入

4.K値の選択

K値の選択は結果に影響します。古典的な図は次のとおりです。

ここに写真の説明を挿入

図のデータセットは良好なデータです。つまり、すべて完了していlabelます。1つは青い正方形、もう1つは赤い三角形、緑の円は分類するデータです。

  • k = 3の場合、範囲内に赤い三角形が多く、分類されるこの点は赤い三角形に属します。
  • k = 5の場合、範囲内に青い四角が多く、分類される点は青い四角に属します。

要約:
Kが大きすぎる:分類があいまいになります
。Kが小さすぎます:個々のケースの影響を受け、大きな変動があります。

より小さなK値を選択すると、より小さな近傍でトレーニング例を使用して予測することと同等になり、学習の近似誤差が減少します。入力例に近いトレーニングデータのみが予測結果に影響しますが、欠点は、学習の推定誤差が増加し、予測結果がネイバーのインスタンスポイント分割に敏感になることです。近くのインスタンスポイントがたまたまノイズである場合、予測は間違っています。つまり、K値の低下は、モデル全体が複雑になり、分類が不明確になり、オーバーフィットが発生しやすくなることを意味します。
より大きなK値を選択すると、より大きな近隣でトレーニング例を使用して予測するのと同じです。その利点は、学習の推定誤差を減らすことができるという利点ですが、近似誤差が増加します。つまり、入力インスタンスの予測が正確でなく、K値がこの増加は、モデル全体が単純になることを意味します。

理解:
おおよそのエラー:既存のトレーニングセットのトレーニングエラーとして理解できます。
推定誤差:テストセットのテスト誤差として理解できます。

おおよその誤差はトレーニングセットに焦点を当てています。k値が小さい場合、オーバーフィットが発生します。既存のトレーニングセットは良好な予測が可能ですが、未知のテストサンプルは予測に大きな偏差があります。モデル自体は、最良のモデルに最も近いものではありません。
推定誤差はテストセットに焦点を当てています。小さな推定誤差は、未知のデータに対する優れた予測能力を示します。モデル自体が最良のモデルに最も近いです。

統計的学習法では、パラメータの選択は通常、偏差(バイアス)と分散(バリアンス)のバランス(トレードオフ)を行うことです。kNNの場合、k値の選択は、偏差と分散のバランスを取る必要があります。k = 1のようにkの値が小さい場合、ノイズポイントの干渉により分類結果に誤差が生じやすく、このときのばらつきが大きくなります。k= Nのようにkの値が大きい場合(Nはトレーニングセットのサンプル数) )、結果はすべてのテストサンプルで同じであり、分類結果はサンプルが最も多いカテゴリであるため、安定性は安定していますが、予測結果が真の値から離れすぎており、偏差が大きすぎます。したがって、kの値は大きすぎたり小さすぎたりすることはできません。通常の方法は、相互検証(相互検証)を使用してkの一連の異なる値を評価し、トレーニングパラメーターとしてkの最適な値を選択することです。

アプリケーションでは、K値は一般に比較的小さい値(Kは通常20未満)を取り、相互検証は通常、最適なK値を選択するために使用されます。

5.KNNの長所と短所

利点:

1.シンプルで、理解しやすく、実装しやすい。

2.トレーニングサンプルとラベルを保存するだけでよく、パラメータを推定する必要も、トレーニングも必要ありません。

3.小さなエラーの可能性の影響を受けにくい。最も近い隣人の進行性エラー率は、最悪の場合ベイジアンエラー率の2倍を超えず、最高の状態でベイジアンエラー率に近づくか到達することが理論的に証明されています。

4. KNN法は、クラスドメインを識別してカテゴリを決定する方法ではなく、主に周囲の限られた近くのサンプルに依存するため、クラスドメインのクロスまたはオーバーラップが多いサンプルセットの場合、KNN法は他の方法よりも優れています。方法がより適しています。

5.このアルゴリズムは、サンプルサイズが比較的大きいクラスドメインの自動分類に適しています。サンプルサイズが比較的小さいドメインは、このアルゴリズムを使用すると誤分類されやすくなります。

短所:

1.Kの選択は固定されていません。

2.サンプルのバランスが悪いと、まれなカテゴリの予測精度が低くなります。

2.予測結果は、ノイズの多いデータの影響を受けやすくなります。

3.これは怠惰な学習方法であり、基本的に学習ではないため、ロジスティック回帰などのアルゴリズムよりも予測速度が遅くなります。

4.特徴の数が非常に多い場合、分類される各テキストについて、K個の最も近い隣接サンプルを見つけるためにすべての既知のサンプルまでの距離を計算する必要があるため、計算の複雑さとメモリ消費が高くなります。 。

6.KNNアルゴリズムの改善戦略

6.1計算の複雑さを軽減する観点から

サンプルサイズが大きく、機能属性が大きい場合、KNNアルゴリズム分類の効率が大幅に低下します。使用できる改善方法は以下のとおりです。

(1)機能選択を行います。KNNアルゴリズムを使用する前に、機能属性を減らし、分類結果に小さな(または重要でない)影響を与える機能を削除して、KNNアルゴリズムの分類速度を上げることができます。

(2)トレーニングサンプルセットのサイズを小さくします。元のトレーニングセットで、分類に関係のないサンプルを削除します。

(3)クラスタリングにより、クラスタリングによって生成された中心点が新しいトレーニングサンプルとして使用されます。

6.2類似性測定方法の最適化の観点から

多くのKNNアルゴリズムは、ユークリッド距離に基づいてサンプルの類似性を計算しますが、この方法はノイズの特徴に非常に敏感です。従来のKNNアルゴリズムの同じ特徴の欠点を変更するために、類似性を測定するための距離式に異なる特徴を与えることができます。重み、特徴の重みは通常、分類における各特徴の役割に従って設定されます。情報の取得方法など、重みを計算する方法は多数あります。さらに、サンプル間の類似性をより適切に反映するために、さまざまな機能タイプにさまざまな類似性測定式を使用できます。

6.3意思決定戦略の最適化の観点から

従来のKNNアルゴリズムの決定ルールの欠点は、サンプルの分布が不均一な場合(トレーニングサンプルの数がバランスされていない場合、または基本数が近い場合でも領域のサイズが異なる場合)、最初のk個の最近傍のみが異なることです。距離に関係なく順序が異なると分類が不正確になり、多くの方法が採用されます。たとえば、サンプル分布密度を均一化する方法を使用して改善することができます。

6.4適切なK値を選択する観点から

KNNアルゴリズムの計算のほとんどは分類段階で行われ、分類効果はK値の選択に大きく依存するため、これまでのところ、k値の選択をガイドする成熟した方法や理論はありません。ほとんどの場合、合格する必要があります。 K値の選択を調整してみてください。

7.デモンストレーションの例

例を作成し、それを参照して、KNNアルゴリズムのフローを感じてみましょう。

# coding=utf-8
"""
@Project: 课堂小练习
@Author: 王瑞
@File: KNN1.py
@IDE: PyCharm
@Time: 2020-10-21 20:39:20
"""
import numpy as np
# 给出训练数据以及对应的类别
def createDataSet():
    group = np.array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

# 通过KNN进行分类
def classify(input,dataSet,labels,k):
    datasize = dataSet.shape[0]
    # 计算欧式距离
    dis = np.zeros(datasize, dtype=float)
    for i in range(datasize):
        dis[i] = np.linalg.norm((input - dataSet[i])*(input - dataSet[i]).T)

    # 对距离排序
    sortedindex = np.argsort(dis)

    # 累计label次数
    classcount = {
    
    }
    for i in range(k):
        vote = labels[sortedindex[i]]
        classcount[vote] = classcount.get(vote, 0)+1

    # 对map的value排序
    sortedclass = sorted(classcount.items(), key=lambda x: (x[1]), reverse=True)
    return sortedclass[0][0]


dataSet, labels = createDataSet()
input = np.array([1.1, 0.3])
k = 3
output = classify(input, dataSet, labels, k)
print(f"测试数据为:{input},分类结果为:{output}")

出力:

D:\Python\Python37\python.exe E:/PyDataFile/课堂小练习/KNN1.py
测试数据为:[1.1 0.3],分类结果为:A
Process finished with exit code 0

おすすめ

転載: blog.csdn.net/qq_46009608/article/details/109189728