ここから本文です

MNISTをk-NNで学習させる課題です。 [注意事項] 訓練データはtrain_X, train_y, ...

アバター

ID非公開さん

2017/4/3019:06:07

MNISTをk-NNで学習させる課題です。
[注意事項]
訓練データはtrain_X, train_y, テストデータはtest_Xで与えられます。

train_Xとtrain_yをtrain_X, train_yとvalid_X, valid_yに分けるなどしてモデルを学習させる。

test_Xに対して予想ラベルpred_yを作り, homework関数の戻り値とする。

k-NNの実装にscikit-learnなどのライブラリを使わない。

[問題]
① homework関数を完成させる。

def homework(train_X, train_y, test_X):
# WRITE ME
return pred_y
② 以下のvalidate_homework関数を用いてエラーが起きないか動作確認をする。

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()

# validate for small dataset
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'))

def score_homework():
train_X, test_X, train_y, test_y = load_mnist()
pred_y = homework(train_X, train_y, test_X)
print(f1_score(test_y, pred_y, average='macro'))

validate_homework()

閲覧数:
192
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

アバター

ID非公開さん

2017/4/3021:36:29

> MNISTをk-NNで学習させる
knn は怠惰学習なので "学習させる" という言葉は不適な気がします.

以下,例です.
k は最近傍のデータ点の数で,距離指標はユークリッド距離です.

def homework(train_X, train_y, test_X):
__k = 8
__dist = [np.linalg.norm(train_X - t, axis=1) for t in test_X]
__indices = [[i[0] for i in sorted(enumerate(d), key=lambda x:x[1])[:k]] for d in dist]
__labels = [train_y[i] for i in indices]
__pred_y = np.argmax(np.apply_along_axis(np.bincount, 1, labels, minlength=10), axis=1)
__return pred_y

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる