「マシンは、本物の学習」--KNN

「機械学習リアル」からコード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))

おすすめ

転載: www.cnblogs.com/harbin-ho/p/12026276.html