ろむめも

気になったこととか、調べたことをゆるくまとめます。主にプログラミング関連の話題が多いです。

gitとROSでよく使うコマンドをメモする

git

  • リモートレポジトリから最新のコードを取り込む

git pull

  • ローカルブランチを作成する

git branch [ブランチ名]

  • ブランチを確認する

git branch

  • ローカルブランチを切り替える

git checkout [ブランチ名]

  • ローカルブランチを作成して、切り替える

git checkout -b [ブランチ名]

  • ファイルを追加する

git add [ファイル名]

  • ファイルを削除する

git rm [ファイル名]

git rm -r [ディレクトリ名]

  • ローカルレポジトリにコミットする

git commit -m "コメント"

  • ブランチ同士をマージする

git checkout master
git merge[ブランチ名]

  • マージしたブランチを削除する

git branch -d [ブランチ名]

  • ブランチをリモートレポジトリにコミットする

git push

ROS

roscore

  • rosモードに入る

roscd

Segmentally boosted HMM

Computational Perception Laboratory: Segmentally-Boosted HMMs
セグメントでブーストされたhidden Markov Models(隠れマルコフモデル)
既存のHMMと比較して17~70%誤差が減った。

プロトコル
1.シーケンスを通常のHMMで学習させる
2.学習させたHMMに各フレームごとにラベルを付ける
3.各フレームのデータを入力として、ラベルをAdaboostに学習させる。
4.新しい特徴空間をAdaboostのアンサンブル空間上として定義する
5.新しい特徴空間のデータをもとに新しいHMMを学習させる

DTWに関する誤解

Dynamic Time Warping(動的時間伸縮法)

DTW自体は特に時系列データの幅が異なる場合に有効となる、時系列データの類似性を調べる手法です。
なんとなくですが、データの時間方向の伸びを集約し、信号の時間変化や絶対値が似ているかどうかをモデルが持つ状態数分だけ区別できる方法だと認識しています。

DTWの概要
時系列相関 (CCF) の場合は 片方を 並行移動させているだけなので 2つの系列の周期が異なる場合は 相関はでにくい。

DTW では 2つの時系列の各点の距離を総当りで比較した上で、系列同士の距離が最短となるパスを見つける。これが DTW 距離 になる。そのため、2つの系列の周期性が違っても / 長さが違っても DTW 距離を定義することができる。
http://sinhrks.hatenablog.com/entry/2014/11/14/232603


今回、そのDTWに関して、以下の論文を読みましたので、その内容をまとめておきます。
http://wearables.cc.gatech.edu/paper_of_week/DTW_myths.pdf

概要

Dynamic Time Warping distance measureは主に言語認識界隈でしられていた技術でした。それは距離を最小化することによって一つの信号を他の信号へ非線形マッピングする方法です。10年前にDTWはデータマイニングの業界にクラス分類、クラスタリング、あるいは異常検知を含む様々な時系列データの問題への手法として紹介されました。この方法は約3年ぐらい前に流行り、いろいろな問題へ適用されてきました。
DTWには多くの成功があるにも関わらず、まだいろいろな神話があります。その神話は混乱を招き、研究への努力を無駄にしています。本文ではこれまでに行われた最も包括的な時系列実験のセットでこれらの神話を払拭します。

導入

DTWの距離測定にはユークリッド距離が多くの研究で使われていますが、時間軸におけるディストーションへの弱さは無視されています。DTW距離測定を使うことで、ユークリッド距離を使う場合の特定の弱さを解消できると紹介されました。この方法の柔軟性は似ているが局所的に位相がずれている2つの時系列を非線形に整列させることを可能にします。DTWはo(n^2)であるにもかかわらず、時系列データに対する最適な解法として、bioinformatics, medicine, engineering, entertainment等で使われています。

DTWでの研究は、簡単な下限によってDTWが間違わずに分類できることをきっかけに増えてきました。下限には2つのシーケンスの同じ長さと、ワーピング量の制限が必要です。これによってDTWは実際のアプリケーションで利用できます。
しかし、このような偉大な成功にもかかわらず、3つの神話が存在します。

神話1

さまざまな長さのシーケンスを処理するDTWの能力は大きな利点であり、したがって異なる長さのシーケンスを等しい長さに再補間することを必要とする単純な下限は、有用性を限定的にする[18] [27] [28]。
事実、我々が示すように、これを示唆する証拠は文献に存在せず、ことなる長さのシーケンスと、同じ長さに再補間したものでは精度、リコールにおいて統計学的な差は確認されていない。

神話2

ワーピングパスを制約することは必要悪です。それは、DTWを扱いやすくするために音声認識界隈から継承されたものであり、私たちは制約なしでDTWを高速化する方法見つけるべきです。

神話3

DTWのスピードは改善する必要があります。実際、単純な下限を活用した場合、DTWはO(n)で処理ができます。少なくともCPUではスピードアップには限界があります。

これらの神話を払拭し、DTWは異なる長さの時系列データと同じ長さの時系列データのどちらを使った場合においても精度に差はないという事を示すため以下の実験をしました。私たちは1-neaest-neightbor classificationの精度をDTWの全てのwarping window size(1%-100%)を、以下の2つの異なる方法を使って計算しました。

1)シーケンスを同じ長さにするように単純再補間
2)シーケンスの元の長さ

異なる長さのデータの取り扱いが不利になるように、以下の全ての正規化を行い、それらの最も良いデータを使って精度を見積もりました。

  • 距離で正規化しない
  • 最適ワーピングパスの長さで正規化
  • 短い時系列データの長さで正規化
  • 長い時系列データの長さで正規化

結果

データの長さによる結果に差はありませんでした。
再補間を必要とする類似度検索を行うことは存在しない問題を解決していることと同じである。
違う長さのシーケンスを比較できるようにするユーティリティは単なる神話。

じゃあ狭い制約は悪なのか

少ないデータ数では実験的に広い制約をとることの有意なデータは得られませんでした。なので、DTWでは狭い制約を取る必要があることが示唆された。

スピードアップは可能か

大体O(n)でO(n^2)ではない。
数千程度の時系列データでは1秒以内に計算できるので問題ない。

結論

今回の仕事では、ダイナミックタイムワーピング測定のいくつかの神話を指摘し、調査しました。我々は3つの主張を経験的に検証した。我々は、結果がより有用な問題に焦点を当てるのに役立つことを願っています。

例えば、過去10年間にDTWのスピードアップに関する論文が数十件ありましたが、より正確にDTWを作成することが1件しかありませんでした[23]。
同様に、私たちは、この研究で実証したDTWの速度と精度が、研究者にDTWを豊富な新しい問題/領域に適用するよう促してくれるかもしれないと感じています。

Pycharm with anaconda3でjupyter使用時にKey error "python3"が出た時の解決方法

現象

Pycharm上でAnaconda3のJupyter Notebookを起動した時に以下のようなエラーが発生し、セルの処理が終わらない現象が発生しました。

[E 02:52:36.204 NotebookApp] Unhandled error in API request
Traceback (most recent call last):
File "C:/anaconda3/lib/python3.5/site-packages/jupyter_client/kernelspec.py", line 173, in get_kernel_spec
resource_dir = d[kernel_name.lower()]
KeyError: 'python3'

環境

対処法

調査の結果、PycharmとAnacondaの相性が悪い為、発生しているということがわかりました。
(NATIVE_KERNEL_NAMEという変数を両者で書き換えてしまっているため、それにより不都合が発生している)
対応としてはAnaconda側に修正が入ったようで、以下のコマンドを通じてアップデートしたら解決しました。

conda update nb_conda nb_conda_kernels nb_anacondacloud

pycharm - jupyter: No such kernel named python3 - Stack Overflow
https://youtrack.jetbrains.com/issue/PY-20023
PyCharm is not able to run jupyter with error no such kernel named python3 · Issue #936 · ContinuumIO/anaconda-issues · GitHub

PycharmでJupyter(IPython)からの自作モジュールimportがImportError: No module named *** と出た時の対処法

現象

Pycharm上でJupyter Notebook(IPythonでも同じ現象がでるのでしょうか?)を起動して、自作のモジュールをimportしたときに以下のエラーが発生し、importできませんでした。
f:id:romth:20161208210402p:plain
visualsというのが自作のモジュール。
実行したipynbファイルと同じディレクトリにvisuals.pyとして保存されている状態です。

環境

対処法

前回と同様に公式にメールで問い合わせた結果、Jupyterにワークスペースを設定してあげる必要があるとの事です。これで無事importが認識されました!
メニューバーの[File]>[Settings]から[Language&Frameworks]>[Jupyter Notebook]に入ると、Working directoryがあるので、そこにipynbファイルのパスを入力します。
f:id:romth:20161208210954p:plain
ちなみにWorking directoryはJupyter Notebookをどこのディレクトリ上で起動するかという設定との事です。
この設定がされていなかったのでJupyterがほかのディレクトリで起動しおり、visualsの場所がわからず、importができなかったという事でした。この設定はプロジェクトを変えた場合にそのパスを再設定する必要があります。

また、余談ですが、Pycharmにはsource rootという概念も用意されているようです。
Source rootとして設定したディレクトリはPycharm上でのimport読み込み対象ディレクトリとなります。
sys.path.append()のようなimportのpath設定のことでしょうか。
設定方法はプロジェクトエクスプローラから対象のディレクトリ、ファイルを右クリックしてset as source rootを選択するだけです。
PyCharm 2016.3 Help :: Content Root

一応確認中なのでわかったら追記します。
(2016.12.9)追記しました

最低限のニューラルネットワークの実装で原理を理解する

背景

もはや言わずもがなですが、Deep Learning、来てますよね。
ですが、その原理を学習しようと思った場合に、全くの素人が本当の意味での第一歩から勉強したいと思った時に、
レベルに見合ったサンプルコードを見かけることができません。
というか、私がそうでした。

MNISTとか、代表的なサンプルはありますし、動きもなんとなくわかるんですが、
具体的に裏でどう動いているのかというところが一発で分かるようなものはありませんでした。

今回、最低限のニューラルネットワーク(というかニューロン)を用意して、その挙動について説明を入れて、その原理をまとめます。
(今回の記事は次の記事を参考に作成しております)
Neural networks and deep learning

やったこと

ニューラルネットというより一つのニューロンを用意します。
入力は1固定で、出力が0になるように学習させます。
今回、ニューロンの活性関数にはシグモイド関数を用いました。

f:id:romth:20161110213542j:plain

一般的なNNの話ですが、シグモイドの変数は
y = weight * x + bias
としています。

結果

f:id:romth:20161110213553p:plain
横軸が学習回数、縦軸が出力値です。
学習を進めると出力値が0に近づいていることがわかると思います。
学習回数は50回です

考察

今回1つのニューロンに学習させましたが、weightとbiasについて少しわからないところがありました。
以下に示すようにアップデートされていきましたが、どこかで収束するような気配がありません。
両者の絶対値が完全に一致したら収束するのかもしれませんが、
みた感じ収束する気配がありません。
ただ、もっとイテレーション回すと出力は0に近づくのでそういうものなのかもしれません。
f:id:romth:20161110213604p:plainf:id:romth:20161110213608p:plain

サンプルコード

python:2.7.10

# -*- coding: utf-8 -*-

import math
import random


# cost function of cross entropy
def fun(a):
    return -math.log(1 - a)

# differential of fun
def dfun(a):
    return 1 / (1 - a)

# sigmoid function
def sigmoid(x):
    return 1 / (1 + math.exp(-x))

eta = 0.15
weight = random.random()
bias = random.random()
epoch = 0
maxEpoch = 50

print 'out, delta, weight, bias'
for i in range(maxEpoch):

    # calculate sigmoid function by current parameter
    a = sigmoid(weight + bias)
    # get value of difference
    delta = dfun(a)
    # update parameters by delta and eta, eta is learning rate
    weight += -eta * delta
    bias += -eta * delta

    print str(sigmoid(weight + bias)) + ', ' + str(delta) + ', ' + str(weight) + ', ' + str(bias)

Dell XPS studio 8100にNvidia GeForce GTX 960を換装した結果

私が使っているXPS8100は2009年ぐらいに買ったDellのミドルタワーデスクトップPCです。
もう7年も愛用してますがこれまで大きな不調もなく、まだまだ現役で使えます。
ところが利用していたGPUNvidia GeForce GTX 260ではCUDA7.5が使えない事が判明しました。
そこで新しいもの購入を検討していたところ、ちょうどGTX960のタイムセールがアマゾンでやっていてついポチッと買ってしまいました。

実はいくら情報探してもこの組み合わせで動いた報告がなかったのでちゃんと動くか不安でした。
が、結果から言うと問題なく動きました

nvsimの結果

+------------------------------------------------------+
| NVIDIA-SMI 361.75     Driver Version: 361.75         |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 960    WDDM  | 0000:01:00.0      On |                  N/A |
| 30%   43C    P8    12W / 130W |    261MiB /  2048MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

換装、ドライバインストール等で特につまづいたところはありませんでした。
ただし、私の環境では電源を500Wに増設しているので、出荷時備え付けの電源だと出力が足りないかもしれません。確認してから購入を検討下さい。

あと、PCの中は特にCPUの放熱フィンとファンがホコリまみれだったのでサイバークリーンを使って取り除きました。
ゲル状になっているので放熱フィンとかファンの隙間に入ったホコリも吸着できてかなり綺麗になりました。オススメです。