2020年4月26日日曜日

ufwでのファイアウォール設定

ufw(Uncomplicated FireWall)はファイアウォールを設定するコマンドで、iptablesのwrapperのような位置付けのようである。

下記に設定の仕方をメモ。

2019年2月23日土曜日

ジニ係数とは何か?解釈と実装

決定木にて分類の基準によくジニ係数(Gini inpurity / Gini index)という尺度が使われる。
このジニ係数について少し考察してみたのでメモ。

ジニ係数の定義と挙動

あるデータセット\(t\)の中に\(K\)種のクラスのサンプルが含まれる場合、ジニ係数は
\[ I(t)= \sum_{i\neq j} P(C_i|t)P(C_j|t)=\sum_{i=1}^{K} P(C_i|t)(1-P(C_i|t) = 1- \sum_{i=1}^{K}P^2(C_i|t) \] と定義される。 ここで\(P(C_i|t)\)はデータセット\( t \)の中に含まれるクラス\( i \)のサンプル数の割合である。
この定義式を元に2つのクラス(0, 1)が含まれる20個のデータを例にクラス0が含まれる数に応じたジニ係数の変化をプロットしたのが下図。期待通りデータセットの中に各クラスのデータが均等に含まれれば含まれるほどジニ係数の値は大きくなり、偏って含まれれる場合は小さくなり、純粋に1つのクラスしか含まれない場合はゼロになる。


ジニ係数の解釈

ジニ係数の定義は「データセットの中から無作為に2つサンプルを取り出したときに異なるクラスのサンプルが取り出される確率」と解釈するとわかりやすい。
データセット\( t \)の中から無作為に2回取り出すベルヌーイ試行*1を考えたときに、同じクラスのサンプルが取り出される確率は\( \sum_{i=1}^{K}P^2(C_i|t) \)。その逆で異なるクラスのサンプルが取り出される確率は、\( 1- \sum_{i=1}^{K}P^2(C_i|t)\)となり、これがジニ係数の定義と一致するというわけ。

複数データセットでのジニ係数

決定木アルゴリズムでは決定木のノードで元のデータセットを2つ(\(L\)と\(R\))に分割する。そのためこの分割後の2つのデータセット全体の不純度が小さい分割の仕方を選ばないといけない。そのため決定木アルゴリズムでは、 \[ I_{split}(t)= p_{L}I(t_{L}) + p_{R}I(t_{R}) \] の量が最小となる分割方法を見つけることになる*2。ここで\(p_{L}\)と\(p_{R}\)はそれぞれ分割後のデータセットのサンプル数の元のデータセットに対する割合。

ジニ係数と交差エントロピー

はじめてのパターン認識でも書かれているけど、不純度の尺度はジニ係数だけではなく、交差エントロピー \[ I(t)= -\sum_{i=1}^{K}P(C_i|t)\log P(C_i|t) \] も使われることがある。ただし、挙動がほぼ同じということと、ジニ係数であれば、計算コストの高いLogの計算をしなくて良いため、ジニ係数が利用されることが多い様子。

ジニ係数の実装@Python3

折角なのでPythonでジニ係数を計算する関数をPythonで実装してみた。上記\( I_{split}(t)\)を計算するコードです。
ここのジニ係数を計算する関数を参考にした。ただしジニ係数の定義上、ジニ係数の計算時に存在するクラスを事前に知る必要がないはず*3なのでデータセットだけを関数に渡す方式に変更している。
(*1): サンプルを複数回無作為に取り出す際に、一度取り出したサンプルを「戻して」再度サンプルを無作為に取り出す試行。
(*2): 初めてのパターン認識の(11.11)式。
(*3): たとえ対象のデータセットの中に現れないクラスが存在したとしてもそれはジニ係数に寄与しない。

2018年5月15日火曜日

Mac OSXへのoctaveインストール

会社でcoursera machine learningを受講することになった。
その中で使うoctaveをここらを参考にmac OSX(High Sierra)にインストールしようとして
「brew install octave」コマンドを実行したら
Error: Could not symlink include/octave-4.4.0 /usr/local/include is not writable.
なるエラーが出てインストール(リンク)ができない事態が発生。

色々調べて結局、以下の解決方法で解決。要は自分で/usr/local/includeのディレクトリを作成してから、brew実行する。(インストールは成功しているのでリンクだけ実行)
$ sudo mkdir /usr/local/include
$ sudo chown -R $(whoami):admin /usr/local/include
$ sudo chown -R $(whoami):admin /usr/local/include
$ brew link octave

2018年1月28日日曜日

add-apt-repositoryコマンド実行でエラーが出た時の対処法

Ubuntu 16.04にて、OSインストール直後の状態ではadd-apt-repositoryのコマンドを実行すると「Command Not Found」エラーが出る。その解消は下記の2つのコマンドを実行すればOK。
$ sudo apt-get update
$ sudo apt-get install software-properties-common

簡単。





Ubuntu16.04でssh接続するために

Ubuntu16.04はOSインストール直後の状態ではssh接続すらできない。なぜなら、Ubuntuではsshクライアントはデフォルトで入っているけどssh-serverは入っていないから。なのでインストールする。
$ sudo apt-get install openssh-server




2017年12月10日日曜日

ubuntu16.04 で pip3 のアップグレードにハマった。

ubuntu16.04 で pip3 9.01にアップグレードする時に少しハマったのでメモ。

■ python 2.7のpipのアップグレード
$ sudo pip install --upgrade pip

■ python 3.5 のpip3のアップグレード
$ sudo pip3 install --upgrade pip
※どうも、引数のほうはpip3でなくて「pip」とするところがミソらしい。

2017年4月15日土曜日

MacにHomebrew&gitをインストールする

Windows機が壊れたのでこの機会にMacbook Proを買った。

開発環境等を作っていく上で、まずはパッケージ管理システムのHomebrewとgitをインストールする。その手順のメモ。

■Javaをインストール

  1. ここにしたがって、Java(JDK)を標準的な方法でインストール。

■Command Line Tools for Xcodeをインストール

  1. XcodeApp Storeからインストール。(ファイルが重いのでかなり時間がかかる・・・)
  2. LaunchpadからXcodeを起動し、ライセンス使用許諾に同意する。
  3. ターミナルを開いて下記のコマンドを実行すると、Command Line Tools for Xcodeをインストールするか?というポップアップが表示されるので、そのままインストールを実行。
  4. $ xcode-select --install

■Homebrewをインストール

  1. 公式HPに載っているコマンドを実行。(2017−04−15時点では以下のコマンド)
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"



■gitをインストール

実はMacには既にプレインストールされたgitが入っている。ただしバージョンも古いため公式のgitをHomebrew経由でインストールする。
まずは下記のコマンドでプリインストールされているgitのバージョンを確認する。
$ git --version
今回の場合、「git version 2.11.0 (Apple Git-81)」の結果が帰った。
次に下記のコマンドでHomebrewからgitをインストール。
$ brew install git
インストールが完了すると、一度ターミナルを再起動し(再ログインし)、再度先ほどのコマンドでインストールされているgitのバージョンを確認し新しいバージョンのものがインストールされていることを確認する。