ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示
ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示

2021年4月10日土曜日

最近仕事で扱っている技術

転職をして、なんだかんだもう時期2年が経過しようとしている。

SESの会社で働いているが、2つ目の現場で、わりとモダンな技術を使っている現場に当たったので、そういう意味では恵まれていると思う。

自分含めて周りもあんまりわかってないので、わからないことだらけなので、残業続きで大変ではあるけど。

自分にとっては多少背伸び気味の現場なので、そこで揉まれて成長できているとは思う。

当然のことながあんまり詳しいことは書けないけど、クラウド系の技術を使っていて、

docker、kubernete、OpenShift。

あとHelmchart、istioとかも。

正直理解が追いついてないので、キーワードを並べるだけになってしまうけど。

正直あんまりコードは書いていない。

でも、環境構築をして、仕組みがどうなってるのかをしれるから楽しい。

よくわかってないけど、多分DevOpsっていうのだろうか。

普段からわりと動作原理とか仕組みがわかって満足という気質はある。

環境構築して動くことが確認できれば満足、という感じ。

環境構築して動かせる環境さえ作ってしまえば、あとはコード書いていくだけだし、と思っている。(もちろんコードを書くのだってそんな簡単な話ではないことはわかっているが)

プライベートでも勉強がてらDockerなどを触ってみたりしている。

DockerやVirtualBoxなど、仮想化という便利な技術を知ったので、前は「環境構築失敗してもとに戻せなかったらどうしよう」と躊躇していたようなことも、「失敗したら戻せばいいや」と気軽に行えるので、いろいろ手をつけてみている。

GCPなんかも触ってみている。

DevOps系のスキルをもっと高めて、MLOps系の方向へ行きたいなと思っている。


2020年4月19日日曜日

Mnistのインストール方法いろいろ

導入

手書き文字認識のデータセットは、有名なデータセットです。

いろいろなライブラリから活用できるように整備されているのですが、当時の自分は「ファイルって外部から読み込むんじゃないの」(←今思えば、よくわかるようなわからないような疑問)とか、あるいはネットで調べても読み込み方がいろいろあって、その関係性がわからなかったりして混同しておりました。

 そういう人が他にもいるかもしれないなと思って、情報を整理する目的で書きました。

前提

sklearn、tensorflow、pytorchはインストールされている前提から話を始めます。(自分はAnacondaを使って環境を整えました)

sklearn、tensorflow,pytorchの全てが必須ということではありません。それぞれの場合について説明をするという意味です。

OSはMacOSXを使用しています。

注意

いわゆる手書き文字認識のデータセットですが、似たようなものが2つあります。

一つは、sklearnインストール時に一緒についてくる(標準で備わっている)手書き文字認識用のデータセットです。

二つ目は上記以外の方法で入手したものです。

一つ目のほうは、8×8ピクセルの画像から構成されています。

二つ目のほうは、28×28ピクセルの画像から構成されています。

どちらも「手書き文字認識」とか「Mnist」とかの検索で引っかかってくるし、なんとなく画像の雰囲気も同じ感じなので、いろいろ混同しておりました。

sklearnの標準搭載(8×8サイズのデータ)

データセットの場所

sklearn標準のデータセットは以下の場所にあります。
/(環境によって違う部分)/lib/python3.7/site-packages/sklearn/datasets
自分の場合のディレクトリ構成を参考までに。(Anacondaを使っています)
$ls  /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/    //パスで指定された中のファイル・ディレクトリ一覧を表示

__check_build   dummy.py   model_selection
__init__.py   ensemble   multiclass.py
__pycache__   exceptions.py   multioutput.py
_build_utils   experimental   naive_bayes.py
_config.py   externals   neighbors
_distributor_init.py  feature_extraction  neural_network
_isotonic.cpython-37m-darwin.so feature_selection  pipeline.py
base.py    gaussian_process  preprocessing
calibration.py   impute    random_projection.py
cluster    inspection   semi_supervised
compose    isotonic.py   setup.py
conftest.py   kernel_approximation.py  svm
covariance   kernel_ridge.py   tests
cross_decomposition  linear_model   tree
datasets   manifold   utils
decomposition   metrics
discriminant_analysis.py mixture
そしてその中のdatasetsフォルダをみてみると、
$ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/datasets

__init__.py     california_housing.py
__pycache__     covtype.py
_base.py     data
_california_housing.py    descr
_covtype.py     images
_kddcup99.py     kddcup99.py
_lfw.py      lfw.py
_olivetti_faces.py    olivetti_faces.py
_openml.py     openml.py
_rcv1.py     rcv1.py
_samples_generator.py    samples_generator.py
_species_distributions.py   setup.py
_svmlight_format_fast.cpython-37m-darwin.so species_distributions.py
_svmlight_format_io.py    svmlight_format.py
_twenty_newsgroups.py    tests
base.py      twenty_newsgroups.py
となっています。

ここに手書き文字認識以外にも、データセットが用意されています。

さらに、フォルダを深く入っていきます。
$ ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/datasets/data
boston_house_prices.csv  diabetes_target.csv.gz  linnerud_exercise.csv
breast_cancer.csv  digits.csv.gz   linnerud_physiological.csv
diabetes_data.csv.gz  iris.csv   wine_data.csv
ここに、sklearnを扱った記事でよく引用されるirisデータセットやboston_house_pricesデータセットなどがあります。

データセットのインポート方法

sklearnの公式ページのコードそのままではありますが。

以下作業はターミナルからpythonを起動して行っています。
>>> from sklearn.datasets import load_digits
>>> import matplotlib.pyplot as plt
>>> digit=load_digits()
>>> digit.data.shape
(1797, 64)      // (8×8=64列の行列として格納されている)

>>> plt.gray()
>>> digit.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])
>>> plt.matshow(digit.images[0])
>>> plt.show()

そうすると以下のような画面が立ち上がります。



オリジナルのデータをダウンロード(28×28サイズのデータ)

Mnistオジリナルのデータはこちらにあります。 

ただし、ここで入手できるのはそのままでは使用できないバイナリファイルです。

なので、自分でデータを使える形にまで加工しなければいけないところですが、以下でみていくように、Mnistは非常に有名なデータセットなので、いろいろなライブラリにすぐに使えるように整備されているツールがあります。

このバイナリデータを自力で元に戻す方法ももちろん存在はするようですが、そこまでフォローしきれなかったし、そこに時間かけるのもどうかと思ったのでその方法については触れません。

sklearn経由でダウンロード(28×28サイズ)

ネット上の記事をみていると、古い記事では
from sklearn.datasets import fetch_mldata
としている記事もありますが、現在ではアクセスしようとしている先のページが使用できないためエラーになります。

なので現在では以下のようにfetch_openmlを使用するようです。
 (scikit-learn(sklearn)のfetch_mldataのエラーの解決法)

これも、ターミナルから起動してます。
>>> import matplotlib.pyplot as plt   // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。
>>> from sklearn.datasets import fetch_openml
>>> digits = fetch_openml(name='mnist_784', version=1)
>>> digits.data.shape
(70000, 784)
>>> plt.imshow(digits.data[0].reshape(28,28), cmap=plt.cm.gray_r)

>>>>>> plt.show()



tensorflow(28×28サイズ)

tensorflowのチュートリアルから入れる方法。
>>> from tensorflow.examples.tutorials.mnist import input_data
とすればいけるらしいのですが、自分の場合は以下のようなエラーが出てしまいました。

結論からいうと、どうやらtensorflowをインストールする際に、tutorialのフォルダがダウンロードされないことがあるらしいです。

Traceback (most recent call last):
  File "", line 1, in 
ModuleNotFoundError: No module named 'tensorflow.examples.tutorials'
実際のディレクトリの中身をみてみました。
$ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/
__init__.py __pycache__ saved_model
となっていました。

以下のページを参考にしました。

まず、Tensorflowのgithubページへアクセスし、zipファイルをどこでもいいのでダウンロードして解凍します。



tensorflow-masterというフォルダがあるので、そのなかのtensorflow-master\tensorflow\examples\の場所に、tutorialsというフォルダがあります。

このturorialsというフォルダをフォルダごと/Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/の中にコピーします。

 ここまでできれば、
>>> import matplotlib.pyplot as plt   // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。
>>> from tensorflow.examples.tutorials.mnist import input_data
>>> mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
>>> im = mnist.train.images[1]
>>> im = im.reshape(-1, 28)
>>> plt.imshow(im)

>>> plt.show()

とすれば、同様に画像が表示されるはずです。

keras(28×28サイズ)

>>> import matplotlib.pyplot as plt   // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。
>>> import tensorflow as tf
>>> mnist = tf.keras.datasets.mnist
>>> mnist
>>> mnist_data = mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 1s 0us/step
>>> type(mnist_data[0])
   //タプルで返ってくる。
>>> len(mnist_data[0])
2
>>> len(mnist_data[0][0])
60000
>>> len(mnist_data[0][0][1])
28
>>> mnist_data[0][0][1].shape
(28, 28)

>>> plt.imshow(mnist_data[0][0][1],cmap=plt.cm.gray_r)

>>> plt.show()
もう画像は載せませんが、うまくいけばまた画像が表示されます。

pytorch(28×28サイズ)

まずこれができないと先へ進めないらしいですが、
>>> from torchvision.datasets import MNIST
次のようにエラーがでてしまった。

torchvisionがないらしい。

自分の場合にはcondaでpytorchを入れる際に、単に
conda install pytorch
しか行っていないからのようでした。

付属物までいれるには以下のようにするらしいです。
conda install pytorch torchvision -c pytorch 
確認を求められるのでyを押します。

 (必要であれば)上記を行った上で、以下のようなコードを実行してみます。
>>> import matplotlib.pyplot as plt   // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。


>>> import torchvision.transforms as transforms
>>> from torch.utils.data import DataLoader
>>> from torchvision.datasets import MNIST
>>> mnist_data = MNIST('~/tmp/mnist', train=True, download=True, transform=transforms.ToTensor())
>>> data_loader = DataLoader(mnist_data,batch_size=4,shuffle=False)
>>> data_iter = iter(data_loader)
>>> images, labels = data_iter.next()
>>> npimg = images[0].numpy()
>>> npimg = npimg.reshape((28, 28))
>>> plt.imshow(npimg, cmap='gray')

>>plt.show()

番外編(はじめてのDeeplearningより)

オライリーから出ている『ゼロから作る Deep Learning』では、この本が提供しているファイルの中で独立して行われています。

具体的には、[『ゼロから作る Deep Learning』で使用されるファイルのgithubページ]でダウンロードしてきたフォルダの中で全て読み進めていきます。(もちろん、予めpythonやnumpyなどは準備しておく必要はありますが。

以下手順。

まず、上記で述べたGithubページからフォルダをダウンロードなりクローンしてきます。

ここでは、ダウンロードで行います。

そして解凍します。



そうするとdeep-learning-from-scratch-masterというフォルダができます。

 各章ごとにフォルダ分けされているので、その章のフォルダへ移動して読み進めていく感じになります。

フォルダ自体はch01からありますが、Mnistのデータが使用されるのは第3章なので、ch03に入ることにします。

$ pwd
/Volumes/SONY_64GB/deep-learning-from-scratch-master/ch03
pythonを起動して・・・
>>> import sys,os
>>> sys.path.append(os.pardir)
>>> from dataset.mnist import load_mnist
>>> (x_train,t_train),(x_test,t_test) = load_mnist(flatten=True,normalize=False)
Downloading train-images-idx3-ubyte.gz ... 
Done
Downloading train-labels-idx1-ubyte.gz ... 
Done
Downloading t10k-images-idx3-ubyte.gz ... 
Done
Downloading t10k-labels-idx1-ubyte.gz ... 
Done
Converting train-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting train-labels-idx1-ubyte.gz to NumPy Array ...
Done
Converting t10k-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...
Done
Creating pickle file ...
Done!
>>> print(x_train.shape)
(60000, 784)
>>> print(t_train.shape)
(60000,)
>>> print(x_test.shape)
(10000, 784)
>>> print(t_test.shape)
(10000,)
>>> 
参考にしたページ

Mnistのオリジナルのデータ

sklearn

Tensorflow

Keras

Pytorch

その他

2019年6月29日土曜日

MNISTデータの読み込み

これまた、いまさら感が半端無いが、MNISTの読み込み方を書いておく。

市販されている本(例えば『ゼロからつくるDeeplearning』とか)にうまーくパッキングされたものが付録としてついてきている場合もあるが、そういうのに頼らず、自力でやる方法を紹介する。

なぜなら本を買うとお金がかかってしまう可能性があるから。

ChainerやTensorFlowであれば、標準搭載されていますが、できるだけ高度なライブラリは使わず、できるかぎり標準的な装備でやりたいというのもあるので。

条件

  • お金はかけない(市販されている本などは頼らない)
  • できるだけ低装備で行う

注意

sklearnにも、load_digitsというデータセットが入っているが、こちらはMNISTを加工して作られた8ピクセル×8ピクセルの画像データで、MNISTの簡略版なので、MNISTとは違うので注意しよう。
(参考:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html)

オリジナルのMNISTは28ピクセル×28ピクセルの画像データだ。

MNISTデータをダウンロード

まずは、MNISTのデータ本体を以下のURLへアクセスしてダウンロードする。

http://yann.lecun.com/exdb/mnist/

そこで、以下の4つのファイルをダウンロードしてくる。
  • train-images-idx3-ubyte.gz
  • train-labels-idx1-ubyte.gz
  • t10k-images-idx3-ubyte.gz
  • t10k-labels-idx1-ubyte.gz
で解凍までする。

それで、新しくディレクトリをつくって、そこにこの4つのファイルを入れる。

新しいディレクトリの名前はなんでもいいのですが、ここではMNIST_dataという名前にすることにする。

python-mnistをインストール

MNISTを扱うようのライブラリがあるのでインストールする。 ターミナルを起動して、以下のようにコマンドを打つ。
pip install python-mnist
(参考: https://pypi.org/project/python-mnist/ )

python-mnistのインポートからファイル読み込みまで

今回MNISTを読み込むコードを書くファイルは、とりあえずmnistとしておく。

そして、mnistという名前のファイルと同じディレクトリに、先ほどのMNIST_dataというディレクトリも置く。

実際のインポートは以下のようにします。
from mnist import MNIST
mnist = MNIST('../MNIST_data')
x_train, y_train = mnist.load_training() 

import numpy as np
import matplotlib.pyplot as plt
x_train = np.asarray(x_train).astype(np.float32)

x_train.shape      # (60000, 784)が返ってくる。
x_train[0]           #  784要素の配列が返ってくる。

plt.imshow(x_train[0].reshape(28,28))     # 画像として表示される。
plt.show()
以上でMNISTのインストールが完了。

あとは、いろいろと好きなようにゴリゴリやっていくだけです。

2019年4月29日月曜日

平成に残してしまったもの(雑

急に文章が適当になるけど。

「あぁ、、、平成も終わるというのに放置してしまったなぁ」ということのリスト。超個人的。

思いつくまま。

ヴィオラの練習絡みで。

4ポジとか5ポジの練習を十分にしなかったなぁ。。。

重音にとりかかれなかった。



数学絡み。

正直、多様体がいまだによくわからない。

接ベクトルのあたりで急にわからなくなる。

接ベクトルがわからないから微分形式がわからない。

多様体論わからないのに、機械学習周りで、多様体学習とかやっている人にいらっとくる。(いやわかっている人はいいんですが。)



物理。

電場とは?磁場とは?

っていうか、「場」ってなんなのかいまだによくわからない。

「場」っていう物理的実態があるの?そもそも理論展開の都合上、仮定しているものなの?


シーベルトって?

そもそも放射能ってなんなのかあんまりわかってない←おいっ


万有引力やクーロン力が逆二乗に従うけど、なんで?

大体の物理の教科書だと天下り的に仮定されているけど、天下りすぎでは?





2017年7月21日金曜日

Skleranを使ってみる3

前回の『Sklearnを使ってみる2』を引き続き読み進めていく。

本の方では、『Setosaとそれ以外という分類は簡単にできたが、ではSetosa以外をVirginicaとVirsicolorに分類するのはどうすればいいか、簡単にできそうにはない』と話が進んでいく。

ではどうするかというと、とりあえずの回答として『力技で総当たりで閾値を探す』という方法をとる。

で、まず手始めの準備として、Setosa以外だけから成る、特徴量とラベルを改めて抽出しなおしておく。
(不要なところは#でコメントアウトしてある。)
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]


#for t,marker,c in zip (range(3),'>ox','rgb'):
#    
#    plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)
#
#plt.show()


plength=features[:,2]
is_setosa=(labels=='setosa')

max_setosa=plength[is_setosa].max()
min_non_setosa=plength[~is_setosa].min()

#print('Maximum of setosa:{0}'.format(max_setosa))
#print('Minimum of others:{0}'.format(min_non_setosa))

features=features[~is_setosa]
labels=labels[~is_setosa]
virginica=(labels=="virginica")

最後の三行
features=features[~is_setosa]
labels=labels[~is_setosa]
virginica=(labels=="virginica")
が新たに加わった分。 最初の二行も前回やったブールインデックス参照。

is_setosaがsetosaのところがTrueでそれ以外がFalseの配列なので、それをTrueとFalseを反転させている。

なので~is_setosaは、setosa以外がTrueになっていて、setosaがFalseになっています。
で、ブールインデックス参照を使って、配列からsetosa以外に該当するものを抽出している。

三行目は二行目で抽出したsetosa以外のラベルから、特にvirginicaに一致するものだけをさらに抽出し、ブーリアン配列を生成する。

で、本題の閾値を探す部分のコードが以下。
#初期値の値は処理に影響がないように適当に決める。
とりあえず絶対に影響がないような値として負の値で設定しています。
best_acc=-1.0       #正解率の値の初期値
best_fi=-1.0          #閾値となる特徴量のラベルの値の初期値
best_t=-1.0           #具体的な閾値の数値の初期値


for fi in range(features.shape[1]):    #features.shapeの値はこのとき(100,4)となっている。
なのでfeatures.shape[1]は4。つまり特徴量の個数です。全ての特徴量を総当たりで試すという方針。

    thresh=features[:,fi].copy()       #特徴量を一つ固定してそれに対する数値を全部抽出
    thresh.sort()         #上の行で抽出した数値をソートする。

    for t in thresh:       #測定値一つ一つに対して、「それが閾値になりうるか」を総当たりで試す。

        pred=(features[:,fi]>t)      #測定値一つをとりあえず閾値として固定して、
その閾値以上となっている測定値に対して新しいブーリアン配列としている。

        if (labels[pred]=="virginica")!=():     #accがnanになることを排除。詳細は下記で。
        acc=(labels[pred]=="virginica".mean())      

#上の行でつくったブーリアン配列に対して、さらにラベルが"virginica"に一致しているものを抽出。
#つまり、結果としては、測定値が閾値以上でかつvirginicaであるものを抽出してその平均をとっている。
        if acc > best_acc:    #よりよい結果を出した「特徴量と閾値の組み合わせ」に更新する処理。
          best_acc=acc      #もし、よりいい正解率が出たのなら、よりその時点での最良正解率としてそれに更新
          best_fi=fi             #もし、よりいい正解率がでたのなら、そのときの特徴量を採用。
          best_t=t              #もし、よりいい正解率がでたのなら、そのときの閾値を採用。


本文とは違い、if(labels[pred]=="virginica")!=():  という行を追加していますが、これなしだと、accがnanになってしまうことがあるので追加している。

最後に以下を追加して一段落。
def apply_model(example):
   if example[best_fi] > best_t : print("virginica")
   else:print("versicolor")

2017年1月16日月曜日

Sklearnを使ってみる2

以前、といってもかなり前になってしまいますが、『Sklearnを使ってみる1』という投稿で、『実践 機械学習システム』という本を読み進めようとしていましたが、かなり間があいてしまいましたが、続きをやっていこうと思います。


前回、とりあえず以下のコードが動きました。
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

for t,marker,c in zip (xrange(3),">ox","rgb"):

 plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


とりあえず、この先
for t,marker,c in zip (xrange(3),">ox","rgb"):

 plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


の部分は使わないので、コメントアウトするなり消すなりしておきます。
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

#for t,marker,c in zip (xrange(3),">ox","rgb"):

 #plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


で代わりにコードを継ぎ足して以下のようにします。
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

#for t,marker,c in zip (xrange(3),">ox","rgb"):

 #plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


###追加した部分
plength=features[:,2]
is_setosa=(labels=='setosa')

max_setosa=plength[is_setosa].max()
min_non_setosa=plength[~is_setosa].min()

print("Maximum of setosa:{0}".format(max_setosa))
print("Minimum of others:{0}".format(min_non_setosa))



一行一行説明していきます。

plengthの行

まず、plengthの行は、生データから花弁の長さ(plength)の値だけからなる新しい配列を作成しています。

前回、Irisデータセットは辞書型配列になっていて、その"data"要素には生データの一覧がarray型で格納されているということを確認しました。

それで、そのdata要素をfeaturesという変数に格納しました。(なので当然featuresにも生データが入っている。)

featuresの中は特徴量がarray型としてデータ別に入っているわけです。各要素の3番目の要素(インデックスとしては2番目)には花弁の長さの値が入っているので、インデックス2番目だけをすべて抽出して、plengthという変数に配列として格納しますよ、という意味。

厳密に言えば、plengthの型はarray型です。気になるようであれば、print(type(plength))として確認する。

plengthの部分だけ確認するのであれば、print(plength)を一番最後に追記しておけば、本当かどうか確かめられる。


from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

#for t,marker,c in zip (xrange(3),">ox","rgb"):

 #plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


###追加した部分
plength=features[:,2]
is_setosa=(labels=='setosa')

max_setosa=plength[is_setosa].max()
min_non_setosa=plength[~is_setosa].min()

#print("Maximum of setosa:{0}".format(max_setosa))
#print("Minimum of others:{0}".format(min_non_setosa))

print(plength)
print(type(plength))



これを実行すれば、
[ 1.4  1.4  1.3  1.5  1.4  1.7  1.4  1.5  1.4  1.5  1.5  1.6  1.4  1.1  1.2
  1.5  1.3  1.4  1.7  1.5  1.7  1.5  1.   1.7  1.9  1.6  1.6  1.5  1.4  1.6
  1.6  1.5  1.5  1.4  1.5  1.2  1.3  1.5  1.3  1.5  1.3  1.3  1.3  1.6  1.9
  1.4  1.6  1.4  1.5  1.4  4.7  4.5  4.9  4.   4.6  4.5  4.7  3.3  4.6  3.9
  3.5  4.2  4.   4.7  3.6  4.4  4.5  4.1  4.5  3.9  4.8  4.   4.9  4.7  4.3
  4.4  4.8  5.   4.5  3.5  3.8  3.7  3.9  5.1  4.5  4.5  4.7  4.4  4.1  4.
  4.4  4.6  4.   3.3  4.2  4.2  4.2  4.3  3.   4.1  6.   5.1  5.9  5.6  5.8
  6.6  4.5  6.3  5.8  6.1  5.1  5.3  5.5  5.   5.1  5.3  5.5  6.7  6.9  5.
  5.7  4.9  6.7  4.9  5.7  6.   4.8  4.9  5.6  5.8  6.1  6.4  5.6  5.1  5.6
  6.1  5.6  5.5  4.8  5.4  5.6  5.1  5.1  5.9  5.7  5.2  5.   5.2  5.4  5.1]

こうなる。

is_setosaの行

次にis_setosaの行。
まさにリスト内包表記を使っている例。
前回でlabelという変数に、どのデータがどの花なのかという名前の対応リストを格納しました。

(label=='setosa')で、labelの中の名前の一覧と比較してsetosaに一致していればTrueを、そうでなければFalseを返してTrueかFalseから成る配列を生成しis_setosaに格納します。

もっとスマートにいえばブーリアン配列を生成するということです。

確認するには、例のごとくprint(is_setosa)を追記して実行すればいいです。面倒なのと、若干くどい気もするので、ここは省略。


max_setosaの行

次にmax_setosaの行へ行きます。

plength[is_setosa]の意味ですが、ブールインデックス参照という書き方です。

is_setosaがTrue or Falseからなる配列であることを上で書きました。そういうブーリアン配列をインデックスとして代入すると、plengthの要素の中からブーリアン配列のTrueに対応している要素だけを抽出して新しい配列を作成します。

Trueになっているのはsetosaのところでしたので、setosaに対応している花弁の長さだけが抽出できます。

plength[is_setosa]という名前の新しい配列なので、それにmax()メソッドを使っている。

つまり、setosaの花弁の長さの中で一番値が大きいものを、max_setosaに代入。

min_non_setosaの行

この行も、先ほど使ったブールインデックス参照が使われてます。

今度はsetosa以外のものの最小値を求めています。

setosa以外、ということはis_setosaにおいてはFalseにあたるものです。

Falseのままではブールインデックス参照ができないので、「~」演算子を使ってビット反転させis_setosaのTrueはFalseに、FalseはTrueにしてして代入しています。

printの行

最後は、処理というよりは、単純にpythonの文法ですが、一応自分なりに説明しておきます。

これは文字列に対するformatメソッドです。
調べてみると、formatメソッドにもいろいろ描き方のバリエーションがあるようですが、おそらく基本的な描き方は以下の形式かと思われます。

'文字列'.format(要素0,要素1,・・・)
ドットより前の文字列の中に、formatに引数として渡されている要素のインデックスの番号を代わりに代入して、最終的な出力文字列の体裁だけ整えるイメージです。

上記の"Maximum of setosa:{0}".format(max_setosa)とかであれば、この場合はformatメソッドに渡している要素が一つだけなので、それがインデックス0番目ということになりますが、それを「Maximum of setosa:{0}」という文字列の{0}をmax_setosaで置き換えたものが、結果としてできる文字列です。それをprintしている。
{数字}のところが、その番号に対応しているインデックスの要素で置きかわるという意味です。
詳しくは、下でまとめてあるリンクや本を参照。


で結局のところ、
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]


#for t,marker,c in zip (range(3),'>ox','rgb'):
#    
#    plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)
#
#plt.show()


plength=features[:,2]
is_setosa=(labels=='setosa')

max_setosa=plength[is_setosa].max()
min_non_setosa=plength[~is_setosa].min()

print('Maximum of setosa:{0}'.format(max_setosa))
print('Minimum of others:{0}'.format(min_non_setosa))

を実行すると、
hiroshi-no-MacBook-Air:Pro-tr hiroshi$ python3 others.py
Maximum of setosa:1.9
Minimum of others:3.0

という感じになります。
参考にしたページや文献・書籍
NumPy配列のブールインデックス参照 | hydroculのメモ
Python 3 の文字列フォーマット formatメソッド | TM Life
『実践 機械学習システム』(オライリー)

2016年7月10日日曜日

シグモイド関数の描画

gnuplotもインストールしたし、matplotlibも使える状態だしということで、なんだかんだ可視化やグラフ描画をするツールは割りと揃ってきた。。

それぞれ、ツールの使い方の勉強という意味含め、ニューラルネットなどででてくるのシグモイド関数の振る舞いをイメージしておきたいなども理由もあるので、シグモイド関数を描画してみようと思い描画してみた。。

gnuplotでの描画

gnuplotでもfor文が使えるらしいのでそれを使う。

ターミナルを起動して、gnuplotを起動する。
hiroshi-no-MacBook-Air:Pro-tr hiroshi$ gnuplot     #gnuplotと打ち込んでreturnを押す
起動したら次のように打ちます。
gnuplot> set yrange[0:1]       #見栄えを良くするための設定。y軸方向の描画範囲の指定。
gnuplot> plot for [i=0:10] 1/(1+exp(-i*x/10))
これを実行すると、次のような図が表示される。




gnuplotを起動したときに、毎回表示されるバージョンを確認しよう。
どうやら、plot forという書き方はバージョン4.4からの機能のようだ。
(参考:明日できること)

matplotlibでの描画

matplotlibでは次のように描画する。

matplotlibとscipyがインストールできていることは前提。 インストールできていない場合はまずこちらから。
Macでpython3の環境構築9---Scipyのインストール---
Macでpython3の環境構築4---Matplotlibのインストール1---
from matplotlib import pyplot as plt
import scipy as sp

x=sp.arange(-10,10,0.1)
for t in range(10):        #必要なグラフは先にすべて生成する。
  y=1/(1+sp.exp(-(2*t*x/10)))
  plt.plot(x,y)         


plt.show()   #最後にまとめて描画すると重ねて表示される。
matplotlibの使い方の説明にもなってしまうが、グラフを重ねて描画するときは、先にplt.plot()、plt.plot()という感じで必要なグラフをすべて生成して、最後にplt.show()をして最後に描画する。

上記を例えば、テキストファイルに書き、sigmoid.pyという名前で保存。sigmoid.pyがあるカレントディレクトリに移動して、
hiroshi-no-MacBook-Air:Pro-tr hiroshi$ python3 sigmoid.py
とコマンドを打って実行すると、次のような画面が出てくる。



for文のところで、あまり数を刻みすぎてしまうと、グラフが表示されたときよくわからない表示になってしまうので、適当に間引いて描画したほうがそれらしくみえる。

参考にしたページや文献・書籍
明日できること
シグモイド関数---wiki

2016年4月23日土曜日

Sklearnを使ってみる1

かなり以前になりますが、『Macでpython3の環境構築3---ライブラリのインストール---』でsklearnをインストールしたので、『実践 機械学習システム』を読みながら、sklearnをいじってみたいと思います。

で、特に理由はありませんが、スタートは第2章のIrisデータセットを扱う章から、始めます。Irisデータセット自体はsklearnをインストールしたときに一緒についてきます。

最初にがっつりとしたコードが出てくるのが以下のようなコードです。

from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

for t,marker,c in zip (xrange(3),">ox","rgb"):

 plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)


本の冒頭にて、この本ではpython2.7をベースにかかれているのですが、自分はPython3.4を使っているのでうまく動きません。それに加え、そもそもコードの意味もよくわかりません。。。

とりあえず、これを動くようにしたり解読したりするところから始めたいと思います。

まず、動かす。

まず、動くようにすることを考えます。
どうやら、xrangeといところが問題だったようです。python3.xではrangeの方にxrangeが統合されているようです。
それと最後にplt.show()も追記が必要です。
結局のところ、以下のようにすれば動作します。
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np

data = load_iris()

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]

for t,marker,c in zip (range(3),'>ox','rgb'):
                       
 plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)
 plt.show()



Irisデータセットの構造

とりあえず動いたので、もっと詳細を解読していきたいと思います。
次に、何をしているのかよくわからなかったのが、上の例でいう5行目(空白行は除いて)から9行目の部分。

features=data["data"]
feature_names=data["feature_names"]
target=data["target"]
target_names=data["target_names"]
labels=target_names[target]
これはIrisデータセットがディクショナリー型になっていることがわかり理解できました。 Irisデータセットは次のようなディクショナリー型のデータになっています。
#説明用の擬似コード
load_iris={data:(測定値などの一覧),
DESCR:(引用情報などの参考情報),
target_names:(あやめ(Iris)の種類の名前),
featurenames:(「 花弁の長さ」など特徴量の名前),
target:(あやめの種類の名前にそれぞれ割り当てる番号)
}

ディクショナリのキーを取得しようとすると次のようになります。

#最初の>>python3を実行する部分 は省略
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>data.keys()
dict_keys(['DESCR', 'data', 'feature_names', 'target', 'target_names'])
#表示される順番は毎回違うようです。



#####ファイルに保存して実行する場合はこうする。
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>print(data.keys())

###→例えばiris.pyという名前で保存し、ターミナルから実行すると同じような結果になる。
各項目の中をみてみます。まずは、'data'というキーに対応する要素は次のようになっています。
#最初の>>python3を実行する部分 は省略
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>data.data()
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 5.4,  3.9,  1.7,  0.4],
       [ 4.6,  3.4,  1.4,  0.3],
       [ 5. ,  3.4,  1.5,  0.2],
       [ 4.4,  2.9,  1.4,  0.2],
       [ 4.9,  3.1,  1.5,  0.1],
       [ 5.4,  3.7,  1.5,  0.2],
       [ 4.8,  3.4,  1.6,  0.2],
       [ 4.8,  3. ,  1.4,  0.1],
       [ 4.3,  3. ,  1.1,  0.1],
       [ 5.8,  4. ,  1.2,  0.2],
       [ 5.7,  4.4,  1.5,  0.4],
       [ 5.4,  3.9,  1.3,  0.4],
       [ 5.1,  3.5,  1.4,  0.3],
       [ 5.7,  3.8,  1.7,  0.3],
       [ 5.1,  3.8,  1.5,  0.3],
       [ 5.4,  3.4,  1.7,  0.2],
       [ 5.1,  3.7,  1.5,  0.4],
       [ 4.6,  3.6,  1. ,  0.2],
       [ 5.1,  3.3,  1.7,  0.5],
       [ 4.8,  3.4,  1.9,  0.2],
       [ 5. ,  3. ,  1.6,  0.2],
       [ 5. ,  3.4,  1.6,  0.4],
       [ 5.2,  3.5,  1.5,  0.2],
       [ 5.2,  3.4,  1.4,  0.2],
       [ 4.7,  3.2,  1.6,  0.2],
       [ 4.8,  3.1,  1.6,  0.2],
       [ 5.4,  3.4,  1.5,  0.4],
       [ 5.2,  4.1,  1.5,  0.1],
       [ 5.5,  4.2,  1.4,  0.2],
       [ 4.9,  3.1,  1.5,  0.1],
       [ 5. ,  3.2,  1.2,  0.2],
       [ 5.5,  3.5,  1.3,  0.2],
       [ 4.9,  3.1,  1.5,  0.1],
       [ 4.4,  3. ,  1.3,  0.2],
       [ 5.1,  3.4,  1.5,  0.2],
       [ 5. ,  3.5,  1.3,  0.3],
       [ 4.5,  2.3,  1.3,  0.3],
       [ 4.4,  3.2,  1.3,  0.2],
       [ 5. ,  3.5,  1.6,  0.6],
       [ 5.1,  3.8,  1.9,  0.4],
       [ 4.8,  3. ,  1.4,  0.3],
       [ 5.1,  3.8,  1.6,  0.2],
       [ 4.6,  3.2,  1.4,  0.2],
       [ 5.3,  3.7,  1.5,  0.2],
       [ 5. ,  3.3,  1.4,  0.2],
       [ 7. ,  3.2,  4.7,  1.4],
       [ 6.4,  3.2,  4.5,  1.5],
       [ 6.9,  3.1,  4.9,  1.5],
       [ 5.5,  2.3,  4. ,  1.3],
       [ 6.5,  2.8,  4.6,  1.5],
       [ 5.7,  2.8,  4.5,  1.3],
       [ 6.3,  3.3,  4.7,  1.6],
       [ 4.9,  2.4,  3.3,  1. ],
       [ 6.6,  2.9,  4.6,  1.3],
       [ 5.2,  2.7,  3.9,  1.4],
       [ 5. ,  2. ,  3.5,  1. ],
       [ 5.9,  3. ,  4.2,  1.5],
       [ 6. ,  2.2,  4. ,  1. ],
       [ 6.1,  2.9,  4.7,  1.4],
       [ 5.6,  2.9,  3.6,  1.3],
       [ 6.7,  3.1,  4.4,  1.4],
       [ 5.6,  3. ,  4.5,  1.5],
       [ 5.8,  2.7,  4.1,  1. ],
       [ 6.2,  2.2,  4.5,  1.5],
       [ 5.6,  2.5,  3.9,  1.1],
       [ 5.9,  3.2,  4.8,  1.8],
       [ 6.1,  2.8,  4. ,  1.3],
       [ 6.3,  2.5,  4.9,  1.5],
       [ 6.1,  2.8,  4.7,  1.2],
       [ 6.4,  2.9,  4.3,  1.3],
       [ 6.6,  3. ,  4.4,  1.4],
       [ 6.8,  2.8,  4.8,  1.4],
       [ 6.7,  3. ,  5. ,  1.7],
       [ 6. ,  2.9,  4.5,  1.5],
       [ 5.7,  2.6,  3.5,  1. ],
       [ 5.5,  2.4,  3.8,  1.1],
       [ 5.5,  2.4,  3.7,  1. ],
       [ 5.8,  2.7,  3.9,  1.2],
       [ 6. ,  2.7,  5.1,  1.6],
       [ 5.4,  3. ,  4.5,  1.5],
       [ 6. ,  3.4,  4.5,  1.6],
       [ 6.7,  3.1,  4.7,  1.5],
       [ 6.3,  2.3,  4.4,  1.3],
       [ 5.6,  3. ,  4.1,  1.3],
       [ 5.5,  2.5,  4. ,  1.3],
       [ 5.5,  2.6,  4.4,  1.2],
       [ 6.1,  3. ,  4.6,  1.4],
       [ 5.8,  2.6,  4. ,  1.2],
       [ 5. ,  2.3,  3.3,  1. ],
       [ 5.6,  2.7,  4.2,  1.3],
       [ 5.7,  3. ,  4.2,  1.2],
       [ 5.7,  2.9,  4.2,  1.3],
       [ 6.2,  2.9,  4.3,  1.3],
       [ 5.1,  2.5,  3. ,  1.1],
       [ 5.7,  2.8,  4.1,  1.3],
       [ 6.3,  3.3,  6. ,  2.5],
       [ 5.8,  2.7,  5.1,  1.9],
       [ 7.1,  3. ,  5.9,  2.1],
       [ 6.3,  2.9,  5.6,  1.8],
       [ 6.5,  3. ,  5.8,  2.2],
       [ 7.6,  3. ,  6.6,  2.1],
       [ 4.9,  2.5,  4.5,  1.7],
       [ 7.3,  2.9,  6.3,  1.8],
       [ 6.7,  2.5,  5.8,  1.8],
       [ 7.2,  3.6,  6.1,  2.5],
       [ 6.5,  3.2,  5.1,  2. ],
       [ 6.4,  2.7,  5.3,  1.9],
       [ 6.8,  3. ,  5.5,  2.1],
       [ 5.7,  2.5,  5. ,  2. ],
       [ 5.8,  2.8,  5.1,  2.4],
       [ 6.4,  3.2,  5.3,  2.3],
       [ 6.5,  3. ,  5.5,  1.8],
       [ 7.7,  3.8,  6.7,  2.2],
       [ 7.7,  2.6,  6.9,  2.3],
       [ 6. ,  2.2,  5. ,  1.5],
       [ 6.9,  3.2,  5.7,  2.3],
       [ 5.6,  2.8,  4.9,  2. ],
       [ 7.7,  2.8,  6.7,  2. ],
       [ 6.3,  2.7,  4.9,  1.8],
       [ 6.7,  3.3,  5.7,  2.1],
       [ 7.2,  3.2,  6. ,  1.8],
       [ 6.2,  2.8,  4.8,  1.8],
       [ 6.1,  3. ,  4.9,  1.8],
       [ 6.4,  2.8,  5.6,  2.1],
       [ 7.2,  3. ,  5.8,  1.6],
       [ 7.4,  2.8,  6.1,  1.9],
       [ 7.9,  3.8,  6.4,  2. ],
       [ 6.4,  2.8,  5.6,  2.2],
       [ 6.3,  2.8,  5.1,  1.5],
       [ 6.1,  2.6,  5.6,  1.4],
       [ 7.7,  3. ,  6.1,  2.3],
       [ 6.3,  3.4,  5.6,  2.4],
       [ 6.4,  3.1,  5.5,  1.8],
       [ 6. ,  3. ,  4.8,  1.8],
       [ 6.9,  3.1,  5.4,  2.1],
       [ 6.7,  3.1,  5.6,  2.4],
       [ 6.9,  3.1,  5.1,  2.3],
       [ 5.8,  2.7,  5.1,  1.9],
       [ 6.8,  3.2,  5.9,  2.3],
       [ 6.7,  3.3,  5.7,  2.5],
       [ 6.7,  3. ,  5.2,  2.3],
       [ 6.3,  2.5,  5. ,  1.9],
       [ 6.5,  3. ,  5.2,  2. ],
       [ 6.2,  3.4,  5.4,  2.3],
       [ 5.9,  3. ,  5.1,  1.8]])

実際に各サンプルに対する測定値が格納されている様子がわかります。

次は、'target_names'に対応する要素、あやめ(Iris)の種類の名前としてどういう要素が格納されているかみます。

調べ方は上記とほとんど同じです。

#最初の>>python3を実行する部分 は省略
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>data.target_names
array(['setosa', 'versicolor', 'virginica'], 
      dtype='

setosaとversicolorとvirginicaという名前があるのがわかります。最後についている余分なやつはよく意味はわかりませんが、とりあえずスルーします。

同様に、'feature_names'に対応する要素の中をみます。
#最初の>>python3を実行する部分 は省略
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>data.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

最後に、'target'に対応する要素の中身。

#最初の>>python3を実行する部分 は省略
>>from sklearn.datasets import load_iris
>>data=load_iris()
>>data.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
で最後のlabels=target_names[target]の行で、0→setosa、1→versicolor、2→virginicaに対応させる処理をしています。 これも最初あまり意味がわかりませんでしたが、numpyの文法です。 target_namesのリストから0か1か2に対応するインデックスの要素を取り出し、新しいリストを作るという意味です。 事実上ラベル付けを行っていることになります。よく使う利用法らしい。
from sklearn.datasets import load_iris
>>data=load_iris()
>>> features=data['data']
>>> features_name=data['feature_names']
>>> target=data['target']
>>> target_names=data['target_names']
>>> label=target_names[target]
>>> label
array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa',
       'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica', 'virginica', 'virginica',
       'virginica', 'virginica', 'virginica'], 
   )


for文のブロック

次にわからなかったのが、この行です。

for t,marker,c in zip (range(3),’>ox’,’rgb’):

まず、このzipというのはfor文を3つ同時に処理する関数のようです。(なんて便利なんだ。。。)

上の例でいえば、変数tにはrange(3)の中身を順番に代入、変数markerには{>,o,x}を順番に代入、変数cには{r,g,b}を順番に代入、ということです。

で、rgbの方はいいとして、>oxってなんなのかと。 これは、実際に描画するときのマーカーの形(?)だそうです。matplotlibのオプションです。 詳しくはここのページを(Markers--matplotlib.markers) もう少しだ。。。次はこの行。
plt.scatter(features[target == t,0],features[target == t,1],marker=marker,c=c)

まず、scatterは散布図を描画するmatplotlib提供の関数です。

features[target==t,0]というのは、features自体が実際にデータ(数値)が格納されているリストなわけですが、その中でも[ ]の中の条件に一致するものだけを抽出していますよ、という意味です。

つまり上の例でいえば、featuresの0番目の要素の一覧の中、targetが例えば0(=0であればそれはsetosaなわけですが)に該当するもの、 さらに言い換えておけば、target=0のときはsetosaのfeaturesの0番目要素だけを抽出するという意味です。

なんか言い換えたけどわかりやすくなっている気がしない。

さらに、plt.scatter()やplt.plot()などmatplotlibの描画系は先にグラフを生成して、最後にplt.show()をすると、最後にグラフが重ねて描画されます。

今回のケースではfor文として3回処理されるので、3種類のプロットが重ねて描かれます。

上記のようなことも含め、実際に冒頭のコードを実行すると、次のような画面が出てきます。



そうすると、本に書かれている6枚のグラフのうち、一番左上のグラフが描画されます。



2014年2月8日土曜日

大喜利・間の研究

人工知能について考えていることで、難しそうだなと思ったことについていくつか書こうと思う。



1.
IPPONグランプリという番組が好きだ。

今でこそ名も知れてきたが、最初は深夜での放送だったと思う。

一個一個ネタが短く独立しているのでどこから見ても楽しめるし、「なぜ、どこが面白いのか」などを考える前に笑える瞬発的なネタを提供してくれる。

なにが面白いのかわからないけど、笑える。でもチャレンジしている側は非常にセンスが問われるし、無駄に体を張って笑いをとりにいくような下品な番組ではないというところも、個人的にはポイントが高い。

IPPONグランプリに限らないが、大喜利を人工知能にやらせるのは難しいのではないかと思った。

既に、人工知能のワトソンがクイズ大会で優勝をした。

クイズ大会のように、正解を答えればよいというものではない。前後の文脈であるとか、背景的な知識とか、そもそも面白いというのを機械が理解をして対応しなければいけないと思うので非常に難しいと思う。



2.
間というのはなかなか難しい。

音楽や演劇などの時間芸術では、間というものも重要な役割を果たす。

うまく間をとらないと、うまく全体が閉まらなかったり、いわゆる場が流れるという状態になってしまう。

鈍感な人だと、人間であっても「間」や場が流れるといった状態をそもそも理解できなかったりもする。

しかし、いざ「間」とは何かを明確に説明しようとすると困る。

どうすれば、間がうまく決まるのかはノウハウとして説明することは、音楽や演劇などのレッスンで実際に指導することができるように、可能かとは思う。

だが、それを機械でそのまま実装したからといって、機械が「間」を使いこなせるようになるとは思えない。

2013年6月14日金曜日

シンポジウムに行ってきました。

先日、第3回脳情報通信融合研究シンポジウム「脳科学で拓く次世代情報通信」というものに行ってきた。現在の研究者がどんなことを考えているのか、課題としているのかなどが聞けて面白かった。
印象に残っているのが、柳田先生の講演と池田先生の講演。
柳田先生は「ゆらぎ」の研究をしている方。脳は「ゆらぎ」というノイズを積極的に活用して情報処理を省エネ化しているとのこと。
具体例として、ミオシンの動きや、アメーバ細胞の動き、また脳が閃く際の脳の活動などを挙げており、これらはノイズを積極的に活用しているからこそ、効率的に情報処理ができるとのこと。ミクロレベルからマクロレベルまで階層を越えて現れるノイズこそが、情報処理の省エネ化のポイントなのではないかとのことだ。このノイズが情報処理に果たす役割について研究し、逆にそれを応用し現在の情報処理の省エネ化、エネルギー問題に貢献できないかと考えているらしい。
また池谷先生の講演はとてもおもしろいものだった。このかたは読売新聞にも記事を提供しているが、そこに掲載されている写真だと生粋の堅物文化人という印象だったが、フランクで面白い人だった。内容として印象に残っているのは、人間が感知できないものとして、赤外線や紫外線などと並列に脳の自発活動も挙げている事、失った感覚を他の感覚で代用することができるのではないかと主張していることなどでした。
パネルディスカッションのあとに参加者からの質問もいくつか受け付けていた。物理学科の人で、宇宙論との類似点などはあるかと質問している人もいた。
結局質問はしなかったのだが、私もこんなことを考えてみた。

①脳の再定義はできるか
②神経モデルのモデル自身に数学的な構造はあるか
③脳や知能と呼ばれるものを実現する他の構造はあるか

①は、実世界でも1秒の定義が変わったり、1メートルの定義が変わったりし、また数学などにおいても性質と定義を入れ替えて定義をするというようなことをよくやるが、そのようなことが脳や知能でもできるのかどうかということ。再定義できれば、③で述べるように一般化へと繋がる。
ここでさらなる疑問がでてくるが、再定義をすることの意味は一般化へつながるということ以外になにか他にどのような意味があるのだろうか。
②は、例えば可積分系とか量子群とか結晶格子のような数理物理などでやっているようなことを神経モデルでもできるだろうかという疑問。
根底を貫いている数学的原理などがあればうれしい。それが素数とかと関連してればなお面白いなどと妄想をしてみる。
③については、脳や知能をどう定義するかにもよる、という意味で①とも関連してくる。また、上手く定義できたとしてその定義を満たす構造はどのくらいあるのか。少し論理の飛躍を許してもらえれば、可能な構造がどのレベルの原理に依存しているかというのも気になる。多元宇宙論で考えられているように、可能な物理法則と対応しているのか、もっと根元的に可能な論理と対応しているのか。