「機械学習リアル」からコードhttps://github.com/wzy6642/Machine-Learning-in-Action-Python3
K-最近傍(KNN)
入門
簡潔には、異なる分類間の特性値を用いてK-最近傍距離測定方法。
利点:高い精度、外れ値の影響を受けない、データの入力が想定されていません。
短所:高い計算の複雑さ、空間計算量が高い場合、データの内的な意味を与えることはできません。
数値、公称タイプ:データ範囲を使用します。
分類機能の擬似コード:
未知のクラス属性データセット上の各点を順次、次の操作を実行します。
(1)点既知のクラスのデータセットと現在のポイント間の距離を計算します。
(2)距離の昇順でソート。
(3)現在の点から最小のk個の点を選択します。
(4)最初のk個のポイントカテゴリの発生確率を決定します。
最高周波数クラスk点に戻る前に、(5)は、現在の点の予測分類として現れます。
1 "" " データセットを作成し 2つの 戻り値:グループ-データセットを 3つの ラベル-分類タグ 4。 " "" 5。 DEF CreateDataSet(): 6 #4次元特徴を 7 グループnp.array =([1、101]、 [5、89]、[108 5]、[115、8 ]) 8個の #タグ4つの特性 。9 ラベル= [ ' ラブストーリー'、' ラブストーリー'、' アクション映画'、' アクション映画' ] 10 リターン・グループ、ラベル 。11 12は 13があります " "" 14 KNNアルゴリズム、分類器 15 パラメータ: 16 -分類データ(テストセット)についてのINX 17 のdataSet A -トレーニングデータ(トレーニングセット)のために(N次元の* 1列ベクトル) 18は、 分類基準(N * 1次元-ラベル列ベクトル) 。19 K - KNNアルゴリズムパラメータは、選択した最小距離k点 20 に戻る: 21である sortedClasscount [0] [0] -分類結果 22は " "" 23である DEFのclassify0(INXデータセット、ラベル、K): 24 #numpyの関数形状の行の数の[0]は、データセット(寸法)が返さ 25 dataSetSize = dataSet.shape [0] 26である #はINX dataSetSize回繰り返し、行に配置されます 27 diffMat = np.tile(INX、(dataSetSize ,. 1)) - dataSet A 28 #減算平方後の次元の特徴 29 2 ** = sqDiffMat diffMat 30 #SUM()が全ての要素、和(0)列また、和(1)添加ライン合計 31である sqDistances = sqDiffMat.sum(軸= 1 ) 32 #を算出処方距離 33は 距離0.5 ** = sqDistances 34である #argsort距離関数が大きいインデックス値に小さいからの値を返す 35 sortedDistIndicies = distances.argsort() 36 位記録カテゴリ辞書番号定義 37 classCount = {} 38である #最小の距離k個の点 39 のための I におけるレンジ(K): 40 #カテゴリk個の要素の前に除去 41は voteIlabel =ラベル[sortedDistIndicies [I] 42である #辞書のget()メソッドの戻り指定されたキーの値が、値は辞書リターンでない場合は0 43 #計算カテゴリの数 44である classCount [voteIlabel] = classCount.get(voteIlabel、0)+。1 45 #降順で、operator.itemgetter(1)の値によってソートリバース辞書(0)ソート・ボタン 46が sortedClassCountソート=(classCount.items()、operator.itemgetterキー=(1)、リバース= TRUE) 47の #のリターンの数ほとんどのカテゴリ、すなわち、分類されたカテゴリすべき 48 の戻りsortedClassCount [0] [0] 49 50 #のテスト 51は、グループ、ラベル= CreateDataSet() 52は、 classify0([0,0]、グループ、ラベル、。3) #の愛:出力シート"
実際:手書き認識システムデジタル
ここでの唯一の識別番号0〜9を介して、画像は、画像をテキスト形式に変換され、モノクロ画像は32×32ピクセルです。
フォーマットプロセスは、ベクトル画像であり、二値画像は* 2014 32 * 32 1のベクトルを行列です。
1 "" " 2 値画像は、32×32 1 * 1024ベクター変換 3つの パラメータは: 4。 ファイル名-ファイル名 5 :戻る 。6 - returnVectバイナリ画像1 * 1024ベクトルを返す 。7 """ 8 9。 DEFのimg2vector(ファイル名): 10 returnVect np.zeros =((1、1024 )) 。11 FR = オープン(ファイル名) 12である #行のリード 13がある ため、I でレンジ(32 ): 14 #は、データラインを読み取る 15 lineStr = (fr.readline ) 16 #各列32のデータの前を順次returnVectに格納されています 17 のための J でレンジ(32 ): 18である returnVect [0、32 * I + J = INT(lineStr [J]) 。19 #1 * 1024ベクター切り替え復帰後 20で リターンreturnVect 21は、 22である 。#テスト 23であるテストベクトル= img2vector(' testDigits / 0_13.txt ' ) 24テストベクトル[0、0:31 ] 25 #出力:配列([0、0の、0の、0の、0の、0の、0の、0、0 .. 、0.5、0.5、0.5、0.5、0.5、1、1、1、 26 # 1、0.5、0.5、0.5、0.5、0.5、0、0。 、0.5、0.5、0.5、0.5、0.5、0.5])
テストアルゴリズム
1 " "" 2つの 手書きの数字カテゴリー試験 3 :パラメータ 4 なし 。5 :戻る 。6 なし 。7 """ 8。 DEF handwritingClassTest(): 9 #はテストセットラベル 10 hwLabels = [] 11。 #の下のファイル名戻りtrainingDigitsディレクトリ 12 = LISTDIR trainingFilesList(' trainingDigitsは' ) 13は、 #フォルダファイルの数リターン 14 、M = LEN(trainingFilesList) 15 #マット行列初期トレーニング(全てゼロ針)、テストセット 16 = np.zeros trainingMat((M、1024 )) 17。 #トレーニングセットのカテゴリからファイル名解析 18である ため、I でレンジ(M): 19の #は、ファイル名取得 20である fileNameStr = trainingFilesList [I] 21である #分類を得ます図 22は、 classNumber = INT(fileNameStr.split(' _ ' )[0]) されている23 #カテゴリで得られたhwLabelsに添加し 24 hwLabels.append(classNumber) 25 #trainingMat各ファイルのデータストア* 1 1024マトリックス 26は、 trainingMat [I ,:] = img2vector(' trainingDigits / S%'%(FileNameStr)) 27 #構成されるKNN分類器 28 いななき= KNN(N_NEIGHBORS = 3、アルゴリズム= ' 自動' ) 29 #のフィットモデル、試験マトリックス用trainingMat、タブ対応hwLabels 30 neigh.fit(trainingMat、hwLabels)を 31 #ファイルバックtestDigitsディレクトリリスト 32 testFileList = LISTDIR(' testDigits ' ) 33が #検出カウンタエラー 34が = 0.0 ERRORCOUNT 35 #テストデータの数 36 MTEST = LEN(testFileList) 37 #テストの文書集合から解析カテゴリ分類のテスト 38 用 I における範囲(MTEST): 39の #は、ファイル名を取得 40は fileNameStr = testFileList [I]が 41である #分類得番号 42である classNumber = INT(fileNameStr.split(' _ ' )[0]) 43である #はテストセットを得ます訓練するために使用さ1024の*ベクトル 44がある vectorUnderTest = img2vector(' testDigits / S%'%(fileNameStr)) 45 位の予測を得る 46ある classifierResult = neigh.predict(vectorUnderTest) 47 印刷(「分類結果が返さ%D \トン真結果は%dです"%(ClassifierResult、classNumber)) 48 IF(classifierResult =!ClassNumber): 49 ERRORCOUNT + 1.0 = 50 印刷(" 総間違ったデータは%d \ n個のエラーレートF %%% "%(ERRORCOUNT、ERRORCOUNT / MTEST * 100))