機械学習:Scikit-learn アイリスデータでk-最近傍法をやってみる

Keita_Nakamoriです。

前回、アイリスデータの内容を確認しました。

今回は、機械学習で最も単純と思われるk-最近傍法をやっていきます。

  • 必要なモジュールをインポート
  • データをロードして、入力データと出力データを定義

トレインデータ(訓練用)とテストデータ(検証用)に分割する

# データはランダムに振り分けるが,固定し、0という番号を付ける。

X_train のデータをデータフレーム化して、内容を確認する

columns=iris_dataset[“feature_names”] #データフレームの列名を定義
df=pd.DataFrame(X_train,columns=columns)
df[:5]

X_train のデータフレームをpd.plotting.scatter_matrix()で可視化して眺める。

 k- 最近傍法分類 をやってみる

モデルの作成とトレーニング

予測する

予測性能の評価

結果:0.9736842105263158

または、

でもいいです。

機械学習:Scikit-learn アイリスデータを良く見る

Keita_Nakamoriです。

今日はsklearnのアイリスデータを良く見てみようと思います。

インストール

>pip install sklearn

して

Requirement already satisfied: sklearn in c:\users\omoiy\anaconda3\lib\site-packages (0.0)
Requirement already satisfied: scikit-learn in c:\users\omoiy\anaconda3\lib\site-packages (from sklearn) (0.19.1)

と出るので、すでに入っていました。アナコンダですから。

インポートそしてインスタンス作成

アイリスデータが入っている、ロードアイリスをsklearn.datastetsからインポートします。
from sklearn.datasets import load_iris

関数としてロードアイリスのインスタンス、アイリスデータセットを作成します。

iris_dataset=load_iris #ロードアイリス関数

では、アイリスデータセットを見てみましょう。

iris_dataset()

わけのわからないデータの羅列が出てきますが、よく見るとディクショナリによく似た”Bunchクラス”という形式でデータが入っています。

ディクショナリと同様に、キーとバリューを指定できます。

iris_dataset().keys()

キーを指定してみます。長いので500文字で切りましょう。DESCRはディスクドライブの略です。

まずは、データの概要を見る

iris_dataset[“DESCR”][:500]

または、下のように書くと、見やすくなります。

print(iris_dataset()[“DESCR”][:500]+”\n…”)

データセットの特性

インスタンス数:150 (3クラスあり、それぞれ50個)

アトリビュートの数:

4つの予測用アトリビュート(数値)

  • sepal長さ[cm] sepal 幅 [cm]
  • petal長さ[cm] petal 幅 [cm]

クラス(分類)

  • Iris-Setosa
  • Iris- Versicolour
  • Iris-Virginica

訓練用のインプット”データ”を確認する。

iris_dataset()[“data”]

.shape()で大きさを確認すると(150, 4)。4つの予測用アトリビュートをもった塊が150個ある。

正解である”ターゲット”を確認する

iris_dataset()[“target”]

  • 0=Iris-Setosa
  • 1=Iris- Versicolour
  • 2=Iris-Virginica

なのでしょう、きっと。

ターゲットの名前

iris_dataset()[“target_names”]

ここで出てきました。分類名。前述で予想した通りの順番でした。

特徴の名称を確認する

これも、DESCRでの記述順通りでした。

以上、ロードアイリスのデータでした。

次回は訓練させていきます。

Math:固有値・固有ベクトル

英語でいうと アイゲンバリューとアイゲンベクターというそうです。

(Eigen Value , Eigen Vector)

メモっておきます。

ステップ0 定義

  • A:行列
  • X:ベクトル
  • λ:スカラー

があったら

AX=λX

と表されるとき、右辺のλとXは

  • λ:固有値
  • X : 固有ベクトル

と呼ばれます。

言わなくてもわかると思いますが、X=ゼロベクトル というのは無しですよ!

ステップ1 変換

線形変換の復習です

左辺

  • A=[[2,3],[2,1]]
  • X=[1,3]

のとき、計算すると

  • AX=[2*1+3*3 , 2*1+1*3]=[11,5]

これは、ベクトルX[1,3]が行列Aによってベクトル[11,5]へ変換されたことを意味します。

ステップ2 ” 固有 ” とは

ベクトルXだけを変えてみましょう

  • X=[3,2]

すると、左辺は、

  • AX=[2*3+3*2 , 2*3+1*2]=[12,8]
  • さらに変形して,AX=4[3,2]

ということで、AX=λXの形と見比べると、左辺と右辺のベクトルXは[3,2]で同一の値になっていて、さらにスカラーλは4という値になりなっています。

このとき,

  • λ:固有値
  • X : 固有ベクトル

という呼び方をされます。

結果として、ベクトルXに行列Aをかけ合わせたんだけど、結果としてベクトルの向きは[3,2]のまま変わらないで大きさだけ4倍になった。

固有というのは「向きが保存される特殊な状況」ということです。

ステップ3 どんなとき使うの?

現時点iのときにα[i],β[i]という値をとる事象を考えます。

次の時点[i+1]のときは、それがα[i+1],β[i+1]に変化するとしましょう。

それぞれの数式は漸化式の如く下記のように表現できるものとしましょう。

  • α[i+1] =   0.5     α[i] + 0.4  β[i]
  • β[i+1] =-0.104 α[i] + 1.1   β[i]

そうすると、これはAX=λXのように表現できます。

  • [[0.5,0.4],[-0.104,1.1]]  [α[i],β[i]] = λ [α[i],β[i]]

ステップ4 固有値、固有ベクトルを求める

固有方程式を使うと固有ベクトルλを求めることができます。

  • 固有方程式:det(A-λE)=0

AX=λX を移行して

AX-λX=0 を行列Xでくくって

(A-λE)X=0  ※単位行列Eを忘れないで

ここでXはゼロベクトルではない。

ここで左辺の行列(A-λE)が逆行列を持っていたら、

(A-λE)^-1 (A-λE)X = (A-λE)^-1 ・0

EX=ゼロベクトル

Eは単位行列なので、Xがゼロベクトルでなくては、この式は満たされない。

でも、今は、固有値、固有ベクトルを有するためにはXがゼロベクトルであってはだめなので、そもそも、「(A-λE)に逆行列があってはならない」というところまで遡る。

行列(A-λE)が逆行列を持たない条件

det(A-λE)=0

結果

λ=1.02 , 0.58 と2つ解(固有値)が出てきますので、それぞれ

  • λ1=1.02
  • λ2=0.58

としましょう。

固有ベクトルは、いまさっき求めた固有値を使って

  • (A-λ1E)X=0 より固有ベクトル v1=[10,13]
  • (A-λ2E)X=0 より固有ベクトル v2=[5,1]

と算出できます。

ステップ5 AX=λXの意味

  • 固有ベクトル v1=[10,13] のとき

AX=λXは

  • [[0.5,0.4],[-0.104,1.1]] [10,13] = 1.02  [10,13]

この意味するところは、[α[i],β[i]]=[10,13] という組み合わせのときには、

そのベクトル[10,13] を変化されることなく、ステップごとに1.02倍されていく ということです。

同様に、固有値 λ2 = 0.58 のとき

  • 固有ベクトル v2=[5,1]
  • [[0.5,0.4],[-0.104,1.1]]  [5,1] = 0.58 [5,1]

こちらの意味も同様に、そのベクトル[5,1] を変化されることなく、ステップごとに0.58倍されていく ということです。

これで、どういう組み合わせのときに、その組み合わせの割合を変えずに、スケールだけを変化させられるのかがわかるようになりました。

しかし、これでは、2つの固有ベクトルのとき、という限定された情報しかありません。

ステップ6 最終的には・・・

初期ベクトルX[0]を

  • X[0]=C1 V1+C2 V2

と置きます。

ここで V1,V2は固有ベクトル

C1,C2は固有ベクトルにないかしらを掛け算する係数

では、ステップを進めてみましょう。

  • X[1] = AX[0]= C1 A  V1+C2 A  V2

ここで Aをλに入れ替えます。

  • X[1] = C1 λ1 V1+C2 λ2  V2

さらにすすめて

  • X[2] = AX[1]= C1 λ1λ1  V1+C2 λ2λ2  V2
  • X[3] = AX[2]= C1 λ1λ1λ1  V1+C2 λ2λ2λ2  V2

λが増えていくだけです。

  • X[i] = C1 (λ1^i) V1+C2 (λ2^i)  V2
  • X[∞] = C1 (λ1^∞) V1+C2 (λ2^∞)  V2

ここで λ2は1よりも小さいので λ2^∞=0 、 よって

  • X[∞] = C1 (λ1^∞) V1

よって、ステップ数を増やしていくと、最終的には固有ベクトルv1に落ち着くということです。

もう一度整理すると。X[i+1]のときは、

  • X[i+1] = C1 (λ1^(i+1)) V1 =λ C1 (λ1^i) V1 よって
  • X[i+1]=λ1  X[i]

というシンプルな形になります。

VR:オブジェクトを発射する

Keita_Nakamoriです。

前回やった、オブジェクトの召喚(Summon.cs)を発展させて、出現と同時に、別のスクリプト(Shooter.cs)を追加し初速度を与えることにより、砲弾のようにオブジェクトを前方へ発射させてみましょう。

スクリプト Shooter.cs

これはまだ、Summon.csと同じく、オブジェクトを召喚するだけです。

Shooter.csを設置するヒエラルキーの場所

新規にEmptyObjectを追加し、オブジェクトの名前をわかりやすくShooterにします。

置き場所はどこでもいいのですが、オブジェクトを発射するのは自分であるということで、MeMyselfEyeに入れました。またDayDreamコントローラーのAppボタンによって発射するということで、GrvControllerPointerの下に入れました。

インスペクターに Objectをアタッチする

Bullet Object : 砲弾として打ち出すオブジェクト。今回はCubeで作ったボール字形状のものを2個中心座標を若干ずらして重ねたものを設定した。(本当は半球を2つ合わせたほうが良いです。)

Mazzle Psition:オブジェクトを出現させる初期位置のオブジェクト。今回は目の前のカーソルを設定した。

Shooter2.cs

では、Shooter.csで召喚したモンスターボールオブジェクトに対して、当該Shooter2.csによりオブジェクトに初速を与えてみます。Shooter2.csはモンスターボールオブジェクトのインスペクターに設置します。

ShooterDestroy.cs

オブジェクトを召喚しすぎると、処理が重くなってしまい、最悪フリーズします。

定期的にオブジェクトを壊す(Destroy)して数を減らさなくてはなりません。

こちらも、モンスターボールオブジェクトのインスペクターの中にいれます。

以上です。

HoloLense:久しぶり

久しぶりにホロレンズをかぶりました。

Keita_Nakamori です。

ツール関係のセットアップ

マイクロソフトアカデミーを見てみると、おすすめのUnityバージョンがUnity 2018.3.10f1に上がっていましたので改めてインストール。

MRツールキット Mixed Reality Toolkit (MRTK V2) for Unity のほうもV2(バージョン?)になっているので合わせてダウンロード

ダウンロードして、どうするかは忘れました・・・

Unityプロジェクトを作りましょ

プロジェクト名:MR_test_001

場所:C:\Users\Public\Documents\Unity Projects

メインカメラのMR化

ヒエラルキー>メインカメラ

背景を透明にしましょ:ClearFlags=ソリッドカラーにします。

Background=全部ゼロで真っ暗な透明にします。

Clipping Planes=デフォルトはあ0.3ですが0.85にします。少し遠めですね。

シーン名をMainにしてセーブしましょ。

プロジェクトの設定

エデット>プロジェクトセッティング>クオリティは

Very Lowにします。ホロレンズのCPUはしょぼいので、軽くしてスピード重視ということです。

エデット>プロジェクトセッティング>プレイヤーは

ウィンドウズマークを押して、XR Setingsのバーチャルリアリティサポートにチェックをいれて、SDKにWindows Mixed Realityを選択します。

次に、(こんなんあったかな?)Configuration>Scripting BackendをIL2CPPかから.NETに変更します。意味はわかりません。

オブジェクトをシーンに追加してビルド

cubeをシーンに追加しました。

ホロレンズをかぶって、windowsstoreからHolographic Remoting Playerをダウンロードして実行。

IP address   192.168.0.125   とでました。

次、ホロレンズエミュレーターでやってみようということで、ダウンロードして実行しました。

  • HoloLensEmulatorSetup.exe

UnityメニュのWindowの下にエミュレータという項目が出るはずですが、出てこないのでUnityを再起動。

でてこないので、目を凝らすとXRとあったのでここを押したら、この中にEmulatorがありました。

警告:あなたはVRサポートセッティングを使用できるようにして、なおかつMRをデバイスに追加すべし。エミュレータを使えるようにね!

ほうほう、なにかが足りないらしい・・・。

でも、今日はホロレンズが目の前にあるのだから、エミュレータじゃなくていいよね!やめた!

ここまでで1時間か ぐぬぬぬ・・・

USBで直接つないでビルド

File>build Setting でビルドしましょう

platformはUniversal Windows Platform 通称 UWPです。知らないとはまりますw

Target DeviceをAny DeviceからHoloLensに変更して、DebuggingはUnity C# Projectsにチェックを入れます。

あ、スイッチプラットフォームの位置がUnity2017から変更されてますね。スイッチしましょう。

これでビルドできると思いきや、Buildボタンがアクティブにならない・・・

警告:.NETはインストールされていません。なぬ~~~

AndroidSDKとJDKはいじってないから、ここかなあ。

Edit>Preferences>External Tools です。親切にもDownloadボタンが横にあるので押してみます。

  • android-studio-ide-182.5314842-windows.exe

これがダウンロードされたらインストールを実行しましょう。

C:\Program Files (x86)\Android\android-sdk に入りました。

JDKのほうはなぜかチェックが外れていたので、embeddedしました。

C:\Program Files\Java\jdk1.8.0_161\ です。

これでビルドできると思いきや、まだまだBuildボタンがアクティブにならない・・・

警告:.NET 4.xがインストールされていない。

じゃあ、インストールしましょうと思いきや、もう入っているよとの警告・・・

矛盾している・・・

さらにビルド画面には.NETは無理よ。IL2CPPを推奨します。とのことなので、プレイヤーセッティングの.NETに設定したところを再びIL2CPPに変更しました。矛盾していますね。

そしたらBuidボタンがアクティブになりました。なんで!!

そしてビルドしたファイルを入れるフォルダですが、これはユニティフォルダの中に入れてはならないという前回の経験から、上の階層に戻り。

C:\Users\Public\Documents\App_builded に入れました

MR_test_001.sln さてこれ、どうしましょ?

そうそう、ダブルクリックで実行するとVisualStudioが立ち上がるので、デバイスリリース x86 するんですよね。

とおもいきや、なんかVisual Studio Enterprise 2017のインストールが始まってしまいました。まあついていきましょう。

無事インストール完了・・・とおもいきや、Microsoftアカウントを求められたので入力したら、試用期間終了のオシラセ・・・はあ?

??????????????????????????????

今日はやばい。

なんもできん。

あと1時間半で何ができるか・・・。

完全に仕切り直し

分からないので、PC自体を変えてやっていきます。

Unity は2017.4.15f1です。いつもの感じでいけるか!

VRセッチングして.NETにして

ホロレンズをUSBでPCにぶっさして。

MR_test_001.sln をダブルクリック!

VS2017が立ち上がり

リリース x86 そしてデバイスで GO!!

しばらくたってから

プログラム ‘[1888] MR_test_001.exe’ はコード -1 (0xffffffff) で終了しました。

いけた!なんてこった!

とりあえず大急ぎでUNITYちゃんを出してみました。

本日はもうこれ以上なんもできません!帰りますw

ズコーーーーー!!

 

 

 

 

Python:テンポラリーファイルとテンポラリーディレクトリの作成

使用するモジュール :tempfile

import tempfile でインポートできます。

テンポラリーファイルの作成

一時的にテキストなどを保存して、処理が終わったら自動的に消すか残すか選択できます。

テンポラリーディレクトリの作成

こちらも一時的にディレクトリを作成して、処理が終わったら自動的に消すか残すか選択できます。

おわりに

いろんなソフトウェアを使うとテンポラリーファイルが溜まっていくと言われてますが、こういうことなんですね。自動的に消えないようにしたときは、しっかり自分でディレクトリとファイルを消すようにしないといけませんね。

消し方はこちら。ファイル操作

import os

os.remove(path)

os.rmdir(path)

ディレクトにファイルが入っていると消せないので、まるごと消す場合はこちら。

import shutil

shutil.rmtree(path)

Python:ファイル操作 os pathlib glob shutil

ファイル操作を行うためのモジュールは

  • os:ファイル、ディレクトリの作成、削除
  • pathlib:パス指定でファイルを作成(タッチする)
  • glob:ファイル名のリストを出力する
  • shutil:ファイルをコピーする。まるごと削除する

がありますので基本機能を使ってみます。

 

あとは、必要に応じてググりましょう。大事そうなものは追記していきます。

Python:ファイル操作 os

 

Python:csvを操作する

csvファイルを作成する

 

csvファイルを読み込む

 

Python:txtファイルを作成、開く、読み込む、上書き、追記

python script を実行しているときに、何かしらを.txtファイルや.csvファイルとして保存したいデータがあると思います。

.txtファイルを新規作成して、なにかしらを書き込んで保存するところまでやりましょう。

これを再度呼び出して追記します。

今度は、ただ読み込んでみます。

もっといい方法があります with構文

f.close()する必要がありません。

一行づつ読み込むこともできる

while True → f.readline() → if break

2文字ずつ読み込むこともできる f.read(chunk)

文字を調べる f.seek

f.tell() 現在位置を確認する

f.read(1) 現在位置の値を確認する

f.seek(5) とかで現在位置を移動する

f.read(1) 現在位置の値を確認する

この繰り返し作業でいろいろ操作していく