Thinkpad X240を買った

背景

自分はこれまでデスクトップマシンでWindowsOSと、モバイル環境としてMacOSを使ってきた。
最近、業務の関係でLinuxOSにも慣れておく必要が出たため自宅のデスクトップマシンにUbuntu18.04をデュアルブートする形でインストールし、運用してきた。
しばらく運用してみたところその環境が意外と快適だったため、今回は思い切ってUbuntuを動作させるためのマシンを一台用意することにした。

選定理由

Ubuntuを動かすマシンを準備するとなったところで、まずは要件を決めるところからスタートした。具体的には以下。

  • 大きさについて:
    • 大きさがA4サイズであること。
    • 重さが1.5kg以下であること。
  • マシン性能について:
    • ストレージがSSDで256GB以上であること。
    • メモリが4GB以上であること。
  • 価格帯について
    • 5万円以下であること。
  • その他
    • 中古でもよい。
    • ノングレアパネルだと嬉しい。

上記の要件を満たすマシンを探したところで、Thinkpadのラインが挙がった。中古品のユーザが多くて安いものも多く出回っている上に評判も悪くない。
また以前MacBookを購入したときも同様であったが、情報系の開発者にはThinkpadの利用者が多いため、何がいいのか実際に使って評価したいというミーハー要素もひとつ。

買ったもの

今回購入したのはX240と呼ばれる2015年のモデル。
秋葉原ドスパラの中古フロアに置かれていたものを購入したのだが、その時点ではHDD500GBが搭載されていた。HDDではOSや各種アプリの起動速度に満足できないであろうことがわかっていたため、SSDも同時に購入。合計で33000円程度の購入。
ヤフオクではもう少し安価で買うことはできたようだが、こういうものは一応現物を見たいタイプの人間なのでそのまま購入。気にならない人はネットを活用した方が良い。

MacBookとの操作感の比較

せっかくなので、自宅にあるMacBook (Retina, 12-inch, Early 2015) と比較してみる。

キー入力系

Thinkpad

Thinkpadを触ってみると、売りの一つであるキーボードの押し心地が非常によいMacBookはザ・ウルトラブックという感じで非常にストロークが浅くて反発も少ないキーであったが、それとは真逆の傾向でストロークが深くて押下したときに反発を感じる。
ちなみに、Thinkpadはいわゆるよくあるキーボードの配列と比較してctrlキーとFnキーの場所が入れ替えられており戸惑ってしまう。ただしこれはBIOSの設定メニュー内で入れ替えるかどうかを選ぶことができるようになっているため対応可能。この配置は元々Thinkpadを開発していたIBMの配列なんだろうか…。

MacBook

一方、MacBookのキーボードもよくあるキーボードと違い、ctrlキーではなく代わりにoptionキーが配置されている。機能自体は同じであるためあまり気にならないのだが問題はその配置である。
MacOSのOptionキーはいわゆるよくあるキーボードで言うところのAltキーかWinキーが配置されている位置にある。ショートカットキーを使う場合には小指でCtrlキー、中指でAやSを押下することが多いのだがその位置にキーが配置されていると非常に窮屈である。3年ほど使ったが、未だに慣れない。他のMacユーザ各位はどう操作しているんだろう。

カーソル操作系

Thinkpad

それぞれが特有に持っているカーソル系の入力I/Fとしてトラックポイントトラックパッドがある。トラックポイントの代名詞。これはThinkpadのキーボードの中にいる赤ポチである。これも慣れると手放せなくなると聞いているが、如何せんまだ慣れていないためかあまり使いこなせない。
また、X240のタッチパッドはすこぶる評判が悪い。評判が悪すぎて次の世代であるX250からはタッチパッドがそれ以前のものに戻されている。
タッチパッドも交換可能であるようだが、現時点ではそこまで致命的だと感じていないこと、作業の難易度が高いことから本当に必要と判断したら交換することとする。

MacBook

一方でMacBookに搭載されているトラックパッドは慣れていることもあるが、単純にタッチしたときの精度が非常に高く、意図したところでカーソルが止まってくれる。そのうえ2本指でのページ送りや3本指での作業スペース送りは非常に行いやすく、ストレスフリーである。

画面系

Thinkpad

X240の画面はディスプレイのサイズが12.5inchとあまり大きくはなく、かつ解像度もHD(1366×768)であり作業エリアが小さくストレスである。おまけにTNパネルが使われているため視野角が狭く、かつ表示色も鮮やかでないと来ている。
ところが、Thinkpadはディスクやメモリだけでなく、なんと液晶パネルまで交換可能とのことでネット上で調べてみると実際に変更している記事がたくさん存在している。どうもThinkpadの良さはこういう拡張性の高さにもあるらしい。

ということで、それらの記事も参考としてフルHD画質化するための液晶を購入することにした。合計45000円弱。

MacBook

一方でMacBookRetinaディスプレイと呼ばれる非常にきれいなディスプレイ。ただしグレアパネルであるため映り込みが気になったり汚れが目立ったりもするが、いかんせん解像度が人権を得るための必要条件であるフルHDを満たしているため、快適性も大きくリードしている。(そもそもX240が人権得るための要求を満たせていない)
MacBookの方はベゼルレスであるため、PC本体に対するディスプレイの大きさがよく確保されており、コンパクトである割に画面が大きく感じられる。

以上から、少なくとも現時点では - キー入力をメインに置くならThinkPad(フルHD化はほぼ必須) - カーソルによる操作をメインとするならMacBook

と向き不向きがあるように感じる。

しばらく使ってみて

  • X240のトラックポイントには慣れてきたが、タッチパッドはすこぶる評判が悪い。評判が悪すぎて次の世代であるX250からはタッチパッドがそれ以前のものに戻されている。
    タッチパッドも交換可能であるようだが、現時点ではそこまで致命的だと感じていないこと、作業の難易度が高いことから本当に必要と判断したら交換することとする。
  • 冷静に考えるとメモリ4GBは意外と足りていないかもしれない。ChromePython+xonsh、Atomエディタでそれなりにメモリを食ってしまうので。
    こちらももう少し運用して、必要に応じて増設する。

(参考)買ってからやったこと

  • HDDを取り外してSSDに付け替えた。
  • Ubuntu18.04をインストールした。
  • 以下をインストールした。
    • Anaconda3
      • Python環境として普段から使用しているもの。
    • Atomエディタ
      • 元々Sublimeを使っていたが、Ubuntu上で日本語入力をするための制約が大きかったため今回乗り換えた。
    • Chrome
      • 大事。
    • zsh
      • 標準のシェル。この上でxonshを動作させる。
    • xonsh
      • Python製のシェル。これが便利。
      • シェル環境の設定手順は以下。apt-getでxonshをインストールするとPythonのパスがAnaconda3にならず、デフォルトでインポートを完了させたいライブラリが使えない。
        1. Anaconda3をインストール。その際にbash環境変数にAnaconda3のパスを追加する。
        2. pip install でxonshをインストールする。
        3. ~/.xonshrcを作成、編集する。
        4. zshをインストールする。
        5. ~/.zshrcを作成、編集する。
    • terminator
      • ターミナルアプリ。画面のスプリットができるため。
    • vim
      • xonshから各種システム設定を変更するときに必須。
  • ログインシェルをbashからxonshにした。ただしzshから呼び出すばんくし方式を基準に一部編集している。
  • IPS液晶を発注した。
  • (これから)MacBookの売却

積の期待値と期待値の積

久しぶりの投稿。

私用で,二つの確率変数の積がどのような分布に従うのか(というかその期待値はどのように表現されるか)を明らかにする必要があったので少し調べてみた所を記述します。

問題設定

2つの確率変数
{x, y}を考える。
ここで,

{x \sim N(\mu\_x, \sigma^{2}_x)}, {y \sim N(\mu\_y, \sigma^{2}_y)}

とする。
今回考える問題は,
{E(xy)}がどのように表現されるかを得ること。
みなさんご存知の通り,{x, y}が独立である場合は{E(xy) = E(x)E(y)}とはよく言われます。実際にぐぐれば導出式はたくさん出てくるはず。

では,こいつらが独立ではない場合はどうなるのか?となるのは自然な流れ。
以下,導出を行ないます。
ちなみに,以下の記事は正規分布に従う確率変数同士の積の分布について - 数学 締切済 | 教えて!gooで見かけたやり取りを参考にしています。役立つときは役立つもんですね。(それでも間違っている可能性はあるけど)

変数変換

まず,以下のように変数変換を行なう。

\displaystyle
{U = \frac{1}{\sqrt{2}}\ (\frac{x}{\sigma_x} + \frac{y}{\sigma_y})}
\displaystyle
{V = \frac{1}{\sqrt{2}}\ (\frac{x}{\sigma_x} - \frac{y}{\sigma_y})}

すると,{U,V}は以下の正規分布に従う。

\displaystyle
{U \sim N(\mu_1, 1^2)}
\displaystyle
{V \sim N(\mu_2, 1^2)}

但し,

\displaystyle
{\mu_1 = \frac{1}{\sqrt{2}}(\frac{\mu_x}{\sigma_x}+\frac{\mu_y}{\sigma_y})}
\displaystyle
{\mu_2 = \frac{1}{\sqrt{2}}(\frac{\mu_x}{\sigma_x}-\frac{\mu_y}{\sigma_y})}

と置いている。
ちなみに,この{U,V}は共分散が0,すなわち独立である。

{xy}の表現

次に,この{U,V}を使って{xy}の表現を得てみる。
これらを二乗すると,以下のようになる。

\displaystyle
{U^{2} = \frac{1}{2}(\frac{x^{2}}{\sigma^{2}_x} + \frac{2xy}{\sigma_x \sigma_y} + \frac{y^{2}}{\sigma^{2}_y})}
\displaystyle
{V^{2} = \frac{1}{2}(\frac{x^{2}}{\sigma^{2}_x} - \frac{2xy}{\sigma_x \sigma_y} + \frac{y^{2}}{\sigma^{2}_y})}

これらの両辺を減算すると

\displaystyle
{U^2-V^2 = \frac{2xy}{\sigma_x \sigma_y}}

{xy}について整理して,

\displaystyle
{xy = \frac{\sigma_x \sigma_y}{2}(U^2-V^2)}

期待値の計算

ここで,{U,V}をよく見ると,こいつらは自由度1,非心度それぞれ{\mu_1^{2}, \mu_2^{2}}の非心カイ二乗分布に従っている。
ここで,自由度k, 非心度\lambdaのの非心カイ二乗分布に従う確率変数の期待値は(k+\lambda)で与えられる。
それを利用すると,今回求めようと考えている期待値は

\displaystyle
{\begin{eqnarray}
E(xy) &=& E\Bigl(\frac{\sigma_x\sigma_y}{2}(U^2-V^2)\Bigr) \\
&=& \frac{\sigma_x\sigma_y}{2}E(U^2-V^2) \\
&=& \frac{\sigma_x\sigma_y}{2}\Bigl(E(U^2)-E(V^2)\Bigr) \\
&=& \frac{\sigma_x\sigma_y}{2}\Bigl((1+\mu_1^2)-(1+\mu_2^2)\Bigr) \\
&=& \frac{\sigma_x\sigma_y}{2}\Bigl(\mu_1^2 - \mu_2^2\Bigr)\\
&=& \frac{\sigma_x\sigma_y}{2}\Bigl(\frac{1}{2}(\frac{\mu_x^{2}}{\sigma^{2}_x} + \frac{2\mu_x\mu_y}{\sigma_x \sigma_y} + \frac{\mu_y^{2}}{\sigma^{2}_y}) - \frac{1}{2}(\frac{\mu_x^{2}}{\sigma^{2}_x} - \frac{2\mu_x\mu_y}{\sigma_x \sigma_y} + \frac{\mu_y^{2}}{\sigma^{2}_y})\Bigr)\\
&=& \frac{\sigma_x\sigma_y}{2}\frac{2\mu_x\mu_y}{\sigma_x\sigma_y}\\
&=& \mu_x\mu_y
\end{eqnarray}
}

となる。

以上から,確率変数{x,y}の独立性を仮定していなくても{E(xy) = E(x)E(y)}となってしまった。非常に気持ち悪い。
おそらくどこかに間違いがあるんじゃないかと思いますが,現状では見つけられていないのでどなたか間違っている点があれば教えてください・・・。

システム同定の基礎

久しぶりの記事になってしまった…年明け初記事なので、明けましておめでとうございます。

前回の記事で、(当時の)これから勉強したい事について記述をしました。
あれらのうち、状態空間モデルの考え方、カルマンフィルタに関して基本的なところを勉強しました。
しかし、それらの理論はモデルを既知として組み上げられている問題であるため、それだけでは実データへの適用やトライアルは当然うまく当てはまりません。
ということで現在はシステム同定に関する勉強をちゃんとしようと考え、自分なりの勉強のゴールを以下のように設定しました。

  • 対象とする系の状態空間表現を得られるようになる

ということで、以下の書籍を読み込んでおります。

システム同定の基礎

システム同定の基礎

もう一つ、こんな本もあるのですがこれはPRMLのように事前に必要となるの知識レベルが高いとのこと(ソース:職場の優秀な先輩)で、ひとまず断念。

システム同定―部分空間法からのアプローチ

システム同定―部分空間法からのアプローチ

ただし、自分は制御工学は学生時代には履修していない(修士の研究の中でバックシフトオペレータを使った程度です)ため、出現する用語や考え方はその都度調査する必要アリ。

そもそもシステム同定とは何か

システム同定とは、

対象とする動的システムの入出力データの観測値から、ある目的のもとで、対象と同一であることを説明できるような、何らかの数学モデルを作成することをいう。(上記書籍より引用)

つまり、対象の系を数式で表現しましょう、ということ(と自分は解釈しています)。

システム同定の目的

上記文章のなかで、「ある目的のもとで」とあります。
制御工学の文脈の中では、システム同定の目的の多くは「制御系を設計すること」だそう。確かに、加工機械や人工衛星などは正しく制御が行なえなければ重大な事故や損失につながりますね。

ちなみに、本書ではプラントの制御を目的と仮定しているようです。

システム同定のモデル

システム同定を行なうにあたり、数理的なモデルはパラメトリック、ノンパラメトリックの二つのモデルに大別されるとのこと。
ここでいうパラメトリックモデルは「システムの動特性を有限個のパラメータによって特徴づけるモデルのこと」、
ノンパラメトリックモデルは「無限個のパラメータによって構成されているモデル」とのことです。
例)
パラメトリック  :伝達関数状態方程式など
ノンパラメトリック:インパルス応答関数、周波数伝達関数など

統計学とは表現が異なっているものの、言わんとしていることはだいたい同じであると考えていいかなと思います。
ここで、単純な状態空間表現におけるシステムは入力量、状態量、出力量、白色雑音から成ると考え、以下の表現形式を考えます。

{x(k+1) = Ax(k) + Bu(k) + v(k)}
{y(k) = C^{T}x(k) + Du(k) + w(k)}
{v(k), w(k)}はホワイトノイズ

これらに対して部分空間同定法を適用して、どうなるんだろうか。
井手剛先生の書籍「入門 機械学習による異常検知」では入出力を考えていなかったため、今回考慮している対象とは異なるモデリングを行おうとしています。
この時、システム同定の方法はどのように変わってくるだろうか。これから勉強していきたいと思います。

非常に半端ではありますが、今回はここまでにして、未来の自分に任せようと思います。

-- 追記(3/21) --
で、これからどうすんねん、な感じになってしまった。

現状、自分が勉強できていることは

  • 離散時間時不変モデル

  • 線形

  • 入出力のない時系列

に対する部分空間同定法の手法。線形カルマンフィルタも一応自分でコードの作成はしてみたものの、既存のパッケージ(pykalman)と比較すると結果が全然合っていないため、デバッグしなくちゃと思っています。

なので、自分のこれからのアクションは
1. 入出力のある系に対する部分空間同定法の手法を勉強する(状態変数(上では{x(k)} )の次元がわかっていればMCMCなんかでもいいのかも?一旦保留。)
2. それらの勉強をするために必要な制御工学の知識習得(伝達関数って?周波数応答?)
3. アルゴリズムを実装するためのコーディングの練習

として、今後勉強をしていきたいなと思います。
それらとは別に、いい加減CやC++を書けるようになったりDNNの勉強もしなくちゃなぁと思います、上手い感じに捌いていきたい。

うむ

最近勉強用に、という事でこのブログを作成しました。

とりあえずブログ作ったよ、という事でこれから勉強していきたいなぁなことを並べておこうかなと思います。(どうせすぐ目移りする)

数学系

  1. 時系列解析(自己回帰モデルのパラメータ推定・状態空間モデル・カルマンフィルタ・粒子フィルタ周辺)
  2. 統計的因果推論、構造方程式モデリング(系の中に相関があるのが分かっても、因果関係まで知りたい理解したい)
  3. 密度比推定手法
  4. 情報幾何
  5. データ同化

プログラム系

  1. データのイケてる可視化方法
  2. ちょっとしたwebアプリ開発
  3. Julia言語

あたりかな。自分に必要な所から攻めていこうと思います。