質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1790閲覧

errorの原因:k-Nearest Neighbors (k-NN) を使った手書き文字認識のコード)

TakuroYamashiki

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2017/07/23 08:02

###前提・実現したいこと
k-Nearest Neighbors (k-NN) を使った手書き文字認識のコードを作成しています。
scikit-learnを使わない方法です。

###発生している問題・エラーメッセージ

エラーメッセージ --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-194-1b587794855b> in <module>() ----> 1 validate_homework() 2 # score_homework() <ipython-input-187-6d60eddb843b> in validate_homework() 28 test_y_mini = test_y[:1000] 29 ---> 30 pred_y = homework(train_X_mini, train_y_mini, test_X_mini) 31 print(f1_score(test_y_mini, pred_y, average='macro')) 32 <ipython-input-193-f2d288ab731e> in homework(train_X, train_y, test_X) 17 list_x=distances.argsort()[0:5] 18 for j in list_x: ---> 19 count[j] +=1 20 pred_y=np.append(pred_y,np.argmax(count)) 21 return pred_y IndexError: index 273 is out of bounds for axis 1 with size 10 ###該当のソースコード def homework(train_X, train_y, test_X): import collections as cp train_X, valid_X, train_y, valid_y = train_test_split(train_X, train_y, test_size=0.2, random_state=42) k=5 norm = np.linalg.norm(train_X, ord=2, axis=1) norm2 = np.linalg.norm(valid_X, ord=2, axis=1) normalized_train_X = train_X / norm[:, np.newaxis] normalized_valid_X = valid_X / norm2[:, np.newaxis] pred_y=np.array([]) for i in range(test_X.shape[0]): count=np.zeros(10) distances=np.dot(normalized_valid_X,normalized_train_X.T) list_x=distances.argsort()[0:5] for j in list_x: count[j] +=1 pred_y=np.append(pred_y,np.argmax(count)) return pred_y from sklearn.utils import shuffle from sklearn.metrics import f1_score from sklearn.datasets import fetch_mldata from sklearn.model_selection import train_test_split import numpy as np def load_mnist(): mnist = fetch_mldata('MNIST original') mnist_X, mnist_y = shuffle(mnist.data.astype('float32'), mnist.target.astype('int32'), random_state=42) mnist_X = mnist_X / 255.0 return train_test_split(mnist_X, mnist_y, test_size=0.2, random_state=42) def validate_homework(): train_X, test_X, train_y, test_y = load_mnist() train_X_mini = train_X[:1000] train_y_mini = train_y[:1000] test_X_mini = test_X[:1000] test_y_mini = test_y[:1000] pred_y = homework(train_X_mini, train_y_mini, test_X_mini) print(f1_score(test_y_mini, pred_y, average='macro')) validate_homework()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasashiKimura

2017/07/23 13:20

インデントが失われていて、コードが全くわかりません。コードを ``` で囲んでください。
guest

回答1

0

ベストアンサー

エラーの原因は list_x には 訓練データのindex値 が入っているにも関わらず、

Python

1 for j in list_x: 2 count[j] +=1

としている為です。
本来は、index値から、ラベルの値を取得して

Python

1 for j in train_y[list_x]: 2 count[j] +=1

とするべきでしょう。
その他にも

  • 訓練データを分割 (意味不明)
  • コサイン距離を昇順でソート
  • k値を設定しているにも関わらず、不使用

等々問題の箇所がありますので、これを直して以下のようになるかと思います。

Python

1def homework(train_X, train_y, test_X): 2 k=5 3 # 訓練データを正規化 4 norm_train_X = np.linalg.norm(train_X, ord=2, axis=1) 5 norm_test_X = np.linalg.norm(test_X, ord=2, axis=1) 6 # テストデータを正規化 7 normalized_train_X = train_X / norm_train_X[:, np.newaxis] 8 normalized_test_X = test_X / norm_test_X[:, np.newaxis] 9 10 # 結果を格納する配列 11 pred_y= [] 12 for i in range(test_X.shape[0]): 13 # i番目のテストデータと各訓練データとのコサイン距離を求める 14 distances=np.dot(normalized_test_X[i],normalized_train_X.T) 15 # 結果を降順で=ソート 16 list_x=distances.argsort()[::-1][:k] 17 # 上位k個で多数決を実施 18 count=np.zeros(10) 19 for j in train_y[list_x]: 20 count[j] +=1 21 # 結果を格納 22 pred_y.append(np.argmax(count)) 23 return np.array(pred_y)

投稿2017/07/24 11:42

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問