Pythonでスペクトルのフィッティング

非プログラマーがPythonを学ぶために読んだ本 - 最終防衛ライン3 の「2. 一ヶ月勉強して、できるようになったこと」で書いた、Pythonでスペクトルのフィッティングを行った例を示します。matplotlib と pandas などを扱ったグラフの出力に関しては、別当まとめようと思います。matplotlib は手に取ってみるとなんとなくで扱えるのですが、真面目に取り組むと結構ややこしく、自分のためにも備忘録をしっかりまとめておきたい。
フィッティングだけならExcelでもできますが、データを大量に取り扱うとなるとマクロを組む羽目になりますし、マクロよりも、スクリプト言語を扱った方が拡張性があります。デーだ処理だけなら、Rを使う手もありますが、グラフを出力すること以外にもPythonを使った方が、やりたいこと、またできることが多いので。

フィッティングする適当なデータがなかったので、放射線スペクトル表示ツール SPViewer / 説明ページ における スペクトル例(FNF-401) を利用しました。確認用データを生成してそれをフィッティングしても良いのですが、それだとフィッティングできて当たり前ですし。
放射線スペクトルは、正規分布を取ることが知られているのでガウシアンフィッティングに最適。またバックグラウンドも二次式程度で近似できそうなので、丁度良いかなと。

f:id:lastline:20180412092647p:plain

スペクトルのフィット:例2Pythonでやった結果を表示しています。
先ず、pandas で CSV ファイルを読み込み、
フィッティング関数を定義し、scipy.optimize の curve_fit でフィッティングを実行します。
そして、その結果を matplotlib で描画しています。
フィッティング関数の定義や、データの取り扱いには numpy を利用しています。

以下のコードを実行すると、グラフが出力されます。
CSVファイルは、先述のように 放射線スペクトル表示ツール SPViewer / 説明ページ から スペクトル例(FNF-401) をダウンロードし、同名のフォルダに保存してください。URLから直接取得することもできますが、本質ではないのでカット。
過剰とも思えるコメントを付記しています。調べた際に、分かりにくかったポイントをまとめてあります。。そのくせに、関数の document は記述していない。

#モジュールのインポート
#import モジュール名 as * は非推奨。使っているコードを見かけますけど。
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

#データの読み込み
#関連として df を用いるが、データに即した変数名を使うべき。
#ベクトルとして取り出すことも可能。
#ただし、x, y を個別に取り出した方がフィッティングの際に扱いやすい。
#engine='python' と指定すると日本語ファイルも読み込めます。
file = 'fnf401_milk.csv'
df = pd.read_csv(file, engine='python', skiprows=250, nrows=350, header=None)

#元データがint値で、そのままではフィッティングできないので、float型に変換している。
channels = np.array(df.iloc[:, 0], dtype=float)
counts = np.array(df.iloc[:, 1], dtype=float)

#フィッティング関数の定義
#n次式を定義しやすいように、0次から記述した。
def quadratic(x, a, b, c):
    return a + b * x + c * x**2

#ガウシアンはより簡素に記述できるが、初期値を類推しやすい式にした。
def gauss(x, a, sigma, mean):
    return a / np.sqrt(2.0*np.pi) / sigma * np.exp(-((x-mean)/sigma)**2/2)

#フィッティング関数は二次関数とガウシアンをまとめて定義してもよい。
#ガウシアンを三度呼び出すので、分けて記述した。
#文頭のアスタリスクのついた*paramaters は引数を幾らでも渡せる。
#本来ならば引数を個別に指定すべき。
#今回はあまりにも冗長になるため、*paramaters と指定した。
def fitting(x, *paramaters):
    a0, b0, c0, a1, sigma1, mean1, a2, sigma2, mean2, a3, sigma3, mean3, = paramaters
    return quadratic(x, a0, b0, c0) + \
           gauss(x, a1, sigma1, mean1) + \
           gauss(x, a2, sigma2, mean2) + \
           gauss(x, a3, sigma3, mean3)

#初期値の設定。
#ガウシアンの場合、meanを適切に設定しないと発散しやすい。
#線形近似であっても適切に設定することが望ましい。
#関数の引数が複数ある場合は、タプルで渡すこと。
initial_quadratic = 70., 0.1, 0.1 #a0, b0, c0
initial_gauss1 = 1., 1., 300. #a1, sigma1, mean1
initial_gauss2 = 1., 1., 325. #a2, sigma2, mean2
initial_gauss3 = 1., 1., 395. #a3, sigma3, mean3

#初期値が多いので、個別に指定して接続した。
initial_parameter = initial_quadratic + initial_gauss1 + initial_gauss2 + initial_gauss3

#フィッティングの実行
#paramater_optimalが最適化されたパラメータで、covarianceは共分散。
paramater_optimal, covariance = curve_fit(fitting, channels, counts, initial_parameter)

#matplotlibの設定
plt.rc('font', family='Arial', size=14) #フォントの設定
plt.rc('xtick.major', width=1, size=6) #x軸の主目盛りの設定
plt.rc('xtick', direction='in', top=True) #x軸目盛りの向き、上側に表示するか
plt.rc('ytick.major', width=1, size=6) #y軸の主目盛りの設定
plt.rc('ytick', direction='in', right=True) #y軸目盛りの向き、右側に表示するか
plt.rc('axes', linewidth=1.5) #枠線の太さ
plt.rc('lines', linewidth=1.0) #プロットの太さ

#今回は、Axes が一つしかないので fig, ax1 = plt.subplots() の方が簡素。
#慣例として ax1 を用いるが、df 同様に意味のある変数名にすべき。
fig = plt.figure(figsize=(8, 6), dpi=80)
gs = gridspec.GridSpec(1, 1)
ax1 = fig.add_subplot(gs[0])

#データをグラフに表示する。
ax1.plot(channels, counts, ls='-', c='g', label='row data')
ax1.set_xlabel('Channel', fontsize=16)
ax1.set_ylabel('Count', fontsize=16)
ax1.yaxis.set_data_interval(0, 100) #set_ylim を使う方が一般的

#フィッティングした曲線の表示
#np.corrcoef で相関係数を求める。
#結果が2×2の行列で返るので、1行目2列目もしくは2行目1列目の値を取得。
ax1.plot(channels, fitting(channels, *paramater_optimal),
         lw=1.5, ls='--', c='k', label='fitting curve\n' + \
         f'$R^2$ = {np.corrcoef(counts, fitting(channels, *paramater_optimal))[0][1]}')

#二次関数のパラメーターを利用したいので、スライスで取り出す。
a0, b0, c0 = paramater_optimal[0:3]

ax1.plot(channels, quadratic(channels, a0, b0, c0), c='b',
         label=r'$y = a_0 + b_0x + c_0x^2$' +'\n'+ f'$a_0$ = {a0}\nb$_0$ = {b0}\nc$_0$ = {c0}')

#各meanをグラフ上に表示する。繰り返しのため for 文を利用。
for i in range(3,12,3):
#この関数内の、a0, b0, c0 はグローバル変数である。
    def quadratic_gauss(x, *paramaters):
        a1, sigma1, mean1, = paramaters
        return quadratic(x, a0, b0, c0) + \
               gauss(x, a1, sigma1, mean1)

#annotate で Axes 内にテキストや矢印を表示できる。
    mean = paramater_optimal[i+2]
    ax1.annotate(int(mean), fontsize = 14,
                 xy=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+3),
                 xytext=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+15),
                 ha="center", va='top',
                 arrowprops=dict(shrink=0.05, facecolor='k'))

#凡例の表示。Figure の判例を出力することもできる。
ax1.legend(loc='upper right', frameon=False)

gs.tight_layout(fig) #グラフ描画前に行うべし。慣例では、fig.tight_layout()
plt.show(fig) #慣例では plt.show() と fig を指定しない。

参考文献やサイト

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

matplotlib や numpy が簡単ではありますが、まとまっています。

matplotlib や numpy の取り扱いで大変役に立ちました。

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

主に、pandas の取り扱いを参考にしました。

非プログラマーがPythonを学ぶために読んだ本

関連:Pythonでスペクトルのフィッティング - 最終防衛ライン3

プログラミングの経験はほとんどないのですが、最近Pythonの勉強を始めました。自分のやりたいことがそれなりにできるようになりつつあります。いろいろな本を購入したり、図書館で借りたりして勉強したので、折角なのでそれらをまとめておきます。
プログラミング未経験者ではないものの、興味のある人がぴったりのまとめだと思います。
私の目標は、業務で扱う大量のデータ処理の自動化が主で、機械学習にもつなげられたらと考えています。特に科学技術計算を自動化したい。たとえば、大量のデータを同一フォーマットのグラフとして出力するなどですが、この目標は既に達成できました。

1. 私のプログラム歴

プログラム歴はほとんどありません。ビギナーに毛の生えた程度だと思います。

ゲーマーなので、プログラム的なものの親和性は普通の人よりは高いでしょう。一応、HTMLもCSSもそれなりに書けるので、それもアドバンテージではあります。また、大学の授業で一応はC言語をやったので、整数型、浮動小数点型などがあるのも知っています。ただし、それが面倒くさすぎてプログラムを諦めた口です。

その後にウェブページを弄るために、JavaScriptなども触ってみましたが、既存のプログラムを流用するだけだったため、基本的なことが分からず、結局やめてしまいました。
Pythonもたくさんのコードが公開されているので、それらを流用すればそれなりのことができるはずですが、JavaScript に手を出した時の二の舞にならないためにも、基礎をしっかり勉強しようと考え、本を購入したり、図書館で借りたりして、独学で勉強しました。

2. 一ヶ月勉強して、できるようになったこと

基礎を勉強してから、他人のコードを流用しつつ、理解できない部分があったらwebで調べたり、本を読んだりしていたら、大体一ヶ月くらいで、最初の大きな目標に到達できました。
たとえば、スペクトルのフィット:例2 のようなスペクトルのフィッティングができるようになりました。フィッティングなら、有料ソフトを使えば可能ですが、無料かつ自動化が容易なのが Python の利点でしょう。

f:id:lastline:20180411152639p:plain
Pythonでスペクトルのフィッティング - 最終防衛ライン3

pandas で CSV ファイルを読み込み、numpy と scipy.optimize でフィッティングし、それらのデータを matplotlib で描画したグラフを示します。カーブフィッティングを含めた、グラフの描画に関しては、近いうちにエントリーを書くつもりです。

また、私が使用している3DCGソフトであるShadeのスクリプトPythonなので、それが書けるようになったのは渡りに船でした。

クラスの取り扱いがまだまだ不慣れです。自分用のプログラミングなら、そこまで必要はないですが、今後自動化を進める上でも、できるようになった方が楽ができるので、精進するつもりです。

3. 非プログラマー向けの入門書

プログラミングの経験のない人向けの本を紹介しますが、場合によってはもっと簡単な本の方が向いていることもあるでしょう。たとえば、Pythonではなく、プログラミングの概念を紹介している本など。

多くの入門書が、オブジェクトやクラスの説明をかみ砕こうとしていますが、そのほとんどは飲み込めるまでには至っていません。そもそも、それらを理解するには、プログラマー向けの本を読むべきだと思います。また、初等ならばそのような概念があることを頭に入れておく程度で充分でしょう。

どのように書くか、そして何ができるかを指し示した本が、入門書として最適だと考えます。
コードを見ながら入力することを念頭においているため、大判の本を選びました。「みんなのPython」はA5版で小さいため、このような用途には向きません。ハンドブックとして使うには丁度よいサイズではありますが。
広げて読むことを念頭に置いたので、基本的には電子版ではなく書籍を購入しました。広い画面とリッチなタブレットがあれば、電子版でも良いかも知れません。

ここで紹介していない本も、いくつか本屋で見繕ってみましたが、ゲームや会話AIを作る本などは、実践が重視されすぎていて基本が疎かになっている場合が多く、基礎を学びたい自分には適当ではないと感じました。

Pythonスタートブック

オススメ度:☆☆☆☆

Pythonスタートブック [増補改訂版]

Pythonスタートブック [増補改訂版]


プログラミングの経験がなければ、まずこれから始めると良いでしょう。ただ、Python 2をベースに書かれていたので、購入は見送りました。
最近、改訂版が出たので、そちらの購入をお勧めします。

実践力を身につける Pythonの教科書

オススメ度:☆☆☆☆☆

プログラマー向けの入門書として、非常によくまとまっています。基本から、少し発展的なことまでできる構成になっているので、次へとつなげることもできます。
説明も過不足なくなされており、初心者がつまずきやすい「なぜ」を解消できるので、プログラミングの入門書としてもオススメです。

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

オススメ度:☆☆☆☆
コードやその結果を対比しやすいレイアウトが特徴。余計な図がなく淡々としています。各ライブラリについて、一通りの結果が示されており、割と細かいことまで明示されているので、レシピブックとしても有用です。

本書のコードを一通り書き写せば、基本的なことは身につきますが、淡々としているので、なかなかつらい作業です。Pythonでやりたいことが明確でないと、挫折するかも知れません。

行列を扱う Numpy や グラフ描画のための matplotlib にも軽く触れられており、科学技術計算を目標としている自分としては、役に立ちました。

確かな力が身につくPython「超」入門

オススメ度:☆☆☆

前半は非常に分かりやすく、丁寧に説明されています。図がイラストレーターの方によるものなので、プログラミングの本としては分かりやすいのが特徴です。むしろ、プログラミングの本の図はなぜ分かりづらいのが多いのか。
入門書の中では、オブジェクトやクラスの説明が比較的分かりやすかったです。ただ、後半の実践は「何ができるか」は示される者の、前半で散々説明された「なぜそうするのか」が皆無のため、自分が何をやっているのかが分かりづらいです。つまり、前半と後半のギャップが非常に大きいです。
後半は、Pythonでできることの例示と割り切って読むのもありでしょう。

特に、Webスクレイピングとして Amazon を扱うのはいただけないです。先ず、本書の通りにコードを書いて実行しても同じ結果が得られません。それは、本書の執筆時から、AmazonのHTMLの構成が変更されているため。また、本書を元に書き換えるにしても、 AmazonのHTMLの構成は、非常に解析しづらいです。そもそも、規約上は禁止されていますし。

学生のためのPython

オススメ度:☆☆☆

学生のためのPython

学生のためのPython

学生のためと銘打っているだけあって、他の入門書よりも簡単でした。説明も分かりやすいですが、少々かみ砕きすぎで、正確性に欠ける向きもあります。基本的なことは理解できますが、発展には弱いので、きちんと勉強したい人には物足りないかも知れません。
turtle での描画を軸にコードが例示されるので、結果が見た目でわかりやすいのも初学者向きかなと感じました。

簡単なフラクタルを描画するため、高階関数まで扱っているのが他の入門書にはない特徴で印象に残りました。

Pythonプログラミングのツボとコツがゼッタイにわかる本

オススメ度:☆

Pythonプログラミングのツボとコツがゼッタイにわかる本

Pythonプログラミングのツボとコツがゼッタイにわかる本

ブラックジャックのゲームプログラムを作成し、それをウェブで対戦できるようにしたり、また対戦AIなどを作ったりします。
とりあえず Python で動くプログラムをを作ってみたい!って人には向いていると思いますが、書籍の完成度としてレベルが低いので、個人的にはオススメしません。

著者代表は人工知能の専門家で、人工知能のパートはその方によるものですが、その他の部分は大学生が執筆してるようです。大学生が執筆したパートを著者代表がきちんと監修しているように思えません。文章は平易ではありますが、構成がよくありません。図などを見れば分かりますが、非常に理解しづらいです。

4. 非プログラマーPythonビギナー向き

コードは読めるし、書き方は分かるけど、何ができるか分からない人向けの本を紹介します。
自分のためにプログラムを書くのに適した本を紹介します。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

オススメ度:☆☆☆☆

「何ができるか」の特化した本です。初心者向きではありますが、それなりにPCに詳しくないと躓く部分が多々あります。Pythonを体系的に学ぶには向いていません。
色々な演習も用意されており、O'Reilly Japan - 退屈なことはPythonにやらせよう に回答が用意されているので、基礎を学んでチャレンジすると、それなりの歯ごたえがあります。

Webスクレイピングだけでなく、CSVExcel、PDF、Wordの操作など、主に事務作業の自動化に特化しています。Word や PDF の処理などは、他の本ではあまり取り扱っていない話題なので、その辺に興味のある人にもオススメです。

速習 Python 3

オススメ度:☆☆☆☆

上編を読めば、Pythonの基礎は身につきますが、非プログラマーには説明が不十分な箇所もあります。また、プログラミング経験者には優しすぎるかもしれません。Python にどんな特長があるのかをさっと読むには適していますが、それなら公式ドキュメントを読むべきでしょう。

中編では、プログラミングの概念や哲学について書かれており、関数型、オブジェクト指向、クラスなどが理解できない自分は、とても役に立ちました。
初学者向きとしては、クラスなどを使う利点がわかりやすい事例で丁寧に説明されています。

世界標準MIT教科書 Python言語によるプログラミングイントロダクション第2版

オススメ度:☆☆☆

プログラムを学ぶ大学生のための教科書です。プログラミング経験のない人には少々難しいかもしれません。
実践向けのプログラミング例もありますが、例示の内容が限界利益率の計算などやや古典的です。レイアウトや配色も、少々読みづらいです。

5. プログラマー向けの入門書

プログラミングの経験のある人向け、あるいは初心者向きの入門書を読破した人向けの本を紹介します。中級者向けと思われる本も含めています。結局、オライリーになっちゃうよね。

入門 Python 3

オススメ度:☆☆☆☆☆

入門 Python 3

入門 Python 3

例示が小粋で面白く、それでいて細かな点も過不足無く説明されています。。
章ごとにステップアップしていき、また少しだけ先の章を先取りするなど、理解のしやすい構成になっています。
プログラマーには少々難しいですが、これから挑戦するのもありでしょう

Python 3 プログラミング徹底入門

オススメ度:☆☆☆☆

Python 3 プログラミング徹底入門

Python 3 プログラミング徹底入門

  • 作者: マーク・サマーフィールド,Mark Summerfield,長尾高弘
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/12/01
  • メディア: 単行本
  • 購入: 1人 クリック: 61回
  • この商品を含むブログ (21件) を見る

私は三冊目に手を出したのですが、「なせそうしなければならないか」を理解する上で役に立ちました。たとえばメソッドや関数の実行方法。なぜメソッドを「ドット」でつなげるのか。なぜ import文には、色々な書き方があるのか。そして、どのような書き方が推奨されるかも。

初学者向けの本でも「なぜそうしなければならないか」は書かれていますが、ツッコんだ説明まではなされていません。プログラムを本格的に学ぶ人に書かれているため、その点もきちんと書かれています。演習問題も適度に難しく作られているので、力がつきやすいです。

Python3の本ではありますが、2009年に出版されたため内容が古いのが残念です。原本の第二版が出版されていますが、日本語訳はないようです。プログラミングの知識がない人が英語で読むには難しい内容だと思います。

Effective PythonPythonプログラムを改良する59項目

オススメ度:☆☆☆☆☆

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

より読みやすいPtyhonのコードを書くための本。見た目は薄いですが、内容は濃いです。どのように書くべきに留まらず、なぜそう書かなければならないかがきちんと示されています。
基礎が固まってきたら、変なクセが付く前に読んでおくと独りよがりなコードを書かなくてすみそうです。
邦訳がやや残念なので、英語が読めるなら英語版の購入をお勧めします。

6. レシピ集

組み込み関数やモジュールをいちいち覚えられないので、リファレンが手元にあると便利です。
プログラマー向けの入門書がレシピブックとしても流用できるので、それらを持っているなら購入する必要はないかなぁと思います。

pythonライブラリ厳選レシピ

オススメ度:☆☆☆

Python ライブラリ厳選レシピ

Python ライブラリ厳選レシピ

一通りは載っていますが、多くのビギナー向けの本がレシピブック集としても機能するので、それを所有していると、かゆい所に手が届かないと感じました。著者が日本人なので、日本語の取り扱いについても書かれているのが利点でしょうか。

逆引きPython標準ライブラリ 目的別の基本レシピ180+!

オススメ度:☆☆☆☆

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

評判が良かったので購入しましたが、やはりビギナー向けの書籍を持っていると少々物足りなさを感じました。
A5版は手に取りやすいのでレシピブックとしては最適な大きさだと感じました。

7. 科学技術計算、データサイエンス、ディープラーニング

私が科学技術計算を目標としているので、そのために読んだり、購入したりした本を紹介します。

これ一冊あれば大丈夫!という本がありません。特に、グラフを描画するための Matplotlib がなかなかのじゃじゃ馬で、これに特化した専門書が欲しかったのですが、見つけられませんでした。最近、公式ドキュメント*1が改定され、読みやすくなったそうですが、初心者が読むにはハード。お陰で、関数やクラスの勉強にはなりましたが。

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

オススメ度:☆☆☆

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

どのような対象に向けて書かれているのかがよく分からない本でした。
Numpy, Scipy, Matplotlib, pandas などが紹介されているものの、簡単なメソッドしか紹介されていません。これは高速化も同様で、この本を読んだからといって科学技術計算ができるようになるわけでも、コードを高速化できるようになるわけでもありません。

私にとっては、Pythonが科学技術計算に向いていることを再確認するためのアリバイ作りのような本でした。科学技術計算をPythonで始めようと思っている人を後押しする本と考えると最適化も。

巻末にPythonの組み込み関数と標準ライブラリ、およびNumpyの関数リファレンスがまとめっているのは便利でした。

Pythonによるデータ分析入門 : NumPy、pandasを使ったデータ処理

オススメ度:☆☆

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

pandas や Numpy およびそれをIPyhonで扱うための本です。評判は良いのですが、残念ながらPython2ベースのため、Python3と互換性のないコードで書かれている箇所が多々あります。

第二版が出版されましたが、邦訳版はまだ発売されていません。

Python for Data Analysis: Data Wrangling with Pandas, Numpy, and IPython

オススメ度:☆☆☆☆

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

というわけで、英語版を購入しました。レシピブックなので、英語が分からなくてもそんなに困らないと思います。

ただし、そのまま利用すると、日本語ファイルを取り扱う場合にエラーが起こる可能性があります。自分で解決策を見つける力が必要です。
日本語を扱わない手もありますが、それじゃあクールじゃないですよね。

Pythonによる科学技術計算 基礎編

オススメ度:☆☆☆☆☆

早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiitaはてなブックマークのコメントで紹介されていたので読んでみたのですが、説明が丁寧で分かりやすかったです。

Matplotlib の記述法として、MATLAB準拠とオブジェクト指向の違いがきちんと説明されているのがすばらしいです。多くのデータサイエンスの本では、その点が全然書かれていないんですよねぇ。

Scipy Lecture Notes

オススメ度:☆☆☆☆☆

書籍ではありませんが、非常によくまとまっています。残念ながら日本語版は2015年で更新が止まっていますが、それでも十分に役に立ちます。SciPyを中心としたガイドではありますが、Matplotlib のレシピ集やクイックリファレンスが大いに役に立ちました。
その他に、SciPyによる画像処理などもまとまっており、一度目を通しておくのをオススメします。

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

オススメ度:☆☆☆

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

データ処理のレシピが一通りまとまっており、何ができるのかをざっくりと見渡せますが、コードに関しても理論に関しても、紹介に留まっており、ツッコんだ説明がありません。たとえば、なぜそうするのか、関数を実行した際に何が返ってくるのは書かれていません。
入門書としては微妙だと感じました。統計処理を中心に学びたいのなら役に立つのかも。

ゼロから作るDeep LearningPythonで学ぶディープラーニングの理論と実装

評判が良いので購入してみましたが、まだ読めていません。

8. 私の勉強方法

最後に、私の勉強変遷をまとめておきます。

先ず「詳細! Python 3 入門ノート」を一通りやって、基本的なことを身につけました。次に、目に見える実践的なことをやりたかったので「退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング」を6章くらいまで演習をやりながら、進めました。
「退屈なことはPythonにやらせよう」の演習問題はプログラミング的な思考の勉強にはなりましたが、関数、メソッド、オブジェクト、クラスなどが今一つ把握できませでした。裏を返せば、それらを意識する必要があまりないので、初心者の演習としては丁度良かったかも知れません。

クラスを理解したかったので、内容は難しかったのですが「Python 3 プログラミング徹底入門」に挑戦してみました。その合間に「確かな力が身につくPython「超」入門」や「学生のためのPython」を読みつつ、図書館や本屋でPythonの本を漁っていました。
それと並行して、matplotlib や pandas などを利用してグラフの作図などを始めました。できる範囲でやりたいことを実現させた方がモチベーションを維持しやすいです。その際に「Pythonによる科学技術計算 基礎編」が役に立ちました。
これを読むために、Kindle Unlimited を再契約したのですが、「速習 Python 3」もKindle Unlimitedだったので試しに読んでみたら、中編がちょうど知りたかった、関数、メソッド、オブジェクト、クラスを取り扱う内容で、理解が深まりました。合わせて「Python 3 プログラミング徹底入門」もそれらの理解を助けてくれました。
さらに、Shadeのスクリプトも書いていました。こちらは、結果が見えやすく、実践につながるため、Pythonを勉強するモチベーションにもなりました。

現在は、「入門 Python 3」や「Effective PythonPythonプログラムを改良する59項目」などを読み進めています。

諸君 私はスカイリムが大好きだ

Nintendo Switch版は弓の狙いをジャイロでつける

気がついたらNintendo Switch版のスカイリムがリリースされていたので、ダウンロード版を購入していた。
Nintendo Switch版ならではの機能として、モーションコントロールamiiboなどがあるものの、どちらも試していない。モーションコントロールについては後述するが、amiiboはそもそも持っていない。
地味に嬉しかったのは、弓をジャイロで操作できる点。ブレスオブザワイルドのような操作感で弓を扱うことが可能だ。

Nintendo Switchの魅力は手軽さ

PS3版で飽き足らず、PC版も購入し、スペシャル・エディションもプレイして尚Nintendo Switch版に手を出す意義は、やはり持ち歩けることにある。
とはいうものの、Nintendo Switchのバッテリーは長くもたないので、結局、家の中で遊ぶことになるけれど。それでもプレイできる場所を選ばないのは魅力的だ。ソファにベッドに、トイレでだってできる。もちろん、Android 端末でリモートプレイすることも可能だが、ゲームをスタートするまでのセットアップが多くて面倒だし、スマートフォンでゲームをやりながら、他のアプリを使うのは、なかなかに煩わしい。その点、Nintendo Switchならさっと始めることができるし、スマートフォンもフリーになる。スリープ機能もあるので、すぐに止められるし、再開もしやすい。これらの点が、ゲームをゲーム専用ハードで遊ぶ利点だろうか。ただまぁ、スカイリムはバグが多いため、MODを導入しない場合でも、コンソールを使用できるPC版でプレイした方が快適だけども。

モーションコントロールは、コントローラーを本体から外すのが面倒なので試していない。Nintendo Switch版の魅力である手軽さが失われてしまうためだ。
スカイリムに限ったことではないが、本体からコントローラーを外すのは、思った以上に億劫である。かといって、外しっぱなしで運用はできない。なぜなら、コントローラーにもバッテリーが内蔵されているからだ。適宜充電するために、本体などにスライドさせながら接続する必要がある。このスライド機構がなかなかに手間である。
マリオ・オデッセイではモーションコントロールにより、多彩なアクションを繰り出せるのだが、コントローラーを外すのが面倒で主にProコンで遊んでいた。今後も、モーションコントロールを使ったゲームがリリースされるだろうから、コントローラーを本体から外した状態で運用できればいいのになぁとつくづく思う。たとえば、コネクタを接続してコントローラーの充電ができれば、本体から外したままにしておけるのに。

Nintendo Switch版のスカイリムで気になったのは、画面がやたらと暗いこと。モニターへ出力する場合は、モニターの輝度を上げれまくればよいが、Nintendo Switch本体の画面だと、輝度を最大にしても暗い。恐らく、この暗さが本来想定される明るさなのだろう。松明や周囲を明るくする「灯明」などの魔法が用意されているのに、それを使わずにプレイできていたのが、異常なのである。
画面の暗さが気になるなら、種族をカジートにするか、早々にドーンガードを初めて吸血鬼になって、固有パワーである「暗視」を使う手もある。

プレイ開始時におけるロードの長さが気にはなるが、スペシャル・エディションのロード時間が短すぎただけで、通常版と比較すると、そんなに変わらないかもしれない。そもそも、スペシャル・エディションは通常版よりも画質が高いはずなのにロードが速い。恐らく、最適化がなされているのだろう。

スカイリムを通算1000時間くらいプレイしているのでは

繰り返し遊んだゲームとしては、FF5聖剣伝説2クロノ・トリガー夢をみる島メタルギアソリッドなどがあるが、プレイ時間を合算するとスカイリムが一番長いのではなかろうか。

FF5はジョブによって、攻略の幅がある点が何度もプレイしたくなる所以だろう。クロノ・トリガーは「つよくてニューゲーム」の恩恵が大きい。移植される度に、結局周回を重ねてしまう。
夢をみる島メタルギアソリッドシリーズは、ゲーム内で色々なアクションを起こせることが楽しい。
これらの4作はゲームプレイの幅があるのが特徴で、これはスカイリムにも通じる。聖剣伝説2は攻略の幅はあまりない。それでもついついプレイしたくなるのは、聖剣伝説2の中を歩き回るのが楽しいからだ。つまり、純粋に共に箱庭感が好きなのだろう。この箱庭感は、夢をみる島メタルギアソリッドシリーズ、そしてスカイリムにもあり、スカイリムはその中でも随一の世界観である。

また、スカイリムはランダム性が高い。クエスト数が非常に多いため、攻略ルートには様々な組み合わせが存在し得る。また、ランダムクエストとしてドラゴンが振ってきたり、暴漢に襲われたりもする。時には、その両方が起こることもあるし、クエスト中に発生することすらある。そのため、同じようにプレイしても、異なるシチュエーションが発生しやすい。たとえば、私は懐を暖めるために盗賊ギルドのクエストから始めることが多い。それでも、メインクエストの進行度合いやレベルアップの具合、サイドクエストの受註などによって、毎回異なる体験をしているように感じる。

盗賊ギルドの利点はトニリアの存在である。彼女は盗品を買い取ってくれるが、それ以上にプレイヤーにとってありがたいのは、なんでも買い取ってくれることだろう。スカイリムの店主は特定のアイテムしか買い取ってくれないが、トニリアなら文句を言わずにゴールドに換金してくれる。その上、所持しているゴールドが多いのも大変嬉しい。
盗賊ギルドの欠点は、隠術のスキルばっかり上がって、その結果敵のレベルも上がってしまうことだ。戦闘スキルが釣り合わなくってしまう。これは、敢えてレベルを上げないことで回避することも可能ではある。それを補うために、闇の一党を進めても良い。

今回は、この後にメインクエストを進めて、ドラゴンレンドを取得してから、闇の一党なりドーンガードを進める予定だ。スペシャル・エディションをプレイした際に、ドラゴンを出現させないままゲームを進めたら、ドラゴンソウル不足に陥ってしまった。ドラゴンの出現しない世界は快適ではあったけども、シャウトが使えなくなるのは厳しい。
ちなみに、ドーンガードで吸血鬼になるなら、同時に闇の一党を進めると、暗殺しながら吸血鬼のスキルを上げることができて一石二鳥である。

薬疹の原因をDIYする羽目に。「医者はなんのためにあるんだ!!」

薬でアレルギーが出て全身にじんましんが出たのですが、薬局も皮膚科もまったく当てにならず、結局自分で原因となる薬を特定する羽目になりました。お薬手帳も役にたってない。

原因は、恐らく腰痛で処方された湿布薬と痛み止めで、経皮と服用から二つの経路で同系統の成分を摂取したことで、アレルギー反応が出やすくなったのだと思います。
当初は湿布薬のみが原因だと考えていたのですが、全身の赤身が引くどころか手足にも広がっていきます。おかしいなと思い、薬について自分で調べたら、痛み止めが湿布薬と同種の薬効であることが判明。そこで、痛み止めの服用とやめたら症状が引いて行きました。

痛み止めが原因であると特定する以前に、薬局で飲み合わせの確認や、皮膚科にも行ったのですが、飲み薬を止めるよう説明されませんでした。
知人の内科医に愚痴混じりにこの話をしたら、全身に症状が出ているなら、内服薬に決まっているよねとのこと。また、薬に関しても、ダメ押しで薬局に確認したら、湿布薬と痛み止めが同系統の薬なので、アレルギー反応が出たら、二つとも使用を止めるべきとも言われました。なぜ、それをもっと早く言わないのか。かかった皮膚科と調剤薬局が無能すぎたのでしょうか。対処をDIYしなければならないなら「医者はなんのためにあるんだ」。そりゃ、医療系デマサイトが蔓延るよなぁ。

ググレカス

アレルギーの症状が出たのは、ロキソプロフェンナトリウムの湿布薬と、セレコックス錠。ロキソプロフェンナトリウムはCOX1とCOX2阻害、セレコックス錠はCOX2阻害で、共に炎症や痛みを抑える薬です。私は、腰痛で整形外科へ行ったら処方されました。

処方されたロキソプロフェンナトリウムの湿布薬はカプサイシン入りだそうで、薬局で肌に合わなかったら使用を止めて下さいと言われました。今にして思えば、その言葉が余計な先入観になって、何かあったら湿布薬は貼らずに、痛み止めだけ飲めばいいやと考えていました。
湿布薬を貼ってみると、体中がポカポしました。そして、なぜか体中から唐辛子の臭いがしました。ただ、思い返してみると、これは恐らくアレルギーの症状だったのでしょう。

アレルギーの症状が出てからは、湿布薬はやめて痛み止めとしてセレコックス錠のみを飲んでいました。痛み止めもアレルギーの原因だったので、症状が引かないのは当たり前なのですが、薬局で飲み合わせの確認をしてもらって、また皮膚科にかかっても抗アレルギー剤は処方されましたが、内服薬の方は見向きもされませんでした。
後から分かったことですが、湿布薬なら貼ったところを中心に症状が出るはずですし、使用を止めたのに症状が全身に広がるのはおかしいです。

症状がまったく引く気配がなく、広がるので、ググったらセレコックス錠もアレルギーの原因になり得ると。で、再度薬局にかかったら、ロキソプロフェンナトリウムと、セレコックス錠は同系統なので、どちらかでアレルギー反応が出たら、両方とも使用を止めるべきと言われました。

律儀にお薬手帳を持っていたので、特定する際に調べやすかったのですが、それは本来薬局がするべき仕事でしょう。別々の病院から処方された薬ならまだしも、同じ整形外科から処方された薬です。湿布薬を止める際にも、薬局に相談し、その後に皮膚科で抗アレルギー剤が処方された際にも確認しているのに、痛み止めにはまったく注意が払われていませんでした。
結局、自分で原因を特定して、薬局に確認したら、おっしゃるとおりですとの対応されました。今回は、幸いにも症状が軽かったんですが、重くなる場合もありえます。皆さんも、ご注意下さい。おかしいとおもったら、しつこく聞くくらいが調度よいのかなぁと思いました。

Android Wear 2.0をスマートフォンと接続できない場合の対処法

Zenwatch 3を持っているのですが、Ticwatch EがAmazonでセールだったので購入。

Zenwatch 3はクラシカルで、Ticwatch Eはカジュアルなスポーツタイプと、見た目が違うので用途に合わせて使っていきたいですね。

Ticwatch Eは通常の時計の竜頭にあたる操作ボタンが左に配置されています。購入前は、操作しにくいのでは?と不安だったのですが、竜頭のように人差し指でクルクル回すことはせず、押すだけなので、左にあった方が親指で押せて楽です。

Zenwatch 3には心拍計が搭載されていませんが、Ticwatch Eには搭載されており、よりアクティビティ向けかなと思います。Zenwatch 3よりも軽く、バッテリーの持ちも長い気がします。ただし、調光センサーがないため、画面の明るさが自動的に調節されません。日中で、太陽の真下だと輝度最大でもちょっと見づらいです。この点はアクティビティ向けとしては残念だなと感じました。

Android wearを同期できない!

Android wearスマートフォンと同期しないとただの画面が光るリストバントです。

早速同期したいのですが、Android wear OSのバージョンにより、同期方法が異なります。2.0 では、Android wear 本体(以下、時計と書きます)の電源を入れ、言語を選択した後、スマートフォン側でAndroid wear アプリ(以下、アプリ)を起動してから、時計をBluetoothでペアリングします。
すると、時計側に「アップデートを確認しています」、スマートフォン側には「時計の詳細情報を取得しています」と表示されます。その後、しばし待つと時計側の表示が「スマートフォンで設定を続けてください」と切り替わります。少々待つとスマートフォン側でGoogleアカウントを時計へコピーする画面に遷移します。そうしたら、スマートフォン側でアプリのアクセス許可などをしていけば同期は終了します。同期が終わったら、時計側にアプリなどをインストールします。

そのはずなのですが、Ticwatchには「スマートフォンで設定を続けてください」が、スマートフォンのアプリには「時計の詳細情報を取得しています」と表示され続けたまま、何も起きません。スマートフォンに時間がかかりますと表示されてはいますが、流石に30分や1時間はかかりすぎでしょう。
しょうが無いので、時計のボタンを長押しし「設定」から「接続を解除してリセット」を実行。スマートフォン側はアプリを再インストールして、もう一度トライしましたが、「スマートフォンで設定を続けてください」から前に進みません。

原因が分からなかったので、Zenwatch 3の「接続を解除してリセット」し同期を試みたら、「スマートフォンで設定を続けてください」で止まってしまい、光るだけのリストバンドを二つ製造する羽目に。

日本語でググってもでてこない・・・・・・

光るリストバンドを両手にして、途方に暮れるわけにはいきません。
Zenwatch 3 も Ticwatch E も同様の症状なので、問題はスマートフォン側にあるでしょう。
「時計の詳細情報を取得しています」などでググっても明確な解決方法が見つかりませんでした。Android Ware 持ってる人少ないんだなぁと泣きたくなります。そこで、「continue setup on phone」などとググってみると、「Google開発者サービス」を再インストールすべしと書かれています。
そこで、「Google開発者サービス」を再インストールしてみると Zenwatch 3 と Ticwatch E 共に同期することができました。

手順を以下にまとめておきます。

  1. Android Ware を「接続を解除してリセット」し、工場出荷状態に。
  2. スマートフォンAndroid wear アプリをアンインストール。
  3. スマートフォンAndroid Ware のペアリングを解除。
  4. スマートフォンの「設定」から「アプリ」を開き、一覧から「Google開発者サービス」をタップ。
  5. Google開発者サービス」を「強制停止」し「無効」にしてアンインストール。
  6. Google Play ストア」を立ち上げ、再インストールを開始。
  7. スマートフォンAndroid wear アプリを再インストール。
  8. Android Wareを起動し、言語を選択した後、スマートフォンAndroid wear アプリから同期を開始。

諸悪の根源は「Google開発者サービス」

Zenwatch 3のOSが、Android Ware 1.5 から 2.0にアップグレードされた際に「Google開発者サービス」がおかしくなったのかなと。2.0にしてから電池の持ちが悪くなり、頻繁にBluetooth接続の要求が頻繁に来るようになったのも、この辺が原因なのかも。
というわけで、Android Wareの調子がおかしいときは「Google開発者サービス」を再インストールしてみるとよいかも?