ベイジアンネットワーク
身の回りでベイジアンネットワークなどの言葉をよく聞くようになった。 ベイジアンネットワークは、ビッグデータを解析して、ある現象が発生したときに、何が原因かを確率的に抽出する手法のようだ。
僕としては、このような手法に対して、本当にうまくいくのかな、と少し懐疑的だ。 原因を抽出するときに、プログラムは、おそらく、原因A1、原因A2、…、原因ANに対して、確率分布を出力するのだろう。 ところが、これらの原因の集合そのものは、人間があらかじめ用意してあげる必要があるのではないか。
また、この手法では、原因をノードとするネットワークを作るらしいのだが、ネットワーク構造を決めるアルゴリズムがあるらしい。
懐疑的でありつつも、わからないことばかりで、興味がわいてくる。
ab=0ならばa=0またはb=0
a, bは体の元とする.
すなわち .
のとき, aの乗法の逆元をとすると, 左から掛けて, となり, が成り立つ. よって,
同様に, のとき, .
以上より, .
メモ
Kings of convenienceで検索してたら、見つけたピアニストさんのブログ。
Pianist - Miki Ambo
エッセイが面白そう。
Haskellで凸包を求めるGraham Scanアルゴリズムを実装する
夏休みなので、Haskellのリハビリのために、「Real World Haskell」を読んでいます。 3章の練習問題に、平面上の点の集合の凸包を求めるGraham scanアルゴリズムを求めよ、という問題があります。
以下のように書きました。まだ、あまりテストしていません。 この本でQuick Checkを学んでテストしてみようと思います。
import Data.List data Point2D = Point2D { x::Int, y::Int } deriving (Eq, Show) data Direction = CounterClockWise | ClockWise | Collinier deriving (Eq, Show) -- 線分abの延長線上に点cがあるならば、Collinier -- 線分abの延長線の左側に点cがあるならば、CounterClockWise -- 線分abの延長線の右側に点cがあるならば、ClockWise -- ベクトルabとベクトルbcの外積のz座標の符号で上記を判定する direction :: Point2D -> Point2D ->Point2D -> Direction direction a b c | crossProductZ > 0 = CounterClockWise | crossProductZ < 0 = ClockWise | otherwise = Collinier where crossProductZ = abx * bcy - aby * bcx where abx = (x b) - (x a) aby = (y b) - (y a) bcx = (x c) - (x b) bcy = (y c) - (y b) -- 平面上の点の集合の凸包をGraham Scanアルゴリズムで求める convexHull :: [Point2D] -> [Point2D] convexHull xs = convexHullSub ys where ys = [p] ++ sortForGrahamScan p pRemoved ++ [p] where p = startPoint xs pRemoved = filter (\x->x/=p) xs convexHullSub :: [Point2D] -> [Point2D] convexHullSub (a:b:c:xs) | direction a b c == CounterClockWise = a:(convexHullSub (b:c:xs)) | otherwise = convexHullSub (a:c:xs) convexHullSub xs = xs -- 平面上の点をソートする -- 点pとソートする点を通る直線とx軸の成す角度の昇順でソートする sortForGrahamScan :: Point2D -> [Point2D] -> [Point2D] sortForGrahamScan p xs = sortBy compareAngle xs where compareAngle a b | cosVal a < cosVal b = GT | otherwise = LT where cosVal point = (fromIntegral pointX) / sqrt (fromIntegral (pointX * pointX + pointY * pointY)) where pointX = (x point) - (x p) pointY = (y point) - (y p) -- 点pを求める -- 点pはy座標が最小の点の中で、x座標が最小の点である startPoint :: [Point2D] -> Point2D startPoint xs = head (sortByCoordinates xs) where sortByCoordinates = sortBy compareXY where compareXY a b | (y a) < (y b) = LT | (y a) > (y b) = GT | (x a) < (x b) = LT | otherwise = GT
Markdownによるプレゼンテーション用スライド作成
0. 環境
ArchLinux
1. Pandocのインストール
sudo pacman -S pandoc
2. reveal.jsのインストール
git clone https://github.com/hakimel/reveal.js.git
3. スライドのMarkdownファイル作成
vim slide.md
4. Pandocによる変換
pandoc -t revealjs -s slide.md -o slide.html
slide.htmlは、git cloneしたreveal.jsディレクトリと同じディレクトリに配置します。
5. 確認
firefox slide.html
ArchLinuxのインストール方法
この記事は主に自分用のメモであるため、誤りやわかりにくい点があるかもしれません。インストールガイド - ArchWikiや他サイトと比較しながら、参照することをオススメします。
0. 環境
ASUS X553M (CPU: Intel BYT-M 2Core 2840, up to 2.58GHz)
1. LiveCDからの起動
LiveCDをDVDドライブに入れ、BIOSで、ブートデバイスをDVDドライブに指定して起動します。
2. 日本語キーボード設定
以下のコマンドを入力します。
loadkeys jp106
3. wifi接続
以下のコマンドを入力します。ここで、「wlp2s0」は僕のマシンのwifiインターフェース名です。
ip link set wlp2s0 up cd /etc/wpa_cupplicant echo ctrl_interface=/run/wpa_supplicant > wifi.conf echo update_config=1 >> wifi.conf wpa_supplicant -B -i wlp2s0 -c /etc/wpa_supplicant/wifi.conf
次に、wpa_cliコマンドを実行します。
wpa_cli
すると、CLIが表示されるので、以下を入力していきます。プロンプトを「>」で表しています。ssidとpsk(プライマリキー)は各自の環境に合わせてください。ダブルクォーテーションで囲む必要があるようです。
> add_network 0 > setnetwork 0 ssid "XXXXXX" > setnetwork 0 psk "XXXXXX" > enable_network 0 > save_config > q
次に、wifiインターフェースにIPアドレスを割り当てるため、以下のコマンドを実行します。
dhcpcd wlp2s0
4. パーティション作成
4.1 現在のパーティション確認
以下のコマンドで現在のパーティションを確認します。
lsblk
4.2 fdiskを使用したパーティション作成
以下のパーティションを作成します。メモリが4GBなので、swap領域は2倍の8GBにしました。
領域 | 容量 | デバイスファイル |
---|---|---|
/boot | 512M | /dev/sda1 |
swap | 8G | /dev/sda2 |
/ | 64G | /dev/sda3 |
/home | 残り | /dev/sda4 |
fdiskでこれらのパーティションを作ります。
fdisk /dev/sda
Command : o Command : n Partition type: Select : p &Partition number : 1 First sector : Enter を押す Last sector, +sectors or +size{K,M,G} : +512M Command : n Partition type: Select : p &Partition number : 2 First sector : Enter を押す Last sector, +sectors or +size{K,M,G} : +8G Command : n Partition type: Select : p &Partition number : 3 First sector : Enter を押す Last sector, +sectors or +size{K,M,G} : +64G Command : n Partition type: Select : p &Partition number : 4 First sector : Enter を押す Last sector, +sectors or +size{K,M,G} : Enter を押す # /bootのパーティションタイプ設定 Command: a Partition number: 1 # swap領域のパーティションタイプ設定 Command: t Partition number: 2 Hex code: 82
4.3 ファイルシステムの設定
mkfs.ext2 /devsda1 mkswap /dev/sda2 swapon /dev/sda2 mkfs.ext4 /dev/sda3 mkfs.ext4 /dev/sda4
4.4 パーティションのマウント
mount /dev/sda3 /mnt mkdir /mnt/boot mount /dev/sda1 /mnt/boot mkdir /mnt/home mount /dev/sda4 /mnt/home
5. ミラーサイト設定
vi /etc/pacman.d/mirrorlist
以下を一番上に移動させます。
## Japan Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
6. 必須パッケージのインストール
pacstrap /mnt base base-devel
7. マウント設定ファイル生成
genfstab -U -p /mnt >> /mnt/etc/fstab
8. chroot環境での各種設定とインストール
以下のコマンドで、/mntを一時的にルートディレクトリにします。これを実行した後の環境をchroot環境と呼ぶことにします。
arch-chroot /mnt /bin/bash
chroot環境になりましたので、各種設定とインストールをしていきます。
8.1 言語の設定
ロケール生成ファイルを開きます。
vi /etc/locale.gen
以下の行をコメントアウトします。
en_US.UTF-8 UTF-8 ja_JP.UTF-8 UTF-8
以下のコマンドでロケールを生成します。
locale-gen
言語の環境変数を設定します。
echo LANG=en_US.UTF-8 > /etc/locale.conf export LANG=en_US.UTF-8
日本語キーボードの設定をします。
loadkeys jp106 echo KEYMAP=jp106 > /etc/vconsole.conf
8.2 時間の設定
タイムゾーンを設定します。
ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ハードウェアクロックを設定します。
hwclock -w -u
8.3 ホスト名設定
以下のようにホスト名を設定します。
echo <ホスト名> > /etc/hostname
/etc/hostsにもホスト名を書いておきます。
vi /etc/hosts
#<ip-address> <hostname.domain.org> <hostname> 127.0.0.1 localhost.localdomain localhost <ホスト名> ::1 localhost.localdomain localhost <ホスト名>
8.4 ネットワーク設定
systemctl enable dhcpcd.service
8.5 rootパスワード設定
passwd
8.6 ブートローダgrubのインストールと設定
pacman -Sy pacman -S intel-ucode pacman -S grub grub-install --target=i386-pc --recheck /dev/sda grub-mkconfig -o /boot/grub/grub.cfg
8.7 chroot環境から抜ける
exit
8.8 パーティションのアンマウント
umount -R /mnt
8.9 再起動
reboot
Pythonで数学の勉強
SymPy
pythonの数式処理ライブラリ。 CAS(Computer Algebra System)といい、式変形をすることで方程式などを解いてくれるようだ。
CASには以前から興味があった。これぞ人工知能という感じだ。
Jupyter
pythonのREPLをブラウザ上で実行し、その結果を書き留めておくことができるWebアプリ。
ArchLinuxへのSymPyとJupyterのインストール
SymPy
sudo pacman -S python-sympy
Jupyter
sudo pacman -S jupyter-notebook sudo pacman -S python-ipywidgets
グラフを描きたいので、pythonのライブラリmatplotlibをインストールする。 あと、数式をLatex形式で表示したいのでMathJaxをインストールする。
sudo pacman -S python-matplotlib sudo pacman -S mathjax
実行方法
まず、localhostでJupyterを起動する。
jupyter notebook
表示されたURLをブラウザで開く。 右端の「New」をclickして「Python3」を選択すると、REPLが表示される。 以下のようにして、グラフが描ける。
from sympy import * x=symbols("x") from sympy.plotting import plot plot(sin(x)/x)