章III -KNN(分類および回帰アルゴリズムモデル)

最後の章では、分類タスクのためのパーセプトロンは、その利点を持って、パーセプトロンモデル、戦略とアルゴリズムを学習しているが、モデルが持っているという強い仮定の条件の下で-トレーニングデータセットでなければなりません線形分離をしますが、データであればセットがされているランダムに提示分類タスク場合は、次に実行する時間を分散し、あなたも考慮することができたk最近傍(KNN)の基本である、分類および回帰方法を、いずれかの単純なバイナリ分類を行い、より複雑な操作を行うことができます分類タスクは、あなたはまた、回帰タスクを行うことができます。

KNNモデル

KNNモデルは、実際に対応した特徴空間の分割は特定の言語は数学的な抽象化を記載していないためにも、が、その3つの要素が残っています:距離メトリックは、K、分類決定規則の値を選択してください

距離測定

\ [(3)X_I ^ {\カイはn次元実ベクトル空間R ^ nは、X_I、X - jが\ \カイで、X_I =(X_I ^ {(1)}、X_I ^ {(2)}前記空間提供} ...、X_I ^ {(N)})^ T、\\ X - jが=(X - jが^ {(1)}、X - jが^ {(2)}、X - jが^ {(3)} ...、X - jが^ {(N)})^ T、X_I、X - jが距離は、として定義され得る:\\ L_P(X_I、X - jが)=(\和^ N_ {L = 1} | X_I ^ {(L)} - X - jが^ {( L)} | ^ P)^ {\ FRAC {1} {P}} \\一般に、場合P = 1、L_1(X_I、X - jが)=(\和^ N_ {L = 1} | X_I ^ { (L)} - X - jが^ {(L)} |)は、マンハッタン距離と呼ばれる。\\時間P = 2、L_2(X_I、X - jが)=(\和^ N_ {L = 1} | X_I ^ {( L)} - X - jが^ {(L)} | ^ 2)^ {\ FRAC {1} {2}}、実際には、また、より多くの通常用いられる、L2ノルム、と呼ばれるユークリッド距離を形成し;場合のp \\各座標の距離の最大値= \ inftyの、すなわち:L _ {\ inftyの}(X_I、X - jが)=最大| X_I ^ {(L)} - X - jが^ {(L)} | \]

K値を選択します

距離測定、並びに選択としてKNNアルゴリズムの結果のK値に加えて、大きな影響を与えるであろう。

  • あなたが選択した場合、kの値を小さくして、それが「学習」の小さなフィールドで訓練例の予測と同等で近似誤差を低減することができる、入力実施例のみに近づくには、予測結果に役割を果たしますしかし、欠点は学習された推定誤差が大きくなり、近傍点の一例になります結果を予測することは非常に敏感です。
  • あなたが選択した場合は大きい値を、学習誤差推定を低減することができるが、同時に、近似誤差が大きくなり、予測エラーが発生するように、その後、例えばあるだろう比較的遠い距離点は、予測効果を達成しないでしょう。

分類決定規則

道の大半 - KNN決定規則は、通常、その「投票」です。

損失関数は、0-1損失関数である場合、分類の関数である:
\ [F:N-R&LT ^ \ RIGHTARROW {\ {C_1と、C_2、...、} C_K \} \]
k個のトレーニング例隣接ドットのNを設定し、誤分類率である
。\ [\ FRAC 1 {{}} K \ sum_ {X_I \でn_k(X)} I(Y_I \ C_J NEQ)= 1- \ FRAC 1 {{}} K \ sum_ { n_kでX_I \(x)は}
それは(Y_I = c_j)\] 最小分類誤り率を作るために、そして確率は、経験的リスクの最小化の大部分を満たすためにだけ従うように、そのいくつかのルールを右最大を依頼することです。

KNNアルゴリズム

アルゴリズムの説明

\ [入力:訓練データセット:T = \ {(X_1、Y_1)、(X_2、Y_2)、(X_3、y_3)...、(x_nに関する、y_N)\}、\カイ\のsubseteq Rにおける前記X_Iの\ ^ n個の特徴ベクトルの例である、\\ Y_I \ Y = \ {C_1、C_2、...、c_K \}得られたカテゴリーの例は、I = 1,2、...、で、特徴ベクトルXの例としては、\ \出力:例のx yのカテゴリが属します。\\(1)指定された距離ベクトルに応じて、点xのk個の最近傍と識別するためにトレーニングセットTで、kは、当技術分野で点xを含み(X)N_kと呼ぶ。\\(2)n_kで(x)は、分類決定規則XカテゴリYに従って決定:Y = ARGMAX \ sum_ {X_I \でn_k(X)} I(Y_I = c_j)、I、J = 1,2、..、N。\]

実装する場合、データの特徴空間やトレーニング時に大容量の大きさの数が多い場合は検討する際にKNN、主にどのように高速トレーニングデータK最近傍探索問題は、データストレージは大きな問題です。KNN最も単純な実装は、リニアスキャンで、今回大きなデータセットは、計算は非常に時間がかかります特別なファブリックストアのトレーニングデータを用いて、そのような検索の効率を向上させるために- kd木(ツリーKD) kd木は、迅速な検索のために格納される空間におけるk次元の点のツリーデータ構造です。実質的に、KDツリーは、k次元の空間の分割を表す二分木です

コードの実装

セルフ・プログラミング

class KNN:
    """
    使用自编程实现KNN算法
    @author cecilia
    """
    def __init__(self,X_train,y_train,k=3):
        # 所需参数初始化
        self.k=k   # 所取k值
        self.X_train=X_train
        self.y_train=y_train

    def predict(self,X_new):
        # 计算欧氏距离
        dist_list=[(np.linalg.norm(X_new-self.X_train[i],ord=2),self.y_train[i])
                   for i in range(self.X_train.shape[0])]
        #[(d0,-1),(d1,1)...]
        # 对所有距离进行排序
        dist_list.sort(key=lambda x: x[0])
        # 取前k个最小距离对应的类别(也就是y值)
        y_list=[dist_list[i][-1] for i in range(self.k)]
        # [-1,1,1,-1...]
        # 对上述k个点的分类进行统计
        y_count=Counter(y_list).most_common()
        # [(-1, 3), (1, 2)]
        return y_count[0][0]

def main():
    # 初始化数据
    X_train=np.array([[5,4],
                      [9,6],
                      [4,7],
                      [2,3],
                      [8,1],
                      [7,2]])
    y_train=np.array([1,1,1,-1,-1,-1])
    # 测试数据
    X_new = np.array([[5, 3]])
    # 不同的k(取奇数)对分类结果的影响
    for k in range(1,6,2):
        #构建KNN实例
        clf=KNN(X_train,y_train,k=k)
        #对测试数据进行分类预测
        y_predict=clf.predict(X_new)
        print("k={},class label is:{}".format(k,y_predict))

Sklearnライブラリ

from sklearn.neighbors import KNeighborsClassifier

def sklearn_knn():
    """
    使用sklearn库实现KNN算法
    @author cecilia
    """
    X_train=np.array([[5,4],
                      [9,6],
                      [4,7],
                      [2,3],
                      [8,1],
                      [7,2]])
    y_train=np.array([1,1,1,-1,-1,-1])
    # 待预测数据
    X_new = np.array([[5, 3]])
    # 不同k值对结果的影响
    for k in range(1,6,2):
        # 构建实例
        clf = KNeighborsClassifier(n_neighbors=k,n_jobs=-1)
        # 选择合适算法
        clf.fit(X_train, y_train)
        # print(clf.kneighbors(X_new))
        # 预测
        y_predict=clf.predict(X_new)
        #print(clf.predict_proba(X_new))
        print("accuracy:{:.0%}".format(clf.score([[5,3]],[[1]])))
        print("k={},label lcass is:{}".format(k,y_predict))

結果があることを示しました。

考えます

モデルのKNNアルゴリズムの複雑さは、主にここに反映されていますか?どのような状況下では、オーバーフィッティングの結果でしょうか?

アルゴリズムの複雑さに近いモデルkはkの値に反映され、オーバーフィッティングが発生する可能性が低いk値は、k値にくい優れたフィット感を生じさせます。

おすすめ

転載: www.cnblogs.com/cecilia-2019/p/11329640.html