物理の研究の備忘録

高エネルギー物理学とかいうマニアックな研究分野の博士課程にいるわたしの備忘録。主にPCの設定とかプログラミングとか雑多な感じで

Linux環境でPython、機械学習を使って手書き文字を識別する

 

基本的には以下のサイトの通りに(言われるがままに)やっみた。

【機械学習】Python3 + scikit-learn で識別率99%の手書き数字の分類器を作った - 株式会社クイックのWebサービス開発blog

 

自分の環境はUbuntu 16.04 LTS

環境構築

1.apt-get使ってぱーっと入れる。

sudo apt-get install python3 python-dev python3-pip
sudo apt-get install virtualenv

sudo apt-get install python-pip

2.
mkdir image_classify
cd image_classify
virtualenv -p python3 env
source env/bin/activate

3.

教師データは↓のものを使うよ

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

# sudoで実行しない
pip install numpy
pip install scipy

# 先にライブラリを入れておく
sudo apt-get install gfortran liblapack-dev
pip install scikit-learn
4.
# データを入れておく場所
mkdir data
cd data
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
5.
gzip -dc train-images-idx3-ubyte.gz | od -An -v -tu1 -j16 -w784 | sed 's/^ *//' | tr -s ' ' > train-images.txt
gzip -dc train-labels-idx1-ubyte.gz | od -An -v -tu1 -j8 -w1 | tr -d ' ' > train-labels.txt
gzip -dc train-images-idx3-ubyte.gz | od -An -v -tu1 -j16 -w784 | sed 's/^ *//' | tr -s ' ' > test-images.txt
gzip -dc train-labels-idx1-ubyte.gz | od -An -v -tu1 -j8 -w1 | tr -d ' ' > test-labels.txt

6.
適当にimage.pyみたいなの作って以下のコードをかく

#!/usr/bin/env python

import numpy as np
from sklearn.ensemble import RandomForestClassifier

# learninig data
data_training = np.loadtxt('data/train-images.txt', delimiter=' ')
label_training = np.loadtxt('data/train-labels.txt')

# test data
data_test = np.loadtxt('data/test-images.txt', delimiter=' ')
label_test = np.loadtxt('data/test-labels.txt', delimiter=' ')

# learn
#estimator = LinearSVC(C=1.0)
estimator = RandomForestClassifier()
estimator.fit(data_training, label_training)

# test
print(estimator.score(data_test, label_test))

7.

ターミナルで

python image.py

とかやると

0.9990166666666667

と出てきた。とりあえずやってみた感が強いので、明日あたりにちゃんと理解して編集、更新します。