なんだか雲行きの怪しい雑記帖

ぐだぐだ日記とメモと,あと不定期更新

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

相互的齟齬解消会

なんで程度問題を人に説明するときは極論による説明が有用なのかなぁ,とどうでもいいことを考えていた

単純に0.999999…が1であるように

そもそも0.9999…自体が極限という操作ではあるものの,分解すれば0.9+0.09+0.009+…という形になる
これに対して極限をとると1に収束するし,私達はその通りに「1に収束するもの」として認識する

人が程度問題を程度にしたがって説明する過程が,この後者の形に類似しているとしよう
すなわち,まず0.9を説明し,次に0.09を説明し,…という風にだ
人によって説明の順番が異なると思うが,そういう場合はとりあえずはこういった説明の仕方をする人が居る,という仮定だとしてもらっても構わない
johodentatsu_riso.png

なぜ最初から1として説明しないのかというと,それは1ではなく0.9999…であることを伝えたいからだ,としよう
ここが通常の説明ではなく,程度問題の説明とした所以なんですが

人の説明が0.9+0.09+0.009+…という風に記述できるという前提をたてただけでは,結局最終的に1となるため,早くも上述の仮定は成り立たないように思える
しかし,人の話が数学と違うところは,人間の伝達時には若干の齟齬がつきまとうところだ
つまり,足している0.9+0.09+0.009+…のそれぞれの値が,伝達時にランダムに増減することを表す

大まかな話をしている時の齟齬は大きい,これはつまり0.9を説明しているときに0.8だと伝わってしまったようなものだ
細かな話をしている時の齟齬は小さい,これはつまり0.00…009を説明しているときに0.00…008だと伝わってしまったようなものだ

こうして情報発信側が「0.9+0.09+0.009+…」とシリアルに情報を送っていても,伝送時のノイズにより受信側では各値がランダムに変化する
例えば「0.8+0.095+0.0088+…」といった具合だ
 (このノイズがどういった分布に従うかなどは,特に前提を置かないが,少なくとも情報発信者と情報受信者それぞれの知識量に依存したものになりそうであるということだけは確かそうに思える
  平均すればうまく0になるような分布かもしれないし,小さく見積もられやすい分布かもしれない)
johodentatsu_genjitsu.png

ここで大事なのは,こういった説明を聞いた受信側が「ああ,0.9+0.09+0.009+…という列だから,この人は1だと言いたいのだな」と理解できるかどうかだ
情報伝達時の齟齬の後の,受信側の(勝手な)修正作業の結果だ
この修正作業が得意な人とそうでない人とで,聞いた側が理解できるか否かが変わる

しかし問題なのは,こうした「0.9+0.09+0.009+…」という伝達仮定において,ランダムにノイズが混じった値が観測されることであり,そうした受信信号列からただしく元の値を推定(予測)できるかということである
つまり,情報発信者が発した情報列が「0.9+0.09+0.009+…」であるかということを見抜けるかということになる
もし受信側の修正作業が一歩間違えば,0.8に収束してしまうかもしれないし,1.1に収束してしまうかもしれない
この辺が程度問題の説明で難しいところだ

ここでは程度問題を最初から程度ありで話すことが「0.9+0.09+…」という形に似ているという仮定だったが,極論の場合はどうだろう?
これはずばり,「1」と伝えていることになるのではないだろうか
本当は程度の問題なので,詳しく言うと「0.9999999…」なんだけど,もう思い切って極限に持っていってしまった後の値を伝える
この場合は,ノイズが加わろうと二度か三度言えば大体1だと伝わるように思える
「1だ」「1だ!」「1だ!!」と言っているわけだから,ノイズがのる箇所が一箇所しかないし,そのノイズ分に対してだけ反応すればいいわけだから
johodentatsu_kyokuron.png


ところで,途中で『人の説明が”0.9+0.09+0.009+…”という風に記述できる』という前提を用いていたが,これが違う形であった場合はどうだろうか
私には,更に情報伝達が難しいような信号列に変形されるように思える

例えば,最初から事の仔細にまで踏み込んで話をしてくるような人の発信情報列はどんな感じだろう
途中で仔細な情報によって話がきれるので,「0.9」を伝えようとしている部分が「0.4+0.1+0.4」みたいな感じになるんじゃないだろうか
あるいは,話を盛ってから下げてくるような人もいる
その場合は「0.9」という信号は「1.1-0.2」とかに変形されるんじゃないだろうか
johodentatsu_random.png


確かに,これらは数値としては同じだ,客観的に見た時に言ってることは変わらないのだろう
ただ,これらの信号列を見る受信者がいて,重要なのは受信者にとって「それらが足して1に見えるか」という観点である
確かに,「0.4+0.1+0.4+0.09+0.009+…」という信号列は極限をとって「1」かもしれない
しかし,(この場合は)最初の3つの値の規則性とそれ以降の規則性が一致しないため,その後の信号を予測しづらく,うかつに極限をとりづらいという点だ
それを聞いて「1」だと理解できるのは,その答えを知っている本人か,極めて推測力の高い天才か,当てずっぽうで1だと予測したか,その辺だと思う



この話,自分にとってブーメランで帰ってくる批判とも捉えられるので辛い
人に分かってもらえるように説明するの,とても難しい…

特に理由はなかったが,丁度良く都合よく暇だったため図付きにしてみた
パワポ,図を作るのに楽

スポンサーサイト

今更LIBSVMについてちょっと

割りとよく使ってるが知らんかったことを中心


その前にLIBSVMってなんだ

公式ページ:LIBSVM -- A Library for Support Vector Machines
サポートベクトルマシン(SupportVectorMachine)を学習(したり評価したり)するためのライブラリ。

サポートベクトルマシンの説明は省きますが、LIBSVMを使えば

  • カーネルトリックを用いた非線形SVMの学習(自分で設計したカーネルも使用可能)

  • マルチクラス分類のSVMの学習(one vs oneとか※)

  • グリッドサーチなど学習するための便利(必須)なツールが標準装備(Pythonが必要)

  • 拡張やツールなどもそこそこ豊潤(LIBSVM Tools



※昔はone versus restによる実装だったそうですが,実験の結果精度がいいone versus oneのマルチクラス識別器になったそうです.
ソースはQ: What method does libsvm use for multi-class SVM ? Why don't you use the "1-against-the rest" method? で.
ちなみに,マルチクラスの場合でも「-b 1」により各カテゴリの事後確率も計算できますが,その手法については製作者らの論文「Probability Estimates for Multi-class Classification by Pairwise Coupling」を参照願います.


基本的な使い方(おさらい編)

Linux系使ってる人は玄人だと思うので,多分私がお役に立てる部分はないと思います.
なので,Windowsユーザを対象.

・何はともあれまずはビルド
ビルドしないとそもそもツールとして使えません.
コンパイラは色々あると思いますが,まぁ多分VisualStudio(VisualC++)だと思いますので,まずはVSのコマンドプロンプトを開きましょう.
 (分からない人は「スタートメニュー」→「Microsoft Visual Studio ○○」→「Visual Studio Tools」のフォルダ内あたりから探そう)

LIBSVMを解凍したディレクトリに移動します.

cd /d libsvm-3.17


そしたら,ビルドを実行.
MSVSだとmakeはnmakeコマンドなので,
  nmake -f Makefile.win

と打つだけ.

そうすると,「windows」ディレクトリ内にEXEやLIBファイルが生成されたと思います.


・テスト学習してみる
ツールを準備出来たわけですが,インストールしたてだとホントに何をしていいのか分からないものです.

データセットの用意はどうすればいいの?
ってかデータセットのファイルのフォーマット何よ?
ツールのコマンドは?
どうやってパラメータ調整すればいいの?

諸々疑問に思うことはあると思いますが,データセットに関してはLIBSVMはテスト用のものを用意してくれています.
LIBSVMフォルダの「heart_scale」がソレにあたります.

とりあえず学習させてみるには

.\windows\svm-train heart_scale

と打ってみましょう.

*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132

とでたら学習成功.
学習により「heart_scale.model」というモデルファイルが生成されていたりします.

「svm-train」の細かいパラメータとかは本家サイト少しスクロールしたところでも見て下さい.

データセットのフォーマットは「heart_scale」を見れば分かるね!
SVMの基本的な使い方的なところは「SlideShare -SVM実践ガイド (A Practical Guide to Support Vector Classification)-」などをとりあえずは見てみればいいんじゃないかな!!
理論等はご自身で検索した方がいい資料でると思いますので割愛



本題:気付いた細かいこと

・Windowsで「grid」または「easy」を使いたい時
SVMはパラメータ調整が精度向上には必須!
「grid」はグリッドサーチ、「easy」はスケーリングとグリッドサーチもやってくれる便利ツール

必要なモノ:Python、gnuplot
 Pythonver2.7がいいと思います
 gnuplotはWindows用のバイナリとして「wgnuplot」があるので、それをインストール

「tools/grid.py」と「tools/easy.py」をpythonに食わせればいいのですが、「grid」と「easy」は「svm-train」,「svm-predict」及び「svm-scale」のバイナリを必要とするので、事前にビルドしましょう
  (MSVCでビルドするなら上述、「nmake -f Makefile.win」でしたね)

 さて、ビルドしたら次は「grid」と「easy」にそのEXEのパスを教える必要があります
 READMEの方には引数で渡す方法が書いてありますが、面倒なのでソースに直書きするのがいいかなと思います。

 「tools/grid.py」と「tools/easy.py」、いずれにおいても
is_win32 = (sys.platform == 'win32')
if not is_win32:
svmscale_exe = "../svm-scale"
svmtrain_exe = "../svm-train"
svmpredict_exe = "../svm-predict"
grid_py = "./grid.py"
gnuplot_exe = "/usr/bin/gnuplot"
else:
# example for windows
svmscale_exe = r"..\windows\svm-scale.exe"
svmtrain_exe = r"..\windows\svm-train.exe"
svmpredict_exe = r"..\windows\svm-predict.exe"
gnuplot_exe = r"c:\tmp\gnuplot\binary\pgnuplot.exe"
grid_py = r".\grid.py"

 のような記述があるので、探しだして書き換えるだけ。
 絶対パスに書きなおすと色々楽になりますね.


・「grid」または「easy」をマルチコアで学習したい時
READMEに書いてあるのだが、ちょっと気付きにくいと思う

Windowsでは「tools/grid.py」、Linux系では「/usr/bin/svm-grid」内の
  ...
telnet_workers = []
ssh_workers = []
nr_local_worker = 1// ←HERE!
...

となっているところを好きな数値に書き換えるだけ.

ただしこの手法による学習は,一回の学習をマルチコア化するのではなく,パラメータ探索のためそれぞれのパラメータによる学習を別プロセスで並列に行う手法です
なので,瞬間的に必要となるメモリ量は並列化したい数に比例します

因みに書いてあるコードから推察出来る通り、SSHやTELNETでリモートのCPU使って計算とかも出来ます。
その辺はREADMEの方をどうぞ。(ぇ


・線形カーネル使うならLIBLINEAR
利点
 ・学習データは互換性アリ(というより同じ)
 ・学習速度が早い
   たとえLIBSVMで線形カーネルを指定したとしても,LIBLINEARより速度面で劣ります
 ・モデルファイルが小さい
   サポートベクトルの集合ではなく、射影ベクトルとバイアス値がモデルファイルとして出力されるため、
   特徴量ベクトルとほぼ同次元のベクトルが保存できるスペースだけ必要
   LIBSVMで学習した時より非常に小さくなります
欠点
 ・なぜかこっちはマルチクラス分類器には「one-versus-rest」な実装
   LIBSVM TOOLSにone-versus-oneによる実装が公開されているので,そっちが良い人はそっちを
 ・サポート…ベク…ター…?
   正確にどれがサポートベクトルになっているか把握するのは,ソースコードを改変する必要アリ
 ・バイアス使用がデフォルトでfalseなので(-b 0),うっかり何か違う学習ファイルが出来ることがある(経験談)


おまけ

C++からLibSVMのAPI呼んで学習したい時は,別記事で書いてしまったので,週アレ(11) C++で始めるLibSVMの方を参考

ArchLinuxなんてのをインストールしてたのよ

インストールしたのがもう二週間以上前の話…!! なのでちょっとうろ覚え


ArchLinuxはLinuxディストリビューションの一つ、独立系
 (読み方は「アーチリナックス」、「アークリナックス」と読むとArkLinuxさんと誤解される)



特徴は多分こんなん

 ・パッケージ管理システムはPacmanで、基本的にはバイナリパッケージによる配布。
  ただし、ABSを入れるとソースからビルドしてマシン毎に最適化したものをインストール可能に。

 ・ローリング・リリースを採用。
  「OSのバージョンアップ」という概念がないので、常にパッケージを最新に保てる。

 ・インストールが敷居が高く若干面倒。
  インストール後も必要なパッケージは自分で全て揃える必要があるので、ある程度知識と慣れが必要。

 ・日本語資料があまり充実してないので、「英語イヤアアアアアアア」な場合厳しい。
  英語のWikiは結構情報あると思う。

 ・何故かネームバリューがないので人に話しても「えっ(゚Д゚)」って顔される。


「基本的にはバイナリパッケージによる配布」ってところが好みです。
ビルドして入れるのが基本なGentooさんとかよりも、サクッと入れて楽しめます。
 (Gentooはインストールとか、zshとvimとsudoをemergeしただけで数時間程何もできなくなって残念な感じ。
  ただ、一度入れると凄い愛着湧くんだけどな…Gentooは…。)

また、ローリング・リリースなので「Ubuntu入れようと思うけど、サポートの問題もあるしLTSかな…」みたいな面倒な判断をしないで済みます。
何より新しいモノ好きな私としては…!

Ubuntu→Fedora→Cent→SL→FreeBSD→Arch→Gentooと改宗してきましたが、そろそろArchさんとかで落ち着きそうです、用途にもよるけど…。
 (そういえばこの前使っていないWindowsServer2008を発掘した、一回インストして使ってみたい…!!)



インストール


2012年8月時点でのインストール方法。
落としてくるイメージによって微妙に変わるので、うまくいかない場合は公式Wiki見て下さい。
 (なお、ここに書いたインストールはInstallationGuideじゃなくてBeginner'sGuideを参照しました。)

今回はディスクに焼いてインストールするので、Downloadの「HTTP Direct Downloads」から、近くのミラーを選びましょう。
日本だと筑波大か…。

現時点で置いてあるのは「archlinux-2012.08.04-dual.iso」なので、これをダウンロード、CDに焼いてインストールするPCにぶっこんで起動。


arch_boot.jpg
起動画面では色々書いてありますが、「Boot Arch Linux」で。
少し待つと自動ログインでrootになれます。

arch_autologin.jpg


>まずはキーボードレイアウトの設定
日本語キーボードだと「jp106」なので
# loadkeys jp106



>次にインターネット接続の確立。
無線などの場合非常に面倒なのでBegginer'sGuide-Establish_an_internet_connectionを参照してください。

ここでは有線の設定。
起動時にdhcpdが有効になっているので、有線の場合既にネットにつながっている可能性が高いです。
# ping google.com

が通るなら、既につながっているので次のステップに。


固定IPにしたい場合。
例えば、ゲートウェイが192.168.0.1で自分のIPが192.168.0.8にしたいなら
# ip link set eth0 up
# ip addr add 192.168.0.8/24 dev eth0
# ip route add default via 192.168.0.1


次に、DNSサーバーの設定をしないといけないので、「/etc/resolv.conf」を書き換えます。
DNSサーバーが192.168.0.2なら
# nano /etc/resolv.conf
____________________________
nameserver 192.168.0.2
____________________________


このとき初めてnano使ったんですが、書き込みは「Ctrl+O → Enter」、終了は「Ctrl+X」みたいです、まぁ下にヘルプ表示されてるけど。



>ディスク(ストレージ)の設定
ディスクのパーティション分けたりフォーマットする作業。
当たり前ですがデュアルブート環境などを作りたい人は、この作業は慎重に。

ここでは本家Wikiに似せた設定でいきたいと思います。
起動ディスクが2GB、Swapが1GB、/homeがそれ以外全部な感じにでもしますか(適当

# cfdisk /dev/sda


arch_cfdisk1.jpg

何もない状態のドライブだとこんな感じになります。
矢印キーの上下でパーティションの選択、矢印キーの右左で操作(「New」や「Delete」)が選択できます。

とりあえず一つだけ、起動ディスクを作ってみましょう。
上下で「Free」にカーソルを合わせたまま、左右で「New」に合わせてEnter。

arch_cfdisk2.jpg
作るパーティションにArchを入れるので、「Primary」を選択したままEnter。

arch_cfdisk3.jpg
パーティションのサイズを聞かれるので、今回は2GB(=2048MB)としたので「2048」としてEnter。

arch_cfdisk4.jpg
先頭に作るか、末尾に作るか選べるみたいですが、特に選択する必要がないので先頭でEnter。

arch_cfdisk5.jpg
ここまで一つのパーティションが作れました。
 (なお、ここまで操作ではディスクのパーティションのレイアウトを設定してるだけなので、実際のディスクにはまだこれらの設定は書き込まれていません。
  その操作は「Write」ですが、全てのパーティションを設定し終えた時に行なって下さい。)


同様にSwap用のパーティション(1024MB)と余ってるストレージで/home用のパーティション作ります。

arch_cfdisk6.jpg

はい、パーティションが作れました。
あと少しだけやることがあります。
起動ディスクにカーソルをあわせて「Bootable」でEnter。

Swap用のパーティションにカーソルをあわせて「Type」、するとファイルシステムが一覧で表示されます。
何かキーを押すと、番号の入力を求められるので、「Linux swap/Solaris」に該当する数字「82」と打ってEnter。
arch_cfdisk7.jpg

ここまで無事に作業が完了するとこんな画面になります。
arch_cfdisk8.jpg

ここまで出来たら、パーティション分けは終わったので、「Write」→「yes」と入力してEnterでパーティションを書き込みます。
もうチュートリアル的にはcfdiskには用はないので、「Quit」で終了します。

再度言いますが、ここまででパーティション分けが終わりました。
次はそれぞれのパーティションを適切なファイルシステムでフォーマットしないといけません。

「/dev/sda1」(起動ディスク)と「/dev/sda3」(/home)をext4でフォーマットするには
# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda3

です。

続いてSwap用のパーティション「/dev/sda2」もフォーマットし、有効化します。
# mkswap /dev/sda2
# swapon /dev/sda2


ここまでで、確認のためにもう一度「cfdisk」をやるとこんな感じになってると思います。
arch_cfdisk9.jpg

実は全部「cfdisk」で設定できるっていうね。



>ディスクのマウント、ArchLinuxのインストール
ついにインストールです。

起動ディスクを「/mnt」にマウントします。
# mount /dev/sda1 /mnt


お気づきだと思いますが、「/mnt」がインストール後の環境の「/」(ルート)になります。

「/mnt/home」(/home)を作って、/home用のパーティションをマウントしましょう。
# mkdir /mnt/home
# mount /dev/sda3 /mnt/home


マウントの設定はこれで終わりです。


次に、ArchLinux本体のバイナリを拾ってくるミラーを設定します。
別に設定しなくてもいいんですが、設定しないと本家サーバーからデータとってくることになるので、当然遅かったりします。
 (一時期サーバーが重かったらしいですが、私がインストールした時はミラーの設定しなくてもまぁまぁな速度でダウンロードできた記憶がある、凄い回線やなぁ。)

ミラーリストの編集は
# nano /etc/pacman.d/mirrorlist

です。
 (まだvimとか使えないのか…)

ミラーリストなので使えるミラーが一覧で書いてあります。
実際にダウンロードする際は「一番上から接続していって、最初に接続に成功したサーバー」なので、自分の直近(と思われる)ミラーの行を一番最初にくるようにコピペすればOKです。


ここまででようやくインストールのための準備が整いました。
あとは
# pacstrap /mnt base base-devel

とうって、しばらく待ちましょう。

インストールが終わったら、次はfstabを作ります。
自動で作ってくれるらしいので
# genfstab -p /mnt >> /mnt/etc/fstab

と打てば終わりです。



>インストールしたArchLinuxの設定

次はインストールしたArchのシステムの設定をします。
ここからは正直ちょっと好みとかあるので、私だったらこう弄るなぁってのをご紹介程度に。

詳細については本家のBeginner'sGuide - Configure_the_base_systemを参照。

なにはともあれ、インストールしたArchのシステムに移ります。
# arch-chroot /mnt



・コンソールのフォントとキー
# nano /etc/vconsole.conf
____________________________
KEYMAP=jp106
____________________________

 コンソールの設定なので、デフォルトの「KEYMAP=en」のままでもいいとか、そういう話もある。


・タイムゾーンの設定
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

 Tokyoならこうなる。

・ロケールの設定
# nano /etc/locale.gen
____________________________
ja_JP.UTF-8 UTF-8
____________________________

 先頭の「#」をとってコメントアウトを外すだけ。

# locale-gen

 でロケール生成。

# nano /etc/locale.conf
____________________________
LANG=ja_JP.UTF-8 UTF-8
____________________________


・ハードウェアクロック
# hwclock --systohc --utc

 UTC推奨らしいです。

・デーモンの設定
 後で自分でカスタマイズしていくものなのでパス。

 >2012/10/22追記
  そういえばArchついにデフォルトでsystemdになったみたいですね(systemdになりました宣言)。
  旧システムから移行する際はsystemdのInstallationら辺を参考。
  この記事が参考にならなくなる日も近くなる気がしている、時間的にこの記事より新しいものがあったらそちらを参照することを推奨しておきます。

・ネットワーク設定
 同上。

・Hostnameの設定
 同上。



>ブートの設定、ブートローダのインストール

インストールが終わったものの、まだブートローダを入れていないので、この状態で電源を切っても起動してくれません。
なので、ブートの設定をする必要があります。

何はともあれ
# mkinitcpio -p linux

でブート用のイメージを作る。


ブートローダはsyslinuxとGRUBが選べますが、まぁよく使われるのがGRUBな気がするのでGRUBでいきます。
# pacman -S grub-bios
# grub-install --recheck /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

とうつだけ、簡単感嘆。


これで再起動してもArchが起動します。
ただし、再起動するとrootのパスワード分からない→ログインできない\(^o^)/ってことになりかねないので、rootのパスワードを設定しておきます。

# passwd


これで本当にめでたしめでたし。

Archの環境を抜け、LiveCDのコンソールに戻ります。
# exit


あとはマウントを解除して、再起動。
# umount /mnt/home
# umount /mnt
# reboot

なお、再起動した時にディスク入ってるとそっちが起動しちゃうので、ディスクは抜きましょう。


無事にブートローダの画面を経て
arch_grub.jpg

起動するとこうなります。
arch_omedetou.jpg


おめでとう!!!!!!!!!!!



>無事インストール後

あとは好みのパッケージ入れて下さい。

普通に使いそうなコマンドは下。


パッケージ一覧のキャッシュ更新
# pacman -Sy


システム全体のアップグレード
# pacman -Su


システム全体を最新にアップグレード
# pacman -Syu


インストール
# pacman -S [package name]


アンインストール
# pacman -R [package name]


最低限これだけ知っていればあとはなんとかなると思います。
分からなかったらググってください、または本家Wikiの方も情報あるので見てみるといいかもしれませんね!




_______________________

今回はここまで。
長かった…最初に書きたかったのはGUI関連の設定だった気がするけど、インストールだけで終わってしまった。
そのうち続き書くかも…疲れるから書かないかも…。
 (今回この記事のためだけにVMにArch入れました…くすん)


繰り返しになりますが、ここに書いてある内容は基本的に本家WikiのBeginner'sGuideに書いてあります。
ArchLinuxのインストール方法はまた今後変わっていく可能性もあるので、英語に拒絶反応が出ない人は本家Wikiを見ることをおすすめします。

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。