1. numpyのアレイの最小数kに:
np.argpartition(ARR、K)ステップを区画Fは速い行に行われ、それはインデックスk -1要素に対応する前にいることを確実にするためにのみ分割後も元の配列、配列インデックス戻りを変更しない<セクション= K;例えば:
> ARR = np.array([1、3、5、4、6、2、8])
> np.argpartition(ARR、3)
> [0、5、1、2、4、3、6]
あなたが最小のkを取りたい場合は、スライスされた[0:k]は、最大のkを取るために、スライスした[-k:]。
配列の要素の最大数は2 numpyの需要が表示されます。
np.bincount(ARR)は、[最大素子アレイ0]アレイ内の範囲内のすべての整数の発生回数をカウントすることです。以下のような:
> ARR = np.array([1、2、1、3、4、2])
> np.bincount(ARR)
> [0、2、2、1、1、]
np.argmax(np.bincount(ARR))と要素値の出現の最も数を得ることができます。
3. k最近傍のPython実装:
クラスk最近傍: デフ __init__ (自己): self.x_train = [] self.y_train = [] DEF 訓練(自己、X、Y): self.x_train = np.array(X) self.y_train = np.array(Y ) を返す自己 DEF(自己、x_test、K = 3、正則=予測' L1 ' :) num_test = x_test.shape [0] y_predict = np.zeros(num_test、DTYPE = self.y_train.dtype) のための I に範囲(num_test): もし正規== ' L1 ' : 距離 = np.sum(np.abs(self.x_train - x_test [iが,:])、軸= 1 ) のelif正則== ' L2 ' : 距離 = NP .SUM(np.square(self.x_train - x_test [I ,:])、軸= 1 ) 他: 距離 = np.sum(np.abs(self.x_train - x_test [I ,:])、軸= 1 ) nearest_idx = np.argpartition(距離、K-1 )[0:K] 投票= self.y_train [nearest_idx] y_predict [i]は= np.argmax(np.bincount(投票)) を返すy_predict DEF accuray(自己、y_predict、y_test): ACC = np.sum(y_predict == y_test)/ y_predict.shape [0] 戻り ACC
データセットはMNIST手書き数字認識を使用しています。http://yann.lecun.com/exdb/mnist/
それらの使用良好hyperparametricを得るために、クロスバリデーション試験データを行うには、K = 3、L2です。
最後に、正しい検査結果が得られたエラー率0.14%のmnist KNN「L2」よりも同じホーム97.05パーセント(誤り率2.95パーセント)でした