kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

『Rによるやさしい統計学』書誌情報

R言語による統計学入門として、『Rによるやさしい統計学』が名著です。

その書誌情報です。

概要

Rによるやさしい統計学 | Ohmsha

著者山田 剛史 杉澤 武俊 村井 潤一郎 共著
定価2,916 円(本体2,700 円+税)
A5 420頁 2008/01発行
ISBN978-4-274-06710-5

主要目次

第Ⅰ部 基礎編
第1章 R と統計学
第2章 1 つの変数の記述統計
第3章 2 つの変数の記述統計
第4章 母集団と標本
第5章 統計的仮説検定
第6章 2 つの平均値を比較する
第7章 分散分析
第Ⅱ部 応用編
第8章 ベクトル・行列の基礎
第9章 データフレーム
第10章 外れ値が相関係数に及ぼす影響
第11章 統計解析で分かること・分からないこと
第12章 二項検定
第13章 プリ・ポストデザインデータの分析
第14章 質問紙尺度データの処理
第15章 回帰分析
第16章 因子分析
第17章 共分散構造分析
第18章 人工データの発生
第19章 検定の多重性と第1 種の誤りの確率
第20章 検定力分析によるサンプルサイズの決定
付録A R の情報源
付録B 練習問題解答
付録C FAQ

詳細目次

第I部 基礎編
第1章 R と統計学
1.1 Rって何だろう
1.2 なぜR を使うのか
1.2.1 他のソフトとの比較
1.2.2 R を使ってみよう
1.3 R を導入しよう
1.3.1 R のインストール手順(Windows)
1.3.2 R のインストール手順(Mac OS X)
1.4 R をさわってみよう
1.4.1 R の画面の様子
1.4.2 基本的な操作の概要
1.5 R をもっとさわってみよう
1.5.1 R を使った統計
1.5.2 同じことをExcel でやると
1.6 R の使い方のコツ
1.6.1 複数の値をまとめて扱う
1.6.2 外部データファイルを読み込んでみよう
1.6.3 関数を作ってみよう
1.6.4 他の人の作った関数を利用する
1.6.5 パッケージをインストールしてみよう
1.6.6 Rcmdr を使ってみる
1.7 この本のこれから
第2章 1 つの変数の記述統計
2.1 1 つの変数の要約
2.2 本書で用いるデータの説明
2.3 変数の種類
2.4 データの視覚的表現
2.5 平均とは
2.6 平均以外の代表値
2.7 散布度
2.8 分散、標準偏差とは
2.9 分散、標準偏差以外の散布度
2.10 標準化
2.11 偏差値
まとめ
練習問題
第3章 2 つの変数の記述統計
3.1 2 つの変数の関係
3.2 散布図
3.3 共分散
3.4 相関係数
3.5 クロス集計表
3.6 ファイ係数
まとめ.
練習問題
第4章 母集団と標本
4.1 母集団と標本
4.2 推測統計の分類
4.3 点推定
4.3.1 点推定の手順
4.3.2 推定量と推定値
4.3.3 標本抽出に伴う誤差
4.4 推定値がどれくらいあてになるのかを調べる方法
4.4.1 標本抽出の方法――単純無作為抽出
4.4.2 確率変数
4.4.3 確率分布
4.4.4 母集団分布
4.4.5 正規分布
4.4.6 正規分布について少し詳しく
4.4.7 正規母集団から単純無作為抽出を行う
4.5 標本分布
4.5.1 標本分布から何が分かるのか
4.5.2 標本分布を「経験的」に求める
4.5.3 正規母集団の母平均の推定
4.5.4 標本分布を求める
4.5.5 不偏性
4.5.6 標準誤差
4.6 標本平均以外の標本分布
4.6.1 標本分散と不偏分散の標本分布
4.6.2 中央値の標本分布
まとめ
練習問題
第5章 統計的仮説検定
5.1 統計的仮説検定の必要性
5.2 統計的仮説検定の手順と用語
5.2.1 帰無仮説と対立仮説
5.2.2 検定統計量
5.2.3 有意水準と棄却域
5.2.4 統計的仮説検定の結果の報告
5.2.5 p 値
5.2.6 第1 種の誤りと第2 種の誤り
5.2.7 検定力
5.3 標準正規分布を用いた検定(1 つの平均値の検定・母分散σ2 が既知)
5.4 t 分布を用いた検定(1 つの平均値の検定・母分散σ2 が未知)
5.5 相関係数の検定(無相関検定)
5.6 独立性の検定(カイ二乗検定)
5.7 サンプルサイズの検定結果への影響について
まとめ
練習問題
第6章 2 つの平均値を比較する
6.1 2 つの平均値を比較するケース
6.2 独立な2 群のt 検定
6.3 t 検定の前提条件
6.3.1 分散の等質性の検定
6.3.2 Welch の検定
6.4 対応のあるt 検定
まとめ
練習問題
第7章 分散分析
7.1 一元配置分散分析(対応なし)
7.1.1 一元配置分散分析(対応なし)を実行する
7.1.2 平方和の分解
7.1.3 多重比較(Tukey の方法)
7.2 一元配置分散分析(対応あり)
7.2.1 対応がないものと見なして分散分析をしてみる
7.2.2 一元配置分散分析(対応あり)を実行する
7.2.3 対応の有無による違い
7.2.4 平方和の分解と自由度の計算
7.3 二元配置分散分析(対応なし)
7.3.1 主効果と交互作用効果
7.3.2 二元配置分散分析(対応なし)を分析する
7.3.3 一元配置と見なして分散分析をしてみる
7.4 二元配置分散分析(2 要因とも対応あり)
7.5 二元配置分散分析(1 要因のみ対応あり)
まとめ
練習問題
第II部 応用編
第8章 ベクトル・行列の基礎
8.1 スカラーとベクトル
8.2 ベクトル
8.2.1 ベクトルを作るための関数
8.2.2 ベクトルの基本演算
8.2.3 ベクトルの要素を取り出す
8.3 行列.
8.3.1 行列の基本演算
8.3.2 特別な行列
8.3.3 行列の要素を取り出す
8.3.4 行列を使ってデータを扱う(第7 章を例として)
8.3.5 行列の演算(応用)
第9章 データフレーム
9.1 外部データファイルを読み込むには
9.2 第2章の分析
9.3 第3章の分析
9.4 第5章の分析
9.5 第6章の分析
9.6 第7章の分析
9.7 データフレームについて
9.7.1 data.frame 関数により、直接データフレームを作成する場合
9.7.2 すでにあるベクトルを合成してデータフレームを作成する場合
9.7.3 すでにある行列をデータフレームに変換する場合
9.7.4 外部データファイルを読み込んでデータフレームを作る場合
9.7.5 データフレームをデータエディタウィンドウで編集する
第10章 外れ値が相関係数に及ぼす影響
10.1 問題:動物の体重と脳の重さ
10.2 R で分析してみよう
第11章 統計解析で分かること・分からないこと
11.1 問題:子どものゲーム時間と親の認識
11.2 R で分析してみよう
11.2.1 問題(1)
11.2.2 問題(2)
11.2.3 問題(3)
第12章 二項検定
12.1 二項検定とは
12.2 問題:北海道日本ハムファイターズと東北楽天ゴールデンイーグルスはどちらが強い?
12.2.1 R で分析してみよう
12.3 問題:じゃんけんの結果を予測できるか? 
12.3.1 R で分析してみよう
第13章 プリ・ポストデザインデータの分析
13.1 プリ・ポストデザイン
13.2 R で分析してみよう
13.2.1 ポストテストの値を従属変数、プリテストの値を統制変数
(共変量)とした、群の効果に関する共分散分析
13.2.2 変化量について、t 検定によって群の効果を吟味
第14章 質問紙尺度データの処理
14.1 質問紙尺度について
14.2 R で分析してみよう
14.2.1 パッケージpsy を利用する
14.2.2 逆転項目の処理
14.2.3 尺度得点の計算
14.2.4 α 係数を求める
第15章 回帰分析
15.1 回帰分析とは
15.2 R で分析してみよう
第16章 因子分析
16.1 因子分析とは
16.2 R で分析してみよう
第17章 共分散構造分析
17.1 sem パッケージ
17.2 sem パッケージを利用した共分散構造分析
17.2.1 相関係数行列の入力
17.2.2 測定方程式と構造方程式の記述
17.2.3 共分散構造分析の解
第18章 人工データの発生
18.1 人工データを使うと
18.2 どのような人工データを発生させるか.
18.3 母集団を指定する
18.3.1 1 変数の場合
18.3.2 多変量の場合
18.4 特定の統計モデルに基づいたデータの発生
18.4.1 回帰分析モデル
18.4.2 因子分析モデル
18.5 標本統計量を特定の値にする
18.5.1 データの平均と標準偏差を特定の値にする
18.5.2 データの標本相関係数を任意の値にする
18.6 再現性のある人工データを発生させる
第19章 検定の多重性と第1 種の誤りの確率
19.1 検定の多重性の問題
19.2 プログラムの全体的なイメージを考える
19.3 プログラムの作成
第20章 検定力分析によるサンプルサイズの決定
20.1 検定力
20.2 検定力を求めるシミュレーション
20.2.1 独立な2 群のt 検定の検定力
20.2.2 対立仮説のもとでの検定統計量の標本分布
20.3 検定力分析でサンプルサイズを決める
20.3.1 標準の関数を使う
20.3.2 pwr パッケージを使う
20.3.3 t 検定のサンプルサイズを決める
20.3.4 cohen.ES 関数で効果の大きさの値を求める
20.3.5 無相関検定のサンプルサイズを決める
20.3.6 独立性の検定(カイ二乗検定)のサンプルサイズを決める
20.3.7 一元配置分散分析のサンプルサイズを決める
付録 A R の情報源
書籍
サイト
その他
引用文献
付録 B 練習問題解答
第2章
第3章
第4章
第5章
第6章
第7章
付録 C FAQ
索 引

非常に分かりやすいRによる統計入門書です。 おすすめです。

1章 ニューラルネットワークの復習 / 1.1 数学とPythonの復習 |『ゼロから作るDeep Learning2自然言語処理編』

f:id:kaeken:20181001221520p:plain

1章 ニューラルネットワークの復習

まずはニューラルネットワークを復習する章なので、復習がてらコード部分を写経。

1.1 数学とPythonの復習

1.1.1 ベクトルと行列

>>> import numpy as np # numpyインポート
>>> x = np.array([1,2,3]) # np.array()メソッドで配列生成
>>> x.__class__ #クラス名表示
<class 'numpy.ndarray'> # 多次元配列用クラスndarray
>>> x.shape # 多次元配列の形状を示すインスタンス変数shape
(3,) # 要素数3 
>>> x.ndim # 次元数を示すインスタンス変数ndim
1 #次元数1

>>> W = np.array([[1,2,3], [4,5,6]])
>>> W.shape
(2, 3) #2行3列
>>> W.ndim
2 #次元数2

1.1.2 行列の要素ごとの演算

>>> W = np.array([[1,2,3], [4,5,6]])
>>> X = np.array([[0,1,2], [3,4,5]])
>>> W + X # 和
array([[ 1,  3,  5],
       [ 7,  9, 11]])
>>> W * X # 積
array([[ 0,  2,  6],
       [12, 20, 30]])

1.1.3 ブロードキャスト

形状の異なる配列同士の演算

>>> A = np.array([[1,2], [3,4]])
>>> A * 10 # 10倍
array([[10, 20],
       [30, 40]])
>>>
>>> A = np.array([[1,2], [3,4]])
>>> b = np.array([10,20])
>>> A * b # 2次元配列(2,2), 1次元配列(1,2)の演算
array([[10, 40],
       [30, 80]])

1.1.4 ベクトルの内積と行列の積

# ベクトルの内積
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.dot(a,b)
32

# 行列の積
>>> A = np.array([[1,2], [3,4]])
>>> B = np.array([[5,6], [7,8]])
>>> np.dot(A,B)
array([[19, 22],
       [43, 50]])

1.1.5 行列の形状チェック

行列の積は、対応する次元の要素数を一致させる必要がある

# 3行2列と、2行4列の積は、3行4列になる
>>> C = np.array([[1,2], [3,4], [5,6]])
>>> D = np.array([[1,2,3,4], [5,6,7,8]])
>>> C.shape
(3, 2)
>>> D.shape
(2, 4)
>>> np.dot(C,D)
array([[11, 14, 17, 20],
       [23, 30, 37, 44],
       [35, 46, 57, 68]])

# 2行4列と、3行2列の積は、演算不可
>>> np.dot(D,C)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (2,4) and (3,2) not aligned: 4 (dim 1) != 3 (dim 0)

NumPyの練習は、以下が使える。

rougier/numpy-100: 100 numpy exercises (100% complete)

『ゼロから作るDeep Learning2自然言語処理編』学習開始

f:id:kaeken:20181001221520p:plain

『ゼロから作るDeep Learning自然言語処理編』学習開始。

『ゼロから作るDeep Learning』の続編で、自然言語処理・時系列データがメインテーマ。

機械学習・深層学習の分野は、2年前に『ゼロから作るDeep Learning』を学習したときから比べて、ものすごい勢いで発展してきており、すべてを追うことはかなり困難。

また、基礎ができていないと、多数の事象をそれぞれ個別に学ぶことになり、効率が悪い。

目先のビジネスは最低限にして、倦まず弛まず、基礎を淡々と積み上げていく。

以下、リソースまとめ。

GitHubリポジトリoreilly-japan/deep-learning-from-scratch-2: 『ゼロから作る Deep Learning ❷』のリポジトリ

git clone https://github.com/oreilly-japan/deep-learning-from-scratch-2.git

正誤表 errata · oreilly-japan/deep-learning-from-scratch-2 Wiki

以下『ゼロから作るDeep Learning自然言語処理編』目次。

まえがき

1章 ニューラルネットワークの復習
    1.1 数学とPythonの復習
        1.1.1 ベクトルと行列
        1.1.2 行列の要素ごとの演算
        1.1.3 ブロードキャスト
        1.1.4 ベクトルの内積と行列の積
        1.1.5 行列の形状チェック
    1.2 ニューラルネットワークの推論
        1.2.1 ニューラルネットワークの推論の全体図
        1.2.2 レイヤとしてのクラス化と順伝播の実装
    1.3 ニューラルネットワークの学習
        1.3.1 損失関数
        1.3.2 微分と勾配
        1.3.3 チェインルール
        1.3.4 計算グラフ
        1.3.5 勾配の導出と逆伝播の実装
        1.3.6 重みの更新
    1.4 ニューラルネットワークで問題を解く
        1.4.1 スパイラル・データセット
        1.4.2 ニューラルネットワークの実装
        1.4.3 学習用のソースコード
        1.4.4 Trainerクラス
    1.5 計算の高速化
        1.5.1 ビット精度
        1.5.2 GPU(CuPy)
    1.6 まとめ

2章 自然言語と単語の分散表現
    2.1 自然言語処理とは
        2.1.1 単語の意味
    2.2 シソーラス
        2.2.1 WordNet
        2.2.2 シソーラスの問題点
    2.3 カウントベースの手法
        2.3.1 Pythonによるコーパスの下準備
        2.3.2 単語の分散表現
        2.3.3 分布仮説
        2.3.4 共起行列
        2.3.5 ベクトル間の類似度
        2.3.6 類似単語のランキング表示
    2.4 カウントベースの手法の改善
        2.4.1 相互情報量
        2.4.2 次元削減
        2.4.3 SVDによる次元削減
        2.4.4 PTBデータセット
        2.4.5 PTBデータセットでの評価
    2.5 まとめ

3章 word2vec
    3.1 推論ベースの手法とニューラルネットワーク
        3.1.1 カウントベースの手法の問題点
        3.1.2 推論ベースの手法の概要
        3.1.3 ニューラルネットワークにおける単語の処理方法
    3.2 シンプルなword2vec
        3.2.1 CBOWモデルの推論処理
        3.2.2 CBOWモデルの学習
        3.2.3 word2vecの重みと分散表現
    3.3 学習データの準備
        3.3.1 コンテキストとターゲット
        3.3.2 one-hot表現への変換
    3.4 CBOWモデルの実装
        3.4.1 学習コードの実装
    3.5 word2vecに関する補足
        3.5.1 CBOWモデルと確率
        3.5.2 skip-gramモデル
        3.5.3 カウントベース v.s. 推論ベース
    3.6 まとめ

4章 word2vecの高速化
    4.1 word2vecの改良①
        4.1.1 Embeddingレイヤ
        4.1.2 Embeddingレイヤの実装
    4.2 word2vecの改良②
        4.2.1 中間層以降の計算の問題点
        4.2.2 多値分類から二値分類へ
        4.2.3 シグモイド関数と交差エントロピー誤差
        4.2.4 多値分類から二値分類へ(実装編)
        4.2.5 Negative Sampling
        4.2.6 Negative Samplingのサンプリング手法
        4.2.7 Negative Samplingの実装
    4.3 改良版word2vecの学習
        4.3.1 CBOWモデルの実装
        4.3.2 CBOWモデルの学習コード
        4.3.3 CBOWモデルの評価
    4.4 word2vecに関する残りのテーマ
        4.4.1 word2vecを使ったアプリケーションの例
        4.4.2 単語ベクトルの評価方法
    4.5 まとめ

5章 リカレントニューラルネットワーク(RNN)
    5.1 確率と言語モデル
        5.1.1 word2vecを確率の視点から眺める
        5.1.2 言語モデル
        5.1.3 CBOWモデルを言語モデルに?
    5.2 RNNとは
        5.2.1 循環するニューラルネットワーク
        5.2.2 ループの展開
        5.2.3 Backpropagation Through Time
        5.2.4 Truncated BPTT
        5.2.5 Truncated BPTTのミニバッチ学習
    5.3 RNNの実装
        5.3.1 RNNレイヤの実装
        5.3.2 Time RNNレイヤの実装
    5.4 時系列データを扱うレイヤの実装
        5.4.1 RNNLMの全体図
        5.4.2 Timeレイヤの実装
    5.5 RNNLMの学習と評価
        5.5.1 RNNLMの実装
        5.5.2 言語モデルの評価
        5.5.3 RNNLMの学習コード
        5.5.4 RNNLMのTrainerクラス
    5.6 まとめ

6章 ゲート付きRNN
    6.1 RNNの問題点
        6.1.1 RNNの復習
        6.1.2 勾配消失もしくは勾配爆発
        6.1.3 勾配消失もしくは勾配爆発の原因
        6.1.4 勾配爆発への対策
    6.2 勾配消失とLSTM
        6.2.1 LSTMのインタフェース
        6.2.2 LSTMレイヤの組み立て
        6.2.3 outputゲート
        6.2.4 forgetゲート
        6.2.5 新しい記憶セル
        6.2.6 inputゲート
        6.2.7 LSTMの勾配の流れ
    6.3 LSTMの実装
        6.3.1 TimeLSTMの実装
    6.4 LSTMを使った言語モデル
    6.5 RNNLMのさらなる改善
        6.5.1 LSTMレイヤの多層化
        6.5.2 Dropoutによる過学習の抑制
        6.5.3 重み共有
        6.5.4 より良いRNNLMの実装
        6.5.5 最先端の研究へ
    6.6 まとめ

7章 RNNによる文章生成
    7.1 言語モデルを使った文章生成
        7.1.1 RNNによる文章生成の手順
        7.1.2 文章生成の実装
        7.1.3 さらに良い文章へ
    7.2 seq2seq
        7.2.1 seq2seqの原理
        7.2.2 時系列データ変換用のトイ・プロブレム
        7.2.3 可変長の時系列データ
        7.2.4 足し算データセット
    7.3 seq2seqの実装
        7.3.1 Encoderクラス
        7.3.2 Decoderクラス
        7.3.3 Seq2seqクラス
        7.3.4 seq2seqの評価
    7.4 seq2seqの改良
        7.4.1 入力データの反転(Reverse)
        7.4.2 覗き見(Peeky)
    7.5 seq2seqを用いたアプリケーション
        7.5.1 チャットボット
        7.5.2 アルゴリズムの学習
        7.5.3 イメージキャプション
    7.6 まとめ

8章 Attention
    8.1 Attentionの仕組み
        8.1.1 seq2seqの問題点
        8.1.2 Encoderの改良
        8.1.3 Decoderの改良①
        8.1.4 Decoderの改良②
        8.1.5 Decoderの改良③
    8.2 Attention付きseq2seqの実装
        8.2.1 Encoderの実装
        8.2.2 Decoderの実装
        8.2.3 seq2seqの実装
    8.3 Attentionの評価
        8.3.1 日付フォーマットの変換問題
        8.3.2 Attention付きseq2seqの学習
        8.3.3 Attentionの可視化
    8.4 Attentionに関する残りのテーマ
        8.4.1 双方向RNN
        8.4.2 Attentionレイヤの使用方法
        8.4.3 seq2seqの深層化とskipコネクション
    8.5 Attentionの応用
        8.5.1 Google Neural Machine Translation(GNMT)
        8.5.2 Transformer
        8.5.3 Neural Turing Machine(NTM)
    8.6 まとめ

付録A sigmoid関数とtanh関数の微分
    A.1 sigmoid関数
    A.2 tanh関数
    A.3 まとめ

付録B WordNetを動かす
    B.1 NLTKのインストール
    B.2 WordNetで同義語を得る
    B.3 WordNetと単語ネットワーク
    B.4 WordNetによる意味の類似度

付録C GRU
    C.1 GRUのインタフェース
    C.2 GRUの計算グラフ

おわりに
参考文献
索引

手を動かしながら、コツコツ進める。

(2018-02-04)気になるAI/ML/DL/DSネタ:2018年度前期東大AI講座、脳内イメージ映像化、GoogleドライブOCR、など

実データで学ぶ人工知能講座(AIデータフロンティアコース)平成30年度前期募集のご案内 講座について – 2018年度前期講座 – Learn.AI

東京大学では、大阪大学とともに、国立研究開発法人新エネルギー・産業技術総合開発機構NEDO)の委託を受け、人工知能(AI)分野の人材不足に対応するための即戦力人材の育成講座(AIデータフロンティアコース)を開講します。


何を考えているのかな? 人間の脳内イメージを映像化するAI | ギズモード・ジャパン

fMRIという手法で脳内の血流動態反応を視覚化し、そこから得られた数々の反応情報をAIに学習させているそう。この反応ならこんな絵! という学習を重ねていくことで、映像を再構築できるようになったのだとか。


Google Driveで画像を開いたと思ったら文字が全て書き起こされているという事態に衝撃の人々「マジかよ!」「あ!ホントだ」 - Togetter

1:文字起こししたい画像をGoogleドライブに保存
2:Googleドライブで保存した画像を右クリック
3:Googleドキュメントを選択して開く
4:画像が文字起こしされて展開される


データ分析は「強者の武器」、駆け出しのうちはデータが貯まるまでの間に他にやるべきことがある - 六本木で働くデータサイエンティストのブログ

空前の人工知能ブームに伴ってデータサイエンティストブームが再燃するなど「ビッグデータ」や「データ活用」が改めて脚光を浴びつつある昨今ですが、そういうご時世だからこそ地に足のついたデータ活用戦略をとるべきだ、というのが個人的な意見です。


類似文字列検索ライブラリResemblaを公開しました : LINE Engineering Blog

Resemblaは、このように複雑で多岐にわたる問題に取り組むため、以下の2点に主眼を置いて開発している類似文字列検索ライブラリです。 文字列の性質に合わせた尺度の選択と組み合わせによる品質の改善 候補の絞り込みとコーパスの前処理による速度の向上


Python/scikit-learn/分類精度の評価指標について

f:id:kaeken:20180203200300p:plain


前回は、機械学習のクラス分類精度を評価するために、まず混同行列 (Confusion matrix)についてまとめました。

Python/scikit-learn/分類精度を評価する際に使われる混同行列 (Confusion matrix)について - データサイエンティストへの修行日記

今回は、混同行列の値TP,FP,FN,TNを使った指標についてまとめていきたいと思います。

あらためて、混同行列のテーブルを見ていきます。

f:id:kaeken:20180202131648p:plain

前回、以下のようにパターンが存在することを示しました。

パターン1:正答と予測して、実際正答だった場合
パターン2:正答と予測して、実際誤答だった場合
パターン3:誤答と予測して、実際正答だった場合
パターン4:誤答と予測して、実際誤答だった場合

混同行列(Confusion matrix)では、それぞれのパターンを、以下のように表現しています。

パターン1:真陽性: TP (True-Positive)
パターン2:偽陽性: FP (False-Positive)
パターン3:偽陰性: FN (False-Negative)
パターン4:真陰性: TN (True-Negative)

それぞれの頭文字の意味は、以下の通りです。

T(True, 真):予測と実際が一致している状態
F(False, 偽):予測と実際が一致していない状態
P(Positive, 陽):正答が予測された状態
N(Negative, 陰):誤答が予測された状態

これらのパターンを用いて、精度を評価するための指標があります。

Confusion matrix - Wikipedia

今回は、主に4つの以下をとりあげます。

  • 正解率 (Accuracy)
  • 適合率 (Precision) ※精度とも言う
  • 検出率 (Recall)
  • F値 (f-score)

それぞれの指標の定義は、以下の通りです。

正解率 (Accuracy) = TP+TN / 全体

→全体のうち、予測通り正誤分類できた割合

真陽性: TP (True-Positive)
真陰性: TN (True-Negative)


適合率 (Precision) = TP / (TP + FP)

→予測が正答だった中で、予測通り正答分類できた割合

真陽性: TP (True-Positive)
偽陽性: FP (False-Positive)


検出率 (Recall) = TP / (TP + FN)

→実際に正答だった中で、予測も正答だった割合

真陽性: TP (True-Positive)
偽陰性: FN (False-Negative)


F値 (f-score) = 適合率と検出率の調和平均

→ 適合率と検出率の調和平均を求めて、極端に振れないようにする値です。
F1 score - Wikipedia


以上が主な分類精度の評価指標となります。

それぞれの実装は、scikit-learnでメソッドになっていますので、以下で実装例が確認できます。

  • 正解率 (Accuracy) : sklearn.metrics.accuracy_score
  • 適合率 (Precision) : sklearn.metrics.precision_score
  • 検出率 (Recall) : sklearn.metrics.recall_score
  • F値 (f-score) : sklearn.metrics.f1_score

API Reference — scikit-learn 0.19.1 documentation

Classification metrics


また、上記のうち、適合率・検出率・F値をまとめて表示する
sklearn.metrics.classification_report
が定義されていますので、便利です。

#sklearn.metrics.classification_report
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
実行結果
             precision    recall  f1-score   support

    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3

avg / total       0.70      0.60      0.61         5

以上で、主な分類精度の評価指標についてまとめました。

機械学習では、必ず精度を評価しながら、過学習に陥らず、精度を上げていくことが重要になります。

(2018-02-03)気になるML/DL/DSネタ:教えない先生、Custom Vision Service、『仕事ではじめる機械学習』著者座談会

未来を変える技術20 - AI活用で「教えない先生」が登場、1800億円に膨らむ教育×IT市場:ITpro

同社は2014年から東京大学の松尾豊特任准教授と共同で、生徒が動画のどこで躓いたかやコンテンツ間の関連性を分析。先に何を学べば躓かないのかや何を復習すれば知識が定着するのかといった学び方が分かってきた。これにより百人百様の学習プログラムが提供できるようになった。


MicrosoftのAIをカスタマイズしてハンバーガーとチーズバーガーを区別させよう:特集:AIをアプリに組み込もう - @IT

Microsoftが提供するCustom Vision Serviceを取り上げる。これは幾つかの画像をアップロードして、学習させることで、Microsoftが提供している画像認識技術をプログラマーが独自にカスタマイズできるというサービスだ。


【AI people:vol.7】『仕事ではじめる機械学習』著者座談会:前編 きっかけは「没原稿の供養プロジェクト」だった | blog - 人工知能(AI)/機械学習に特化した勉強会コミュニティ【Team AI】

今回インタビューに参加してくださったのは、有賀康顕(ありが・みちあき)氏(@chezou)と中山心太(なかやま・しんた)氏(@tokoroten)。1時間以上に渡り、出版裏話からエンジニアへのアドバイスまで広く伺いました。


国立がん研究センター公表の「がん5年生存率データ」から年齢・進行度などの影響を取り除いたリアルなデータを作成した強者が現れる - GIGAZINE

統計モデリングを用いて各因子の影響度を排除した状態での5年後生存率を調べて病院の善し悪しを論じようというのがStatModelingさんの狙いです。なお、StatModelingさんの出した結果も仮定に基づく推定結果であり、真実と断定しているわけではない点には注意が必要です。


(PDF)人工知能とデータサイエンティストの役回り

樋口知之 (情報・システム研究機構 統計数理研究所


Python/scikit-learn/分類精度を評価する際に使われる混同行列 (Confusion matrix)について

f:id:kaeken:20180202131648p:plain

機械学習のクラス分類精度を評価するために、混同行列 (Confusion matrix)が用いられます。

Confusion matrix - Wikipedia

In the field of machine learning and specifically the problem of statistical classification, a confusion matrix, also known as an error matrix,[4] is a specific table layout that allows visualization of the performance of an algorithm, typically a supervised learning one (in unsupervised learning it is usually called a matching matrix).


何かを予測した場合の精度を評価するには、予測した結果と、実際の結果と比較します。

また、結果には、正しい結果と誤った結果があります。

混同行列 (Confusion matrix)では、2つの軸を設定します。

予実の軸:予測 or 実際
正誤の軸:正答 or 誤答

予実と正誤それぞれの状態をかけ合わせると、以下の4通りになります。

パターン1:正答と予測して、実際正答だった場合
パターン2:正答と予測して、実際誤答だった場合
パターン3:誤答と予測して、実際正答だった場合
パターン4:誤答と予測して、実際誤答だった場合

混同行列(Confusion matrix)では、それぞれのパターンを、以下のように表現しています。

パターン1:真陽性: TP (True-Positive)
パターン2:偽陽性: FP (False-Positive)
パターン3:偽陰性: FN (False-Negative)
パターン4:真陰性: TN (True-Negative)

それぞれの頭文字の意味は、以下の通りです。

T(True, 真):予測と実際が一致している状態
F(False, 偽):予測と実際が一致していない状態
P(Positive, 陽):正答が予測された状態
N(Negative, 陰):誤答が予測された状態

TP,FP,FN,TNそれぞれのパターンを表にすれば、以下のようになります。

f:id:kaeken:20180202131648p:plain

縦軸:予測、横軸:実際

では、scikit-learnで混同行列 (Confusion matrix)を使ってみますと、以下のようなコマンドになります。

from sklearn.metrics import confusion_matrix
pred_result = [1, 1, 1, 0]#予測の結果
true_result = [0, 1, 0, 1]#実際の結果
#予実とも1は、1個なのでTP:1
#予測1で実際0なのは、2個なのでFP:2
#予測0で実際1なのは、1個なのでFN:1
#予実とも0は、0個なのでTN:0

tn, fp, fn, tp = confusion_matrix(true_result, pred_result).ravel()#混同行列で解きほぐした結果を取得
(tp, fp, fn, tn)#正正,正誤,誤正,誤誤に順番を整理して表示
実行結果
(1, 2, 1, 0)

他のパラメータは以下に詳述されています。

sklearn.metrics.confusion_matrix — scikit-learn 0.19.1 documentation

sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)


なお、

上記は、正答/誤答といった二値分類でしたが、多値分類でも可能です。

また、縦軸:予測、横軸:実際を逆にして、縦軸:実際、横軸:予測にする表現方法もあります。

それでは、

この混同行列の値TP,FP,FN,TNを使った指標については、後日まとめていきたいと思います。

(2018-02-02)気になるAI/ML/DSニュース・記事・サービスなど

米国500社の財務諸表ビッグデータ分析で見えた7つの事実 - データで見る世界

バイアスを取り除く方法はただ一つ。データ分析です。データは嘘をつきません。賢そうな人の意見を鵜呑みにするのではなく、自分で生のデータを分析すれば、事実にたどり着けます。


OpenML Guide

OpenML aims to make machine learning and data analysis simple, accessible, collaborative and open, automating many manual tasks to create a frictionless working and learning environment.


テキスト解析:自然言語理解 - Yahoo!デベロッパーネットワーク

自然言語理解Web APIを利用してアプリケーションを開発 Yahoo!音声アシストでも使われている自然言語理解Web APIを利用して、アプリケーションを作成できます。


アマゾンの「レジなしコンビニ」で見えた究極のデータビジネス

「アマゾンは市場を独占することよりも、データを得ることのほうが価値を持つと知っているからだ。膨大な顧客の購買データがあれば、様々な商品のレコメンドに活用可能だ。」


"All models are wrong; but some are useful"(全てのモデルは間違っている、だが中には役立つものもある)という格言 - 六本木で働くデータサイエンティストのブログ

統計学機械学習の世界ではよく引用される"All models are wrong; but some are useful"(全てのモデルは間違っている、だが中には役立つものもある)という格言ですが、2013年に亡くなった統計学の大家George E. P. Boxの言葉だと伝わっています」


世界最大の「アルゴリズム市場」を作ったエンジニア2名の奮闘 | Forbes JAPAN(フォーブス ジャパン)

「6万を超える開発者が利用する世界最大のアルゴリズムマーケットプレイス「Algorithmia(アルゴリズミア)」は、コミュニティが作成した機械学習モデルを使ってアプリケーションの開発を容易にするサービスを提供している。現在、4500以上のアルゴリズムが登録されているが、その多くは機械学習関連だ。」


静かに広がる「アンチ深層学習」「アンチAI」 - 日経トレンディネット

AIという言葉が、意味が不明瞭のまま使われる「バズワード」と化し、猫も杓子もなんにでも使われていることへの反感ではなかろうかと思う


【実録PoC】毎月数百件以上の文書スキャン業務はロボットで置き換え可能なのか:RPA導入ガイド(5) - @IT

今回は、RPAの基本となる、RDA(Robotic Desktop Automation)のPoCについて共有します。覚えていただきたいキーワードは人手からロボットへの「置き換え」です。「ロボットで置き換え可能かどうか」がPoCの第一目的となるからです。


Python/pandas公式チートシート解説:前処理のゴールとなるTidy Dataとは

f:id:kaeken:20180202085619p:plain

pandas githubのドキュメントに公式のチートシートがアップされています。 github.com

このpandasチートシートには、重要な概念やコマンド実行方法が整理されていますので、項目をひとつずつ解説していきます。

なお、このチートシートは、もともとR言語チートシートにインスパイアされたものらしいです。

今回は、pandasですが、今後、R言語でも同様に解説していく予定です。

それでは、まずはじめに、Tidy Dataについて整理します。

Tidy Dataとは

Wikipediaでは以下のように解説されています。

Tidy data - Wikipedia

Tidy data is the data obtained as a result of a process called data tidying. It is one of the important cleaning processes during big data processing and is a recognized step in the practice of data science. The tidy data sets have structure and working with them are easy, they’re easy to manipulate, model and visualize. Tidy data sets main concept is to arrange data in a way that each variable is a column and each observation (or case) is a row.


日本語訳では「整然データ」と呼ばれ、以下の4つの特徴を持ちます。

整然データとは何か|Colorless Green Ideas

整然データとは、1) 個々の変数が1つの列をなす、2) 個々の観測が1つの行をなす、3) 個々の観測の構成単位の類型が1つの表をなす、4) 個々の値が1つのセルをなす、という4つの条件を満たした表型のデータのことであり、構造と意味が合致するという特徴を持つ。R言語などを用いたデータ分析の際には非常に有用な概念である。


Tidy Dataの概念は、リレーショナルデータベースの正規化と類似しているので、すんなり理解できました。

一方、以下のように、上記の特徴に反するデータは、整然データTidy Dataではなく、雑然データ(messy data)と呼ばれます。

  • 個々の変数 (variable) が1つの列 (column) をなす
    →1つの変数(種類)が複数の列に分かれていたり、複数の変数(種類)が1つの列に入っていれば、整然データTidy Dataではない。

  • 個々の観測 (observation) が1つの行 (row) をなす
    →1つのデータが複数の行/レコードに分かれたり、複数のデータが1つの行/レコードに入っていれば、整然データTidy Dataではない。

  • 個々の観測の構成単位の類型 (type of observational unit) が1つの表 (table) をなす
    →ひとつの種類のデータセットが複数のテーブルに分かれていたり、複数の種類のデータセットがひとつのテーブルに入っていれば、整然データTidy Dataではない。

  • 個々の値 (value) が1つのセル (cell) をなす
    →ひとつの値が複数のセルに分かれていたり、複数の値が一つのセルに入っていれば、整然データTidy Dataではない。

人間にとってわかりやすい表だとしても、データ分析する場合は、上記のようなTidy Dataに変換する必要があります。

現場では、人間が見て分かりやすい表にされたデータを使って機械学習させることが多いので、整然データTidy Dataへの変換は、必須と言えます。

次回から、Tidy Dataにするための道具であるpandasのチートシート解説をしていきます。

目次

  • Tidy Data (いまここ)
  • Syntax
  • Reshaping Data
  • Subset Observations(Rows)
  • Subset Variables(Columns)
  • Summarize Data
  • Group Data
  • Handling Missing Data
  • Make New Columns
  • Combine Data Sets
  • Windows
  • Plotting

Python/pandas エンコードされたone-hotデータをデコードする方法

f:id:kaeken:20180201203956p:plain

機械学習の学習用データでよく使われるone-hotエンコーディングされたデータがあります。

f:id:kaeken:20180201202817p:plain

one-hotエンコーディング処理は、さまざまなライブラリで実装されています。

sklearn.preprocessing.OneHotEncoder — scikit-learn 0.19.1 documentation http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

ただ、one-hotデコーディング、 つまり、もとのデータに戻す処理が見つかりませんでした。

f:id:kaeken:20180201202951p:plain

そこで、 以下のようにpandasのデータフレームを使って、one-hotデコーディングする処理を作成してみました。

def onehot_decoder(df):
    colname_list = []
    for index, row in df.iterrows():#各行を取得
        for k,v in enumerate(row):#各列の値を取得
            if int(v) == 1:#ワンホットになっている列のカラム名を取得
                colname_list.append(df.columns[k])
                break

    #デコード済みリストを新規列として追加
    df_add = pd.DataFrame(colname_list,columns=['decoded'])
    return df_add

res = onehot_decoder(df_sample)

もう少し簡潔に書けるとは思いますが、わかりやすさのため、このままにしておきます。

前処理方法は、データによって多数のパターンがあり、 scikit-learnのpreprocessingモジュールでさまざまなものが作られています。

API Reference — scikit-learn 0.19.1 documentation http://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing

preprocessing.Binarizer([threshold, copy])   Binarize data (set feature values to 0 or 1) according to a threshold
preprocessing.FunctionTransformer([func, …])  Constructs a transformer from an arbitrary callable.
preprocessing.Imputer([missing_values, …])    Imputation transformer for completing missing values.
preprocessing.KernelCenterer    Center a kernel matrix
preprocessing.LabelBinarizer([neg_label, …])  Binarize labels in a one-vs-all fashion
preprocessing.LabelEncoder  Encode labels with value between 0 and n_classes-1.
preprocessing.MultiLabelBinarizer([classes, …])   Transform between iterable of iterables and a multilabel format
preprocessing.MaxAbsScaler([copy])  Scale each feature by its maximum absolute value.
preprocessing.MinMaxScaler([feature_range, copy])   Transforms features by scaling each feature to a given range.
preprocessing.Normalizer([norm, copy])  Normalize samples individually to unit norm.
preprocessing.OneHotEncoder([n_values, …])    Encode categorical integer features using a one-hot aka one-of-K scheme.
preprocessing.PolynomialFeatures([degree, …]) Generate polynomial and interaction features.
preprocessing.QuantileTransformer([…])    Transform features using quantiles information.
preprocessing.RobustScaler([with_centering, …])   Scale features using statistics that are robust to outliers.
preprocessing.StandardScaler([copy, …])   Standardize features by removing the mean and scaling to unit variance
preprocessing.add_dummy_feature(X[, value]) Augment dataset with an additional dummy feature.
preprocessing.binarize(X[, threshold, copy])    Boolean thresholding of array-like or scipy.sparse matrix
preprocessing.label_binarize(y, classes[, …]) Binarize labels in a one-vs-all fashion
preprocessing.maxabs_scale(X[, axis, copy]) Scale each feature to the [-1, 1] range without breaking the sparsity.
preprocessing.minmax_scale(X[, …])    Transforms features by scaling each feature to a given range.
preprocessing.normalize(X[, norm, axis, …])   Scale input vectors individually to unit norm (vector length).
preprocessing.quantile_transform(X[, axis, …])    Transform features using quantiles information.
preprocessing.robust_scale(X[, axis, …])  Standardize a dataset along any axis
preprocessing.scale(X[, axis, with_mean, …])  Standardize a dataset along any axis

上記も後日紹介していきます。

気になったAI/ML/DSニュース・サービスなど(2018-02-01)

Googleオープンソース機械学習ライブラリの最新版「TensorFlow 1.5」を発表:使い勝手やモバイル対応、GPUサポートが向上 - @IT http://www.atmarkit.co.jp/ait/articles/1801/30/news038.html


24研究室と1日で会える!人工知能・IoT・ビッグデータ分野での産学連携マッチングフェア | 人工知能ニュースメディア AINOW http://ainow.ai/2018/01/31/132591/


イー・ガーディアンが動画音声のテキスト化によるキーワード検知「TextVoice」展開 | Web担当者Forum https://webtan.impress.co.jp/n/2018/01/31/28178


東京大学の松尾研究室が無料公開している「Deep Learning基礎講座演習コンテンツ」の自主学習方法 - karaage. [からあげ] http://karaage.hatenadiary.jp/entry/2018/01/31/073000


AIの権威ヌグ氏、AI開発ファンド設立 ソフトバンクなど支援  :日本経済新聞 https://www.nikkei.com/article/DGXMZO26353570R30C18A1000000/


Memory AI – Fully Automatic Time Tracking Powered by Deep Learning - Timely https://timelyapp.com/memory-ai?ref=producthunt


スタンフォード大学が患者の余命を予測する人工知能システムを開発 | ワールド | 最新記事 | ニューズウィーク日本版 オフィシャルサイト https://www.newsweekjapan.jp/stories/world/2018/01/post-9418.php

Python/pandasでグルーピングした複数行をカンマ区切りの一行にする方法

f:id:kaeken:20180131225205p:plain

Python/pandasを使って、以下のようにグルーピングした複数行を一行にする方法について解説します。

before

 col1  col2
0     1  hoge
1     2  fuga
2     3  piyo
3     1   foo
4     2   bar
5     3   baz
after:col1でグルーピングした上で、col2を一行に集約

col1
1    hoge,foo
2    fuga,bar
3    piyo,baz

まず、以下のようなデータフレームを準備します。

import pandas as pd

df = pd.DataFrame(
    {"col1":[1,2,3,1,2,3], "col2":["hoge","fuga","piyo","foo","bar","baz"]},
    )
print(df)

次に、データフレームをgroupbyでグルーピングします。

そして、apply()で自作関数を実行しますが、その際に、無名関数lambdaを使えば、各行に対して同じ処理を適用します。

自作処理は、指定文字で結合するjoin()を使って、カンマ区切りにしています。

df = df.groupby('col1').col2.apply(lambda s : ','.join(s))
print(df)

lambda無名関数は、非常に便利で記述がすっきりしますので、おすすめです。

以上です。参考まで。


pandas.DataFrame.groupby — pandas 0.22.0 documentation https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html


pandas.DataFrame.apply — pandas 0.22.0 documentation https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html


『ゼロから作るDeep Learning』数学用語一覧

f:id:kaeken:20171208014108p:plain

『ゼロから作るDeep Learning』に出てくる数学用語について調べていく。

ただ、定義だけ追っていても意味が分からないので、

実際の使われ方については、高校レベルの数学を別途復習が必要。

では、以下数学用語を列挙していく。

線形とは

https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%80%A7

線型性(せんけいせい、英語: linearity)あるいは線型、線形、線状、リニア(せんけい、英語: linear、ラテン語: linearis)とは、直線そのもの、または直線のようにまっすぐな図形やそれに似た性質をもつ対象および、そのような性質を保つ変換などを指して用いられている術語である[1]。対義語は非線型性(英語:Non-Linearity)である。

シグモイド関数について。 シグモイド関数 - Wikipedia

シグモイド関数(シグモイドかんすう、英: sigmoid function)は、 f:id:kaeken:20171208192612p:plain で表される実関数である。

なお、a をゲイン (gain) と呼ぶ。

狭義には、

ゲインが1の標準シグモイド関数 (英: standard sigmoid function) f:id:kaeken:20171208192739p:plain をさす。

実関数とは 関数 (数学) - Wikipedia

定義域も終域も実数の集合であるような関数を実関数 (real function) という

シグモイド関数内に出てくるネイピア数について

https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0

ネイピア数(ネイピアすう、英: Napier's constant)は数学定数の一つであり、自然対数の底である。 記号として通常は e が用いられる。その値は e = 2.71828 … と続く超越数である

数学定数とは

https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E5%AE%9A%E6%95%B0

数学定数(すうがくていすう)とは、なんらかの"面白い"性質を持った定数である。

自然対数とは

https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E5%AF%BE%E6%95%B0

自然対数(しぜんたいすう、natural logarithm)は、ネイピア数を底とする対数 (logarithm) である。

対数とは

https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0

対数(たいすう、英: logarithm)とは、ある数 x を数 b の冪乗 bp として表わした場合の冪指数 p である。

超越数とは

https://ja.wikipedia.org/wiki/%E8%B6%85%E8%B6%8A%E6%95%B0

超越数(ちょうえつすう、英: transcendental number)とは、代数的数でない数、すなわちどんな有理係数の代数方程式 f:id:kaeken:20171208193644p:plain の解(英語版)にもならないような複素数のことである。

『Pythonからはじめる数学入門』7章(後半) 初等解析問題を解く / 高階微分および積分

f:id:kaeken:20171206212414p:plain

Pythonからはじめる数学入門』7章(後半) 初等解析問題を解く

の解説です。

7.5 高階微分と極大極小の計算

Derivativeクラスを使った微分オブジェクトのデフォルトは、 1階微分です。

高階微分をおこなうには、階数を第三引数に渡します。

ここでは、関数の1階微分と2階微分を使ってある区間の極大・極小を求める方法を示します。

定義域[-5,5]の関数 { \displaystyle
x^{5} - 30 x^{3} + 50 x
} を考えます。 f:id:kaeken:20171206212414p:plain

関数の極大値・極小値・最大値・最小値を求めるには、以下のように処理します。

#7.5 高階微分と極大極小の計算
from sympy import Symbol, solve, Derivative
x = Symbol('x')
f = x**5 - 30*x**3 + 50*x
d1 = Derivative(f, x).doit() #1階微分 階数を引数に指定するが、1階のときは省略
print('1階微分: {0}'.format(d1))
critical_points = solve(d1) #関数の臨界点
print('critical_points: {0}'.format(critical_points))
A = critical_points[2]
B = critical_points[0]
C = critical_points[1]
D = critical_points[3]

d2 = Derivative(f, x, 2).doit() #2階微分 階数を引数に指定
print('2階微分: {0}'.format(d2))

#2階微分の値が負なら極大点、正なら極小点、0なら未決
print('B: {0}'.format(d2.subs({x:B}).evalf()) )
print('C: {0}'.format(d2.subs({x:C}).evalf()) )
print('A: {0}'.format(d2.subs({x:A}).evalf()) )
print('D: {0}'.format(d2.subs({x:D}).evalf()) )
#AとCは負なので極大点、BとDは正なので極小点

x_min = -5 #端点最小値
x_max = 5 #端点最大値
print('x_min: {0}'.format(f.subs({x:x_min}).evalf()) )
print('x_max: {0}'.format(f.subs({x:x_max}).evalf()) )
#最大値を求めるためには、端点とA,Cで比較
print('A: {0}'.format(f.subs({x:A}).evalf()) )
print('C: {0}'.format(f.subs({x:C}).evalf()) )
#点Aが最大値

#最小値を求めるためには、端点とB,Dで比較
print('B: {0}'.format(f.subs({x:B}).evalf()) )
print('D: {0}'.format(f.subs({x:D}).evalf()) )
#点Dが最小値

結果

1階微分: 5*x**4 - 90*x**2 + 50
critical_points: [-sqrt(-sqrt(71) + 9), sqrt(-sqrt(71) + 9), -sqrt(sqrt(71) + 9), sqrt(sqrt(71) + 9)]
2階微分: 20*x*(x**2 - 9)
B: 127.661060789073
C: -127.661060789073
A: -703.493179468151
D: 703.493179468151
x_min: 375.000000000000
x_max: -375.000000000000
A: 705.959460380365
C: 25.0846626340294
B: -25.0846626340294
D: -705.959460380365

7.6 勾配上昇法を用いて最大値を求める

7.6.1 勾配上昇法のジェネリックなプログラム

7.6.2 初期値について一言

.6.3 ステップサイズとイプシロンの役割

7.7 関数の積分を求める

#7.7 関数の積分を求める

#Integralオブジェクトで不定積分、定積分を扱う
from sympy import Integral, Symbol
x = Symbol('x')
k = Symbol('k')
i1 = Integral(k*x, x).doit() #関数k*xと積分する変数xでIntegralオブジェクトを作り積分を評価
print('関数kxの不定積分: {0}'.format(i1))

i2 = Integral(k*x, (x,0,2)).doit() #定積分は、変数x、下限0、上限2、といったセットをタプルで渡す
print('関数kxの定積分(xが0から2をとる場合): {0}'.format(i2))

結果

関数kxの不定積分: k*x**2/2
関数kxの定積分(xが0から2をとる場合): 2*k

7.8 確率密度関数

『Pythonからはじめる数学入門』7章(前半) 初等解析問題を解く

f:id:kaeken:20171205234404p:plain

Pythonからはじめる数学入門』7章(前半) 初等解析問題を解く

に関する解説です。

7.1 関数とは何か

7.1.1 関数の定義域と値域

数学そのものの説明は省略しますが、用語を記しておきます。

写像mapping
定義域domain
値域range

7.1.2 よく使われる数学関数

sin()などよく使われる数学関数の書き方です。

#7.1.2 よく使われる数学関数

import math
print(math.sin(math.pi/2))

import sympy
print(sympy.sin(math.pi/2))

from sympy import Symbol
theta = Symbol('theta')
sympy.sin(theta) + sympy.sin(theta)

結果

1.0
1.00000000000000
2*sin(theta)

7.2 SymPyでの仮定

変数の正負など仮定を指定する場合です。

#7.2 SymPyでの仮定assumption
from sympy import Symbol
#正値だけ仮定する場合は、positive=Trueと指定
x = Symbol('x', positive=True)
if (x+5) > 5:
  print('x+5 : plus')
else:
  print('x+5 : minus')

#負値だけ仮定する場合は、negative=Trueと指定
x = Symbol('x', negative=True)
if (x+5) > 5:
  print('x+5 : plus')
else:
  print('x+5 : minus')

結果

x+5 : plus
x+5 : minus

7.3 関数の極限を求める

#Limitクラスのオブジェクトで関数の極限を求めます。
from sympy import Limit, Symbol, S #S:無限大や特別な値を定義するための使用する
x = Symbol('x')
print(Limit(1/x, x, S.Infinity)) #S.Infinity:無限大
print(Limit(1/x, x, 0, dir='-').doit()) #doit()で極限値を求める。dir='-'で負の方向を指定
print(Limit(1/x, x, 0, dir='+').doit()) #doit()で極限値を求める。dir='+'で正の方向を指定

結果

Limit(1/x, x, oo, dir='-')
-oo
oo

7.3.1 連続複利(Continuous Compound Interest)

7.3.2 瞬間変化率

7.4 関数の微分を求める

#7.4 関数の微分を求める

from sympy import Symbol, Derivative
t = Symbol('t')
St = 5*t**2 + 2*t + 8
print(Derivative(St, t))
print(Derivative(St, t).doit())
print(Derivative(St, t).doit().subs({t:1}))

結果

Derivative(5*t**2 + 2*t + 8, t)
10*t + 2
12

7.4.1 微分電卓

#微分電卓
from sympy import Symbol, Derivative, sympify, pprint
from sympy.core.sympify import SympifyError

def derivative(f, var):
  var = Symbol(var)
  d = Derivative(f, var).doit()
  pprint(d)


if __name__=='__main__':
  
  f = input('Enter a function: ')
  var = input('Enter the variable to differentiate with respect to: ')
  
  try:
    f = sympify(f)
  except SympifyError:
    print('Invalid input')
  else:
    derivative(f, var)

結果

# エラーになったが、以下が正しい結果で、再検証
Enter a function: 2*x**2 + 3*x + 1
Enter the varlable tO differentiate with respect to: x
4*x+3

7.4.2 偏微分を求める

結果

Enter a function: 2*x*y + x*y**2
Enter the varlable tO differentiate with respect to: x
4*x+3