「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Pythonによるデータ分析(その10/X)

 仕事上、早々に\mathrm{Python}を使えるようにしないといけないため、

を基に学んでいく。

3. NumPyの基礎:配列とベクトル演算

 \mathrm{NumPy}は"\mathrm{Numerical\ Python}"の意味で\mathrm{Python}での数値計算におけるもっとも重要な基本パッケージの1つである。

3.6 行列計算

 \mathrm{NumPy}では**がアダマール積(対応する要素ごと)を意味するため、\mathrm{dot}()内積を計算する。

関数 説明
\mathrm{diag} 正方行列の対角成分を返す。
\mathrm{dot} 2つの行列の内積を計算する。
\mathrm{trace} 対角成分の総和(トレース)を計算する。
\mathrm{det} 行列式を計算する。
\mathrm{eig} 正方行列に対して固有値および固有ベクトルを計算する。
\mathrm{inv} 正方行列に対して逆行列を計算する。
\mathrm{pinv} \mathrm{Moore}-\mathrm{Penrose}型疑似逆行列を求める。
\mathrm{qr} \mathrm{QR}分解を行なう。
\mathrm{svd} 特異値分解を計算する。
\mathrm{solve} 正方行列Aに対して線形方程式Ax=bxについて解く。
\mathrm{lstsq} Ax=bに対して最小二乗法による近似を求める。
################
### 行列計算 ###
################

import numpy as np
from numpy.linalg import inv, qr

x = np.array([[1.,2.,3.],[4.,5.,6.]])
y = np.array([[6.,23.],[-1,7,],[8,9]])

print(x)
print(y)

# これらは等価
dot1 = x.dot(y)
dot2 = np.dot(x,y)
dot3 = x @ y

print(dot1)
print(dot2)
print(dot3)

# 標準的な計算
X = np.random.randn(5,5)

mat = X.T.dot(X) # 転置行列と元の行列との内積
print(mat)

inv_mat = inv(mat) # 逆行列
print(inv_mat)

print(mat.dot(inv(mat))) # 行列×逆行列

q, r = qr(mat) # QR分解
print(r)

3.7 擬似乱数生成

 \mathrm{NumPy}は組み込みの\mathrm{random}を補完する形で\mathrm{numpy.random}モジュールを提供している。

from numpy import random
samples = numpy.random.normal(size = (4, 4))

print(samples)

#
from random import normalvariate
N = 1000000

%timeit samples = [normalvariate(0, 1) for _ in range(N)]
%timeit np.random.normal(size = N)

 擬似乱数のシードは\mathrm{random.seed}()で指定する。ただし\mathrm{numpy.random}モジュールで提供される乱数データ生成関数は、いずれもグローバル乱数シードを参照するため、グローバル参照を避けるには、\mathrm{numpy.random.RandomState}()を用いる。

関数 説明
\mathrm{seed} 乱数生成器のシード。
\mathrm{permutation} 引数が配列の場合、その成分をランダムに並べ替えた新しい配列を返す。整数の場合、その引数で\mathrm{np.arange}を呼び出し、結果をランダムに並べ替えた配列を返す。
\mathrm{shuffle} その配列事態の成分をランダムに並べ替える。
\mathrm{rand} 連続一様乱数。
\mathrm{randint} 与えられた整数範囲内での整数乱数。
\mathrm{randn} 標準正規乱数。
\mathrm{binomial} 二項乱数。
\mathrm{normal} 正規乱数。
\mathrm{beta} ベータ乱数。
\mathrm{chisquare} カイ二乗乱数。
\mathrm{gamma} ガンマ乱数。
\mathrm{uniform} 区間\left[0,1\right]の一様乱数。
########################
### ランダムウォーク ###
########################

import random
import numpy as np
import matplotlib.pyplot as plt

# 
position = 0
walk = [position]
steps = 10000

for i in range(steps):
    step = 1 if random.randint(0,1) else -1
    position += step
    walk.append(position)

plt.plot(walk)

# 
nsteps = 10000
draws = np.random.randint(0, 2, size = nsteps)
steps = np.where(draws > 0, 1, -1)
walk = steps.cumsum()

walk.min()
walk.max()

plt.plot(walk)
プライバシーポリシー お問い合わせ