unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

機械学習を理解するための数学のきほん

私が機械学習を始めるときに最初に読んだ本を簡単に紹介します。

概要

線形モデルを使った機械学習の数学的理論が、高校数学の知識で理解できるように解説されている。取り上げられている主な内容は以下の通り。

  • 回帰問題
    • 最小二乗法を使って、誤差関数を定義し、最急降下法でパラメータ更新式を求める手順
    • 多項式回帰、重回帰、確率的勾配法の適用方法
  • 分類問題
    • パーセプトロンを使って、座標的な意味からパラメータ更新式を求める手順
    • ロジスティック回帰の尤度関数を定義し、最急降下法でパラメータ更新式を求める手順
    • ロジスティック回帰への多項式特徴量の適用方法
  • モデルを評価するための交差検証
  • 線形モデルの過学習を防ぐための正則化(L1、L2)

また、これらの機械学習モデルをPythonでの実装方法(scikit-learnなどのライブラリを使わずに、NumPyを使って自分で実装する)も解説されている。

感想

機械学習を始めるに当たって、取っ付きやすい書籍を探して行きついたのが本書であった。グラフを使って数式の図形的な意味が解説されていて、巻末には数学を離れて久しい人が忘れていそうな基礎知識もまとめられているため、線形モデルの数学的理論の基礎を途中で詰まることなく理解することができた。

本書は機械学習で最近よく使われるアルゴリズムや、実践的なテクニックまでは触れていないが、数学を忘れかけている人が機械学習の基礎となる線形モデルの理論を理解するのにとても役に立つ本であると感じた。

bashrcとbash_profileの使い分け

読み込みタイミング

  • ログイン時
    • .bash_profile.bashrc の順に実行される
  • bash起動時
    • .bashrc のみ実行される

用途

参考

Visual StudioサブスクリプションでMicrosoft Azureを利用する

Visual Studioサブスクリプション(旧MSDNサブスクリプション)にはMicrosoft Azureを利用できるクレジットが付いてくるものがある。(例えば、Visual Studio Professionalサブスクリプションでは月間50ドルのクレジットが付く。)

ただし、このクレジットで利用できるサービスには以下の制限があることに注意が必要である。

  • 開発もしくはテストでのみ使用でき、運用目的では使えない。
  • SLAの保証はなく、120時間以上の連続稼働が禁止されている。
  • 利用できないリージョンがある。
    • 例えば、仮想VMは米国東部、米国中南部、ヨーロッパ西部、東南アジア、米国西部2、米国中西部のリージョンにのみ作成できる。
  • 利用できないサービスがある。
  • 有料サブスクリプションよりクォータが低いものがある

参考

Tomcatのlogging.properties設定方法

Tomcat 7/8のログ出力設定ファイル(logging.properties)の定義方法をまとめています。

Tomcatjava.util.logging API実装(JULI)での設定方法拡張(一部抜粋)

  • .handlersプロパティを設定することでルートLoggerのHandlerが定義できる。
  • Handler名にプレフィックスを付けることで同じHandlerクラスを複数回利用できる。
    • プレフィックスは数字で始まり.で終わること。
  • あるLoggerにHandlerが設定されている場合は親のLoggerの処理は実施されない(設定で変更可能)。

デフォルトのlogging.properties設定内容

# 利用するHandlerを指定する。この設定方法はjava.util.loggingと同様。
# org.apache.juli.FileHandlerクラスを"1catalina"、"1localhost"、"3manager"というプレフィックスをつけることで3つのHandlerとして利用している。
handlers = 1catalina.org.apache.juli.FileHandler, \
           2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

# ルートLoggerが利用するHandlerを指定する。
# Loggerに個別にHandlerを指定していない場合は、ルートLoggerのHandlerに渡される。
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

# 各Handlerに対して設定値を指定する。
# level:出力するログレベル
# directory:ログファイルを出力するディレクトリ(FileHandler)
# prefix:ログファイルのファイル名のプレフィックス(FileHandler)
# bufferSize:ログ出力処理のバッファサイズ(FileHandler)
# formatter:ログの整形を行うクラス

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 各Loggerに対して設定値を指定する。
# level:記録対象となるログのログレベル
# handlers:Loggerが利用するHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

参考

シェルスクリプトでの正規表現を使ったバリデーション

exprコマンドを使う方法

target='aa bbcc'

# 正規表現をクォートする。
# 変数展開時はワード分割を避けるためにクォートする。
if expr "${target}" : "^a\+ [b-c]\{4\}$" > /dev/null; then
    echo "match"
fi

# 正規表現にマッチしない条件分岐をするには!を使う。
if ! expr "${target}" : "^a\+ [b-c]\{3\}$" > /dev/null; then
    echo "mismatch"
fi

[[ ]] 構文を使う方法(bashzshなど)

target='aa bbcc'

# bash: 正規表現をクォートしない。
# zsh: 正規表現をクォートする。
# 変数展開時のクォートは不要。
if [[ ${target} =~ ^a+' '[b-c]{4}$ ]]; then
    echo "match"
fi

# 正規表現にマッチしない条件分岐をするには!を使う。
if [[ ! ${target} =~ ^a+' '[b-c]{4}$ ]]; then
    echo "mismatch"
fi

参考

Spring FrameworkにおけるBeansとは

Spring Framework初心者である私がSpring BootのGetting Startedガイドを読んでみたときに、いきなり躓いたのがSpringのBeansという概念でした。これまでSpring Frameworkに触ったことがなければ、Beansと聞くとJava Beansをイメージするかもしれませんが、Spring Frameworkでは独自の概念として使われているので注意が必要です。

Spring FrameworkにおけるBeans

Beansとは、Sprint IoC(DI)コンテナが管理(インスタンスの生成や保管)する、アプリケーションを構成するオブジェクトのこと。従来のXMLで設定する方法の他に、Javaアノテーションでも設定できる(現在はこちらが主流)。

JavaアノテーションでのBeans設定例

Beansを設定するには@Configurationを付与したクラスに@Beanを付与したメソッドを定義する。公式リファレンスでは同じ設定をJavaアノテーションXMLで定義した以下の例が紹介されている。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
参考

自転車保険調査

これまで契約していた自転車保険の更新時期なので、契約を見直そうと少し調査してみました。

要件

  • 個人賠償は1億円以上
  • 死亡保障・入院保障は不要

一覧

今回調査した中で最もお得なのは全日本交通安全協会が販売するサイクル安心保険であった。その他は自動車・火災・傷害保険に付け足せるものがコストパフォーマンスが良い。(以下では東京海上日動のものだけを記載しているが、その他のカードや保険会社にも同様のオプションがある。)

名称 提供元 月額 年額 個人賠償 死亡・後遺症 入院 示談交渉 メモ
サイクル安心保険 プランA 全日本交通安全協会 1230円 1億円 なし なし あり 自転車に係る事故のみ補償
トータルアシスト 個人賠償責任補償特約 東京海上日動 1530円 無制限(国外1億円) なし なし あり 東京海上日動 保険契約者向け
ラクラク WEB サイクルアシスト 朝日火災 1620円 1億円 100万円 日額1000円 あり 2・3年契約割引あり
トッピング保険 日常生活賠償プラン JCB 150円 1800円 1億円 100万円 なし あり JCBカード保有者向け
CYCLE PARTNER サイクルベースあさひ 170円 1920円 2億円 最大400万円 日額2000円 あり 自転車に係る事故のみ補償
超かんたん保険 自転車保険プラン 楽天 140円 1960円 1億円 100万円 日額1500円 あり
eサイクル保険 価格.com専用プラン 東京海上日動 2030円 無制限(国外1億円) なし なし あり

参考