はじめに
`numpy`を使うと複雑な計算ができるようになるが、機会学習でよくつかう計算についてまとめた。
x転置x
.dotの後に、掛けるものを2つ置けばよい。
XtX= np.dot(X.T,X)
print(XtX)
逆行列
linear algebra(リニアアルジェブラ): 線形代数
numpy
の場合は、linalg.invを使って描写する。
XtX_inv = np.linalg.inv(XtX)
print(XtX_inv)
`numpy`を使うと複雑な計算ができるようになるが、機会学習でよくつかう計算についてまとめた。
.dotの後に、掛けるものを2つ置けばよい。
XtX= np.dot(X.T,X)
print(XtX)
linear algebra(リニアアルジェブラ): 線形代数
numpy
の場合は、linalg.invを使って描写する。
XtX_inv = np.linalg.inv(XtX)
print(XtX_inv)
Pythonで機械学習の勉強をはじめるようになって、ファイルを読み込むことが多くなった。
その際、UTF-8フォーマットじゃないと何かと
“` UnicodeDecodeError: ‘utf-8’ codec can’t decode byte “`
というエラーに陥ることになってしまったので、手順をまとめる
macでデフォルトで入っていないのでbrewコマンドでinstallする
“`brew install nkf “`
まずは作業前
$ file --mime data.csv data.csv: text/plain; charset=unknown-8bit
変換コマンド
“` nkf -w –overwrite data.csv “`
$ file --mime data.csv data.csv: text/plain; charset=utf-8
文字コードが代わり、エラーは出なくなった。
重回帰分析をするにあたり必要な計算があるので整理する。
numpyはimportされているものとする
import numpy as np
# ベクトルの定義 x = np.array([[1],[2],[3]]) print(x)
X = np.array([[1,2],[3,4]]) print(X)
# 転置 Xt = X.T print(Xt)
linear algebra (リニア・アルジェブラ)線形代数の意味
Inverse (インバース) 逆行列の意味
X_inv = np.linalg.inv(X) print(X_inv)
XX_inv = np.dot(X,X_inv) print(XX_inv)
1 | 0 |
8.88の16乗 | 1 |
x掛けるxの逆行列で行列積が求まる。
以下の様なnumpyの配列を作り、行、列の数を取得したり、forループで値を取得したりする
import numpy as np x = np.array([[1,2,3]]) print (x) print ('-----') X = np.array([[1,2],[3,4]]) row, cal = X.shape print(row) print(cal) print ('-----') for x in X: print ('-----') print (x) ~ ~
実行結果
$ python sample.py [[1 2 3]] ----- 2 2 ----- ----- [1 2] ----- [3 4]
xとyを以下の通り定義する。xの1行目にはダミー値として1をセットする事。
# X definitions print('# X definitions') X = np.array([ [1,2,3], [1,2,5], [1,3,4], [1,5,9] ]) print(X) # Y definitions print('# Y definitions') y = np.array([ [1], [5], [6], [8] ]) print(y)
実行結果
# X definitions [[1 2 3] [1 2 5] [1 3 4] [1 5 9]] # Y definitions [[1] [5] [6] [8]]
また、wは以下の通りとし、stepを分けて計算する
# Step1 print('# Step1') step1 = np.dot(X.T, X) print(step1) # Step2 print('# Step2') step2 = np.linalg.inv(step1) print(step2) # Step3 print('# Step3') step3 = np.dot(X.T,y) print(step3) # Step4 print('# Step4') step3 = np.dot(X.T,y) step4 = np.dot(step2,step3) print (step4)
実行結果は以下の通り
# Step1 [[ 4 12 21] [ 12 42 73] [ 21 73 131]] # Step2 [[ 1.76530612 -0.39795918 -0.06122449] [-0.39795918 0.84693878 -0.40816327] [-0.06122449 -0.40816327 0.24489796]] # Step3 [[ 20] [ 70] [124]] # Step4 [[-0.14285714] [ 0.71428571] [ 0.57142857]]
重回帰分析を進めるにあたりスカラー、ベクトル、行列を整理。ベクトルと行列の足し算・引き算についてまとめた。
“` x, y, z, M, N “`
数学に出てくる記号
複数の定数、複数の変数を集めたもの。
スカラーが複数個集まれば、ベクトルになる。
教科書やノートではベクトルのxはスカラーのxと混乱するのを防ぐべく、太文字で書くのが一般的。
エクセルのカラムをイメージするとよい
横向きにする事も可能。
その場合は転置の記号(T)を付ける
ベクトルに対して横方向を持ったもの
この場合は、3 * 2の行列
対応するところを合わせる
計算するベクトルの行と列の数が同じである事
基本的に行列の割り算はない。分数をかける事により掛け算のみで代用できるため。
行列は対応するところを計算するわけではない。
例えばこのような行列があった場合
縦、横に補助線を引く
左側と右側を掛ける。
足し算・引き算とは違い、サイズが同じでなくても良い。
内側の2つが同じである事。
“`N… Aの行
M… Aの列
O… Bの行
P… Bの列 “`
だとすると
AとBの行列を掛ける場合、
M=Oが一致している事。
また、算出されるCの行と列の数はN・Pになる
本記事はキカガクさんの Udemyで勉強したノートになります。
あくまでも私のノートになりますので詳しく知りたい方はキカガクさんのコースを受講してみてください
https://www.udemy.com/kikagaku_blackbox_2
単回帰分析をする際、重要になるのが、「傾き」と「切片」。
「切片」はセンタリングを行うことにより省略可能だが、「傾き」を計算するのは複雑な式を用いる。 難しそうなインパクトが強すぎて中身がまったく頭に入ってこない。 これをnumpyで実装する。
まずは定数を定義
# -*- coding: utf-8 -*- import numpy as np # ベクトルの定義 # numpyでは([])で括る # 与えられたもの部屋の広さとか x = np.array([1,3,5,10,20]) # その結果。値段など。 y = np.array([2.5,6,11,21,38]) # 全ての配列を表示 print ("全ての配列を表示") print (x) print (y)
描写するとこのような感じになる。 データの中心化を行う。値から、平均分を引く
## データの中心化 # 平均の算出 print x.mean() print y.mean() print ("中心化") # cはcenteringの略とする # pandsでも中心化する方法は存在する xc = x -x.mean() print (xc) yc = y - y.mean() print(yc)
描写するとこのような感じになる。
グラフの形は変わらず、全体的に中心になった。
改めて計算式を確認。
分母、分子をそれぞれ別々に計算する。 numpyで計算する際は、このようになる
# 分母はxc * xcで、最後に足す xcxc = xc * xc print xcxc print ("分母:") print xcxc.sum()
次に分子
xcyc = xc * yc print ("分子:") print xcyc.sum()
最後に分子と分母を組み合わせる
answer = xcyc.sum()/xcxc.sum() print ("傾き:") print (answer)
$ python regression.py 全ての配列を表示 [1 2 3] [2. 3.9 6.1] 2.0 4.0 中心化 [-1. 0. 1.] [-2. -0.1 2.1] パラメータaの計算 [1. 0. 1.] 分母: 2.0 分子: 4.1 傾き: 2.05
傾きを元に実践を引いてみるとこのようになる 悪くなさそう。 実は実際はscikit-learnを使うともっと早いようだ。
CSVファイルなどを手軽にグラフ化したいことがある。そんな時matplotlib.pyplotを使えば直ぐに簡易的なグラフに描写することができて便利だ csvの中身は以下のものとする
a b 10.5 22 15.4 7.23 11.8 7.1 81.2 7.3 15.1 13.4 9.2 11.4
import pandas as pd df = pd.read_table('~/Documents/sample.csv') a = df['a'] b = df['b'] import matplotlib.pyplot as plt plt.scatter(a,b)
scatterが散布図を指定する事になる。
pandasでデータを読み込もうとした際、read_csvを使ったがタブが¥tとして読み込まれてしまい、期待通りの結果にならなかった ちなみに読み込んだデータはこちら
$ cat ~/Documents/sample.csv a b 10.5 22 15.4 7.23 11.8 7.1 81.2 7.3 15.1 13.4 9.2 11.4
pandasではcsvを読み込む処理と、tab区切りのデータを読み込ませる処理が明確に分かれている
read_csvをread_tableに修正することで期待通りに読み込むことができた。 また、表示する件数を絞りたい場合はhead()を利用する 3を引数に渡すことで表示件数を3件に絞ることが可能になる。