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

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

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

『Pythonからはじめる数学入門』5章 集合と確率を操作する

f:id:kaeken:20171204234713p:plainPythonからはじめる数学入門』

5章 集合と確率を操作する

の解説です。

5.1 集合とは何か

集合(set)、要素(element)といったキーワードの意味は、高校数学で出てきていますのでここでは省略します。

以下、Pythonで集合の演算方法をみていきます。

5.1.1 集合の構成

まず、集合は、sympyのFiniteSetをimportして構成します。

from sympy import FiniteSet
s = FiniteSet(2,4,6)
print(s)

結果

{2, 4, 6}
# {} は集合を意味します

集合は、さまざまな要素をもつことができ、要素の個数は、len()で求められます。

from sympy import FiniteSet
from fractions import Fraction
s = FiniteSet(1,1.5, Fraction(1,5)) # さまざな数を要素にもてる
print(s)
print(len(s)) # 集合の濃度(cardinality)=要素の個数は、len()で求める

結果

{1/5, 1, 1.5}
3

集合の要素かどうかの判定方法は、in でチェックできます。

#5.1.1.1 要素判定

print(1 in s)
print(4 in s)

結果

True
False

また、空集合をつくる方法です。

#5.1.1.2 空集合を作る

s = FiniteSet()
s

結果

EmptySet()

リストやタプルから集合を作る場合は、可変長引数として渡します。

#5.1.1.3 リストやタプルから集合を作る

members = [1,2,3]
s = FiniteSet(*members) #*:可変長引数
s

結果

{1, 2, 3}

集合要素の重複は、取り除かれます。

#5.1.1.4 集合要素の重複と順序

from sympy import FiniteSet
members = [1,2,3,2]
FiniteSet(*members)

結果

{1, 2, 3}

また、順序は、一定になるとは限りません。

from sympy import FiniteSet
s = FiniteSet(1,2,3)
for member in s:
  print(member)

結果

1
2
3

集合が等しいかは、==で比較します。

from sympy import FiniteSet
s = FiniteSet(3,4,5)
t = FiniteSet(3,4,5)
s == t

結果

True

5.1.2 部分集合、上位集合、べき集合

一方の集合Aが、他方の集合Bに含まれる場合は、AはBの部分集合subsetといい、

その逆からみれば、BはAの上位集合supersetといいます。

また、完全に含まれている場合は、真部分集合proper subsetといい、逆は真上位集合proper supersetといいます。

#5.1.2 部分集合、上位集合、べき集合

s = FiniteSet(1)
t = FiniteSet(1,2)
print('subset')
print(s.is_subset(t))
print(t.is_subset(s))
print(s.is_subset(s))
print(t.is_subset(t))
print('superset')
print(s.is_superset(t))
print(t.is_superset(s))
print(s.is_superset(s))
print(t.is_superset(t))
print('proper_subset')
print(s.is_proper_subset(t))
print(t.is_proper_subset(s))
print(s.is_proper_subset(s))
print(t.is_proper_subset(t))
print('proper_superset')
print(s.is_proper_superset(t))
print(t.is_proper_superset(s))
print(s.is_proper_superset(s))
print(t.is_proper_superset(t))

結果

subset
True
False
True
True
superset
False
True
True
True
proper_subset
True
False
False
False
proper_superset
False
True
False
False

集合sのべき集合power setとは、sのすべての部分集合の集合を意味します。

s = FiniteSet(1,2,3)
ps = s.powerset()
print(ps)
print(len(ps))

結果

{EmptySet(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
8

5.1.3 集合演算

2つの集合の和union、積intersection、直積Cartesian productの演算は以下の通りです。

from sympy import FiniteSet
s = FiniteSet(1,3)
t = FiniteSet(3,6)
print('union')
print(s.union(t))
print('intersect')
print(s.intersect(t))
print('Cartesian product')
print(s*t)
for elem in s*t:
  print(elem)
print(s**3)
for elem in s**3:
  print(elem)

結果

union
{1, 3, 6}
intersect
{3}
Cartesian product
{1, 3} x {3, 6}
(1, 3)
(1, 6)
(3, 3)
(3, 6)
{1, 3} x {1, 3} x {1, 3}
(1, 1, 1)
(1, 1, 3)
(1, 3, 1)
(1, 3, 3)
(3, 1, 1)
(3, 1, 3)
(3, 3, 1)
(3, 3, 3)

5.2 確率

5.2.1 事象Aまたは事象Bの確率

5.2.2 事象Aおよび事象Bの確率

5.2.3 乱数生成

5.2.4 非一様乱数

『Pythonからはじめる数学入門』4章 SymPyで代数と式を計算する

f:id:kaeken:20171203090308p:plainPythonからはじめる数学入門』

4章 SymPyで代数と式を計算する

の解説です。

いままでは、数値計算でしたが、

xやyといった代数においては、

式の計算(symbolic math)が必要です。

Pythonでは、SymPyを使って式の計算をおこないます。

以下は、SymPyのリファレンスです。

SymPy

また、ブラウザ上で、SymPyの動作を確認できます。

SymPy Live

表示された数式を右クリックすると、Tex記法などに変換できます。

f:id:kaeken:20171203090224p:plain f:id:kaeken:20171203090308p:plain

4.1 式の記号と記号演算を定義する

SymPyでは、以下のとおり、記号を使って数式を表現します。

from sympy import Symbol
x = Symbol('x') #文字列xを用いてSymbolクラスのオブジェクトを作成
print(x + x + 1)

from sympy import symbols
x,y,z = symbols('x,y,z')
print((x+2)*(y+3)*(z+4))

結果

2*x + 1
(x + 2)*(y + 3)*(z + 4)

4.2 式を扱う

4.2.1 式の因数分解と展開

因数分解はfactor()を使い、展開はexpand()を使います。

from sympy import symbols
x,y = symbols('x,y')

from sympy import factor, expand
expr = x**2 - y**2

factors = factor(expr)
print('factors:{0}'.format(factors))

expand_result = expand(factors)
print('expand:{0}'.format(expand_result))

結果

factors:(x - y)*(x + y)
expand:x**2 - y**2

4.2.2 プリティプリント

式をみやすく出力したい場合は、pprint()を使います。

expr = x*x + 2*x*y + y*y
print('expr:{0}'.format(expr))

from sympy import pprint
pprint(expr, use_unicode=True)

結果

expr:x**2 + 2*x*y + y**2
 2            2
x  + 2⋅x⋅y + y 

4.2.3 値に代入する

式に値を代入するには、subs()を使います。

from sympy import symbols
x,y = symbols('x,y')
expr = x*x + x*y + x*y + y*y
res = expr.subs({x:1, y:2})
print(res)

結果

9

項の中の記号を別の式で表すこともできます。

from sympy import symbols
x,y = symbols('x,y')
expr = x*x + x*y + x*y + y*y
res = expr.subs({x:y-1})
print(res)

結果

y**2 + 2*y*(y - 1) + (y - 1)**2

4.2.4 文字列を数式に変換する

input()で入力された文字列を数式に変換する方法です。

from sympy import sympify
expr = input('input: ')
input: (入力した式)y**2 + 2*y*(y - 1) + (y - 1)**2
expr =sympify(expr)
print(2*expr)

結果

2*x**3 + 2*x**2 + 10*x

4.3 方程式を解く

4.3.1 2次方程式を解く

4.3.2 1変数を他の変数について解く

4.3.3 連立方程式を解く

4.4 SymPyを使ってプロットする

4.4.1 ユーザが入力した式をプロットする

4.4.2 複数の関数をプロットする

『Pythonからはじめる数学入門』3章 データを統計量で記述する

f:id:kaeken:20171203085006p:plainPythonからはじめる数学入門』

3章 データを統計量で記述する

の解説です。

機械学習では、

統計がよく出てくるので、

ここでは、統計の基本をPythonで学びます。

3.1 平均を求める

まずは、平均値を求める関数です。

def calculate_mean(numbers):
  s = sum(numbers) #合計
  N = len(numbers) #要素数
  mean = s/N #平均
  
  return mean

if __name__ == '__main__':
  datalist = [100,60,70,900,100,200,500,500,503,600,1000,1200]
  mean = calculate_mean(datalist)
  N = len(datalist)
  print('要素数:{0}, 平均:{1}'.format(N, mean))

結果

要素数:12, 平均:477

3.2 中央値を求める

昇順にならべたリストの中央の要素が中央値です(リストが偶数個なら中央2要素の平均)。

中央値を求める関数です。

def calculate_median(numbers): #中央値計算
  N = len(numbers) #要素数
  numbers.sort() #昇順に並び替え
  
  if N % 2 == 0:
    m1 = int(N/2) - 1 # 整数に変換して位置合わせ
    m2 = int((N/2) + 1) -1
    median = (numbers[m1] + numbers[m2])/2
  else:
    m = (N+1)/2
    m = int(m) - 1
    median = numbers[m]
  
  return median

if __name__ == '__main__':
  datalist = [100,60,70,900,100,200,500,500,503,600,1000,1200]
  median = calculate_median(datalist)
  N = len(datalist)
  print('N:{0}, 中央値:{1}'.format(N, median))
  datalist.sort()
  print(datalist)

結果

N:12, 中央値:500
[60, 70, 100, 100, 200, 500, 500, 503, 600, 900, 1000, 1200]

3.3 最頻値を求め度数分布表を作る

最頻値は、もっとも多く出現する値です。

3.3.1 一番多い要素を見つける

要素の個数が多い順にリストを返すmost_common()を使います。

datalist = [4,2,1,2,3,4,2]
from collections import Counter
c = Counter(datalist)
print(c.most_common()) #要素の個数が多い順に表示
print(c.most_common(2)) #上位2番目までの要素のみ表示

結果

[(2, 3), (4, 2), (1, 1), (3, 1)]
[(2, 3), (4, 2)]

3.3.2 最頻値を探す

最頻値を返す関数です。

from collections import Counter

def calculate_mode(numbers):
  c = Counter(numbers)
  mode = c.most_common(1)
  return mode[0][0]

if __name__ == '__main__':
  scores = [7,8,6,7,5,3,3,3,5,6,1,9,1,1,2,4,0,2,3,5,2]
  mode = calculate_mode(scores)
  print('最頻値:{0}'.format(mode))

結果

最頻値:3

3.3.3 度数分布表を作る

数のリストの度数分布表の求め方です。

from collections import Counter

def frequency_table(numbers):
  table = Counter(numbers)
  print('Number | Frequency')
  for number in table.most_common():
    print('{0} | {1}'.format(number[0], number[1]))

if __name__ == '__main__':
  scores = [7,8,6,7,5,3,3,3,5,6,1,9,1,1,2,4,0,2,3,5,2]
  mode = frequency_table(scores)

結果

Number | Frequency
3 | 4
1 | 3
2 | 3
5 | 3
6 | 2
7 | 2
0 | 1
4 | 1
8 | 1
9 | 1

3.4 散らばりを測る

散らばり(dispersion)とは、 データセットで数がどれだけ 平均から離れているかの統計値です。

3.4.1 数集合の範囲を決める

数集合の範囲を求める処理です。

def find_range(numbers):
  lowest = min(numbers)
  highest = max(numbers)
  r = highest - lowest
  return lowest, highest, r

if __name__ == '__main__':
  dataset = [100,60,70,900,100,200,500,500,503,600,1000,1200]
  lowest, highest, r = find_range(dataset)
  print('Lowest:{0} Highest:{1} Range:{2}'.format(lowest, highest, r))

結果

Lowest:60 Highest:1200 Range:1140

3.4.2 分散と標準偏差を求める

分散(variance)とは、値の散らばり度合いです。

分散が大きければ、値が平均から大きく離れて、小さければ、値が平均近くにかたまっています。

def calculate_mean(numbers):
  s = sum(numbers) #合計
  N = len(numbers) #要素数
  mean = s/N #平均
  
  return mean

def find_differences(numbers):
  mean = calculate_mean(numbers)
  diff = []
  
  for num in numbers:
    diff.append(num - mean)
  return diff

def calculate_variance(numbers): #分散
  diff = find_differences(numbers)
  squared_diff = []
  for d in diff:
    squared_diff.append(d**2)
  sum_squared_diff = sum(squared_diff)
  variance = sum_squared_diff / len(numbers)
  return variance

if __name__ == '__main__':
  datalist = [100,60,70,900,100,200,500,500,503,600,1000,1200]
  variance = calculate_variance(datalist) #分散
  print('variance:{0}'.format(variance))
  
  std = variance**0.5 #標準偏差
  print('std:{0}'.format(std))

結果

variance:141047
std:375.562245174

3.5 2つのデータセットの相関を計算する

相関とは、2つのデータセットの関係性です。

相関係数とは、線形的な関係性を-1から1の範囲で示す統計量です。非線形関係については、別の測度が必要です。

相関係数0:線形相関がない

相関係数+1:強い正の線形相関がある

相関係数−1:強い負の線形相関がある

3.5.1 相関係数を計算する

相関係数を計算するためには、2つのデータセットの対応する要素の対を返すzip()関数を使います。

dataset1 = [1,2,3]
dataset2 = [4,5,6]
for x, y in zip(dataset1,dataset2):
  print(x,y)

結果

(1, 4)
(2, 5)
(3, 6)

相関係数の計算式は、以下を参照してください。

相関係数 - Wikipedia

相関係数を求める処理は以下の通りです。

def find_corr_x_y(x,y):
  n = len(x)
  prod = []
  for xi,yi in zip(x,y):
    prod.append(xi*yi)
  sum_prod_x_y = sum(prod)
  sum_x = sum(x)
  sum_y = sum(y)
  squared_sum_x = sum_x**2
  squared_sum_y = sum_y**2
  x_square = []
  for xi in x:
    x_square.append(xi**2)
  x_square_sum = sum(x_square)
  y_square = []
  for yi in y:
    y_square.append(yi**2)
  y_square_sum = sum(y_square)
  
  numerator = n*sum_prod_x_y - sum_x*sum_y
  denominator_term1 = n*x_square_sum - squared_sum_x
  denominator_term2 = n*y_square_sum - squared_sum_y
  denominator = (denominator_term1*denominator_term2)**0.5
  correlation = numerator/denominator
  
  return correlation

if __name__ == '__main__':
  data1 = [1,2,3]
  data2 = [1,2,3]
  corr = find_corr_x_y(data1,data2)
  print('data1 data2 correlation:{0}'.format(corr))

  data3 = [1,2,3]
  data4 = [3,2,1]
  corr = find_corr_x_y(data3,data4)
  print('data3 data4 correlation:{0}'.format(corr))

  data5 = [-93831,29999,8188]
  data6 = [-1,-2,1]
  corr = find_corr_x_y(data5,data6)
  print('data5 data6 correlation:{0}'.format(corr))

結果

data1 data2 correlation:1.0
data3 data4 correlation:-1.0
data5 data6 correlation:0.0243875472264

3.5.2 高校の成績と大学入試の点数

2つのデータセットのプロットを散布図で表現すれば、ビジュアルで理解できます。

3.6 散布図

散布図は以下のように表示します。

x = [10,20,30,40]
y = [20,40,60,80]
import matplotlib.pyplot as plt
plt.scatter(x,y)
plt.show()

f:id:kaeken:20171203081027p:plain

『Pythonからはじめる数学入門』2章 データをグラフで可視化する

Pythonからはじめる数学入門』

2章 データをグラフで可視化する

の解説です。 www.oreilly.co.jp

f:id:kaeken:20171201232820p:plain 機械学習で数値データを提示する際には、

グラフを用いることが多いです。

今回は、

Pythonでグラフを使う方法についてご説明します。

2章 データをグラフで可視化する

2.1 デカルト座標平面を理解する

デカルト座標平面とは、いわゆるx-y平面のことです。

高校数学で出てくるので、用語のみ記載します。

座標coordinates
原点origin
集合set
プロットplot
グラフgraph

2.2 リストとタプルの操作

リスト:可変的な要素のかたまり(あとで変更できる)

タプル:固定された要素のかたまり(あとで変更できない)

2.2.1 リストやタプルで繰り返す

リストやタプルはfor文で繰り返すことができます。

>>> list = [1,2,3]

>>> for item in list:
...     print(item)
...
1
2
3

>>> for index, item in enumerate(list):
...     print(index, item)
...
(0, 1)
(1, 2)
(2, 3)

2.3 matplotlibでグラフを作る

matplotlibは、Pythonのグラフ描画パッケージです。

インストール方法は、次のコマンドでインストールするか、 別途「matplotlib インストール」などで検索してみてください。

pip install matplotlib

さっそく以下のコードを打ち込んでいきますが、

#点(1,2), (2,4), (3,6)をプロット
x = [1,2,3]
y = [2,4,6]

from pylab import plot, show
plot(x, y)
show()

以下は、説明でにグラフ描画を表示するため、 コマンドラインではなく、 Jupyter Notebookを使って実行していきます。

上記の実行結果です。 f:id:kaeken:20171201221735p:plain

2.3.1 グラフで点を作る

プロットを明示する場合です。

plot(x, y, marker='o')

実行結果です。 f:id:kaeken:20171201222133p:plain

マーカーのみ表示する場合は、以下のように記載します。

plot(x, y, 'o')

f:id:kaeken:20171201222458p:plain

2.3.2 ニューヨーク市の年間平均気温をグラフ化する

複数のプロットをしていけば、データの傾向をつかめます。

nyc_temp=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4,57.3]
plot(nyc_temp, marker='o')

f:id:kaeken:20171201222912p:plain

x軸に年など特定の値を設定する方法です。

years = range(2000,2013)
plot(years, nyc_temp, marker='o')

f:id:kaeken:20171201223134p:plain

2.3.3 ニューヨーク市の月間気温傾向を比較する

複数のグラフを重ね合わせる方法です。

#データはダミー
y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

f:id:kaeken:20171201224222p:plain legend()で、凡例の指定ができます。

細かい引数の指定方法は、以下を参照してください。

legend and legend_handler — Matplotlib 2.1.0 documentation

2.3.4 グラフのカスタマイズ

タイトル、X軸名、Y軸名など、

他にカスタマイズする方法は、以下のとおりです。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
#title
title('matplotlib title')

#xlabel
xlabel('Month')

#ylabel
ylabel('Temp')

f:id:kaeken:20171201225039p:plain

また、

axis()によって、軸の最小値、最大値を指定できます。

Y軸の最小値を0にした場合です。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
title('matplotlib title')
xlabel('Month')
ylabel('Temp')

from pylab import axis
axis(ymin=0)

f:id:kaeken:20171201232626p:plain

また、

X軸の最小値・最大値、Y軸の最小値・最大値を以下の通り指定できます。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
title('matplotlib title')
xlabel('Month')
ylabel('Temp')

from pylab import axis
axis([0,13,0,100])

f:id:kaeken:20171201232820p:plain

最後に、対話シェルではなく、プログラムの一部として、グラフを使う場合は、

pylabではなくpyplotを使います。

import matplotlib.pyplot as plt
def create_graph():
    x  = [1,2,3]
    y = [2,4,6]
    plt.plot(x,y)

if __name__ == '__main__':
  create_graph()

f:id:kaeken:20171201233326p:plain

2.3.5 プロットの保存

グラフを保存するには、savefig()を使います。

from pylab import plot,savefig
x = [1,2,3]
y = [2,4,6]
plot(x,y)
savefig('mygraph.png')

2.4 式をプロットする

今までのご説明は、

すでにプロットするデータがあった場合ですが、

数式からプロットする方法があります。

2.4.1 ニュートン万有引力の法則

詳細説明は省略しますが、イメージとして以下のようなグラフを描画できます。

import matplotlib.pyplot as plt

def draw_graph(x,y):
  plt.plot(x, y, marker='o')
  plt.xlabel('Distance in meters')
  plt.ylabel('Gravitational force in newtons')
  plt.title('Gravitational force and distance')
  plt.show()

def generate_F_r():
  r = range(100, 1001, 50)
  F = []
  G = 6.674*(10**-11)
  m1 = 0.5
  m2 = 1.5
  for dist in r:
    force = G*(m1*m2)/(dist**2)
    F.append(force)
  draw_graph(r, F)

if __name__=='__main__':
  generate_F_r()

f:id:kaeken:20171201234548p:plain

2.4.2 投射運動

以上、

Pythonからはじめる数学入門』2章 データをグラフで可視化する

の解説でした。

1章 数を扱う / まずは基本的な演算と数の種類を把握『Pythonからはじめる数学入門』

機械学習を学ぶ際に、Pythonでの数式表現でつまづくことがある。

そこで、

Pythonからはじめる数学入門』

をコツコツ通読&コマンドを打つことで、

数式表現に慣れていく。

まずは、

基本的な演算と数の種類を把握。

数値処理に強いPythonっぽいメソッドもある。

9. 数値と数学モジュール — Python 3.6.3 ドキュメント

1章 数を扱う
    1.1 基本数学演算
    1.2 ラベル:名前に数を割り当てる
    1.3 さまざまな種類の数
        1.3.1 分数を扱う
        1.3.2 複素数
    1.4 ユーザ入力を受け取る
        1.4.1 例外と不当入力の処理
        1.4.2 分数と複素数を入力
    1.5 数学を行うプログラムを書く
        1.5.1 整数の因数を計算する
        1.5.2 乗算表を生成する
        1.5.3 測定単位を変換する
        1.5.4 2次方程式の解を求める
    1.6 学んだこと
    1.7 プログラミングチャレンジ
        問題1-1 奇数偶数自動判別プログラム
        問題1-2 乗算表生成器の拡張
        問題1-3 単位変換プログラムの拡張
        問題1-4 分数電卓
        問題1-5 ユーザに脱出能力を与える

1章 数を扱う 1.1 基本数学演算 加算/減算/乗算/除算

>>> 3 + 2
5

>>> 3 - 2
1

>>> 3 * 2
6

>>> 3 / 2
1.5

小数点以下を除いた整数のみ返す 整除除算。負数の場合に注意。

>>> 3 // 2
1

>>> -3 // 2
-2

余りだけ返す 剰余

>>> 9 % 2
1

指数演算

>>> 2 ** 10
1024

9の平方根
>>> 9 ** (1/2)
3.0

8の立方根
>>> 8 ** (1/3)
2.0

1.2 ラベル:名前に数を割り当てる

変数のことをこの書籍だけは「ラベル」と呼ぶらしい。特殊すぎるので無視。

1.3 さまざまな種類の数

数の種類をtype()関数で表示

>>> type(3)
<class 'int'>
>>> type(3.0)
<class 'float'>

int()とfloat()で相互変換

>>> int(3.0)
3
>>> float(3)
3.0

1.3.1 分数を扱う

分数を扱うには、fractionsモジュールが必要。

9.5. fractions — 有理数 — Python 3.6.3 ドキュメント

>>> from fractions import Fraction
>>> f = Fraction(3,4)
>>> f
Fraction(3, 4)

>>> Fraction(3,4) + Fraction(3,4)
Fraction(3, 2)
>>> Fraction(3,4) + Fraction(1,4)
Fraction(1, 1)

1.3.2 複素数

Python複素数を扱う場合は、以下のように記述

3 + 2i(実部3 +虚部2)」の記述方法

>>> a = 3 + 2j
>>> type(a)
<class 'complex'>

>>> b = complex(3,2)
>>> type(b)
<class 'complex'>

>>> a + b
(6+4j)

>>> x = 2 +3j
>>> x.real //実部
2.0
>>> x.imag //虚部
3.0
>>> x.conjugate() //共役複素数
(2-3j)

>>> (x.real ** 2 + x.imag ** 2 ) ** 0.5 // 複素数の大きさ
3.605551275463989

>>> abs(x) // 複素数の大きさ
3.605551275463989

その他複素数関連はcmathモジュールにある

9.3. cmath — 複素数のための数学関数 — Python 3.6.3 ドキュメント

>>> import cmath
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

複素数を使うケースはどれくらいあるのか不明だが、

一応演算できるということを理解しておく。

データサイエンティスト(DS)になるためのスキルチェックシート

一般社団法人データサイエンティスト協会 という団体からデータサイエンティスト(以下DS)になるための目安となる スキルチェックシートが提供されている。

DSスキルチェック | Data Scientist Society Journal DSスキルチェック | Data Scientist Society Journal

概要を抜粋

活用シーン

データサイエンティストのスキルレベルを把握したいときに 就職や転職時に求められているスキルを把握したいときに 大学や職場での学習・教育内容を決めるときに

機能

スマートフォンを使って、いつでもどこでもスキルチェックを行うことができます データサイエンス力(サイエンス)・データエンジニアリング(エンジニア)・ビジネス力(ビジネス)の3領域を棟梁レベル・独り立ちレベル・見習いレベルの3レベルごとに回答できます 全国平均などから、他者との相対的なスキルレベルが確認できる結果やデータサイエンティスト協会のフォーマット(Excel形式)でダウンロードできます 過去のチェック結果を保存。いつでもオンライン上で見直すことができます

以下にPDF版がある。

http://www.datascientist.or.jp/common/docs/skillcheck.pdf

カテゴリだけ抜粋

データサイエンス力
(項目数:180)
1   統計数理基礎
2   予測
3   検定/判断
4   グルーピング
5   性質・関係性の把握
6   サンプリング
7   データ加工
8   Data visualization
9   機械学習
10  時系列分析
11  言語処理
12  画像処理
13  音声処理
14  パターン発見
16  グラフィカルモデル
17  統計数理応用
18  シミュレーション/データ同化
19  最適化


データエンジニアリング力
(項目数:119)
1   環境構築
2   データ収集
3   データ構造
4   データ蓄積
5   データ加工
6   データ共有
7   プログラミング
8   ITセキュリティ

ビジネス力
(項目数:123)
1   行動規範
2   論理的思考
3   プロセス
4   データの理解・検証
5   データ入手
6   意味合いの抽出、洞察
7   解決
8   事業に実装する
9   活動マネジメント

例えば、統計数理基礎 レベル1では、

1+4+9+16+25+36をΣを用いて表せる

といった基礎レベルから、機械学習レベル3では、

機械学習 バイアスとバリアンスの関係を理解し、モデル選定を適切に行える

といった抽象的かつ包括的な表現のチェックもある。

これは課題が具体的で取り組みやすい。

また、 データサイエンス力(以下D/sci)・データエンジニアリング(以下D/eng)・ビジネス力(以下D/biz)の3領域 レベル1-3(以下L1-L3)でクロスした表を作成して、定量的に把握してみた。

cate L1 L2 L3 all
D/sci 54 68 58 180
D/eng 39 43 37 119
D/biz 30 49 44 123
all 123 160 139 422

レベル1から取り組み、可能なかぎり、Pythonや実装レベルに落とし込んで理解する。

データを処理するスキルがなければ、人工知能は構築できない。

それでは、レベル1からスタート。

「新しい人工知能の教科書」は教科書ではなくカタログ

まずは先に人工知能の全体像を確認。

「新しい人工知能の教科書」を通読したが、この本は教科書というより知識のカタログ。

各知識の概要紹介と、参照資料をもとに、自分で深堀していく必要がある。

www.shoeisha.co.jp

【目次】
CHAPTER1 人工知能の過去と現在と未来

CHAPTER2 ルールベースとその発展型
01 ルールベース
02 知識ベース
03 エキスパートシステム
04 レコメンドエンジン

CHAPTER3 オートマトンと人工生命プログラム
01 人工生命シミュレーション
02 有限オートマトン
03 マルコフモデル
04 ステート駆動エージェント

CHAPTER4 重み付けと最適解探索
01 線形問題と非線形問題
02 回帰分析
03 重みを付けた回帰分析
04 類似度の計算

CHAPTER5 重み付けと最適化プログラム
01 グラフ理論
02 グラフ探索と最適化
03 遺伝的アルゴリズム
04 ニューラルネットワーク

CHAPTER6 統計的機械学習(確率分布とモデリング)
01 統計モデルと確率分布
02 ベイズ統計学とベイズ推定
03 MCMC法
04 HMMとベイジアンネットワーク

CHAPTER7 統計的機械学習(教師なし学習と教師あり学習)
01 教師なし学習
02 教師あり学習

CHAPTER8 強化学習と分散人工知能
01 アンサンブル学習
02 強化学習
03 転移学習
04 分散人工知能

CHAPTER9 深層学習
01 ニューラルネットワークの多層化
02 制限付きボルツマンマシン(RBM)
03 Deep Neural Network(DNN)
04 Convolution Neural Network(CNN)
05 Recurrent Neural Network(RNN)

CHAPTER10 画像や音声のパターン認識
01 パターン認識
02 特徴抽出の方法
03 画像認識
04 音声認識

CHAPTER11 自然言語処理と機械学習
01 文章の構造と理解
02 知識獲得と統計的意味論
03 構造解析
04 テキスト生成

CHAPTER12 知識表現とデータ構造
01 データベース
02 探索
03 意味ネットワークとセマンティックWeb

CHAPTER13 分散コンピューティング
01 分散コンピューティングと並列コンピューティング
02 ハードウェアからのアプローチ
03 ソフトウェアからのアプローチ
04 機械学習プラットフォームと深層学習プラットフォーム

CHAPTER14 大規模データ・IoTとのかかわり
01 肥大化するデータ
02 IoTと分散人工知能
03 脳機能の解明とロボット
04 創発システム

かなり多岐にわたる内容。広く浅く、人工知能の射程範囲の輪郭だけ把握。

こんなカタログレベルでも数学がバンバン出てくるので、1日でも早く昔のカンを取り戻す。

機械学習プロフェッショナルシリーズ一覧

機械学習プロフェッショナルシリーズというシリーズ本がある。

機械学習プロフェッショナルシリーズ | 書籍情報 | 株式会社 講談社サイエンティフィク

以下、既刊本。出版時期ごとに勝手にナンバリング。

1-1  機械学習のための確率と統計 978-4-06-152901-4
1-2 深層学習    978-4-06-152902-1
1-3 オンライン機械学習 978-4-06-152903-8
1-4 トピックモデル   978-4-06-152904-5
2-1 統計的学習理論   978-4-06-152905-2
2-2 サポートベクトルマシン   978-4-06-152906-9
2-3 確率的最適化  978-4-06-152907-6
2-4 異常検知と変化検知 978-4-06-152908-3
3-1 劣モジュラ最適化と機械学習 978-4-06-152909-0
3-2 スパース性に基づく機械学習 978-4-06-152910-6
3-3 生命情報処理における機械学習 多重検定と推定量設計 978-4-06-152911-3
4-1 ヒューマンコンピュテーションとクラウドソーシング    978-4-06-1529137
4-2 変分ベイズ学習   978-4-06-1529144
4-3 ノンパラメトリックベイズ 点過程と統計的機械学習の数理   978-4-06-1529151
4-4 グラフィカルモデル 978-4-06-1529168
5-1 バンディット問題の理論とアルゴリズム  978-4-06-152917-5
5-2 ウェブデータの機械学習   978-4-06-152918-2
5-3 データ解析におけるプライバシー保護 978-4-06-152919-9
6-1 機械学習のための連続最適化 978-4-06-152920-5
6-2 関係データ学習   978-4-06-152921-2
6-3 オンライン予測   978-4-06-152922-9
7-1 統計的因果探索   978-4-06-152925-0
7-2 画像認識    978-4-06-152912-0
7-3 深層学習による自然言語処理 978-4-06-152924-3

あまり細部にこだわらず、研究分野の概要を知る意味でも、ひととおり学習していく。