機械学習1章・2章
教師あり学習
教師なし学習
強化学習
その他
半教師学習
転移学習
学習データが不足している際に有効
教師あり学習
教師あり学習における学習データは、正解ラベルと特徴量から構成される
既知のパターンを検知
手法)回帰、ナイーブベイズ、決定木、deep learning、クラスタリング(https://qiita.com/tomomoto/items/b3fd1ec7f9b68ab6dfe2)
教師なし学習
学習データに正解ラベルを含まない(データ全体の性質を学習する)
未知のパターンの発見
手法)クラスタリング、GAN(敵対的生成ネットワーク、画像生成、アソシエーション分析
強化学習
報酬を手がかりに、環境に適した行動を学習する手法
手法)イプシロング・グリーディー
半教師学習
手法)
分類機に基づく手法ー自己訓練
データに基づく手法ー半教師ありK近傍法
深層学習
単体で機械学習を行えるユニットを、並列・多段で繋げて使い倒すような機械学習
PyTorch&深層学習プログラミング(https://github.com/makaishi2/pytorch_book_info)
実装
コンテナデータ型の変数に注意
.copyを使うことによって新たなコンテナデータを作成できる
code:py
x = np.array(1,3,5)
y = x
x1 = -1 # xにもyにも参照されてしまう
y = x.copy()
合成関数の実装方法
code:python
def f1(x):
return x**2
def f2(x):
return 2 * x
def f3(x):
return x + 2
x1 = f1(x)
x2 = f2(x1)
y = f3(x2)
シンプルに前の変数を代入
数値微分の実装
𝑓′(𝑥)=𝑓(𝑥+ℎ)–𝑓(𝑥−ℎ)/2ℎ
code:python
def fdiff(f):
def diff(x):
h = 1e-6
return(f(x+h)-(x-h)) / 2*h
return diff
二次関数 2x**2+2を上の数値微分の関数に適用させる
code:python
def f(x):
return (2 * x**2 + 2)
# fの微分結果の関数diffを取得
diff = fdiff(f)
# 微分結果を計算しy_dashに代入
y_dash = diff(x)
sigmoid関数を適用させる
code:python
def g(x):
return 1 / (1 + np.exp(-x))
diff = fdiff(g)
y_dash = diff(x)
pytorchではこれらを簡単にできる仕組みを内蔵している。
PyTorchによる機械学習
カスタムクラス定義 独自にクラスを定義する必要あり
オブジェクト指向
クラス:型
インスタンス:クラスから生成された個別の実体
クラス内の変数を属性
クラス内の関数をメソッド
二次元上に点を描画するコードをオブジェクト指向でかく
code:python
#クラスの定義
class Point:
#インスタンス生成時に必ずxとyの二つの引数を持つ
def __init__(self, x, y):
self.x = x
self.y = y
def draw(self):
plt.plot(self.x, self.y, marker='o', markersize=10, c='k')
インスタンスの生成
code:python
p1 = Point(2,3)
p2 = Point(-1,-2)
インスタンスの属性へのアクセス
code:python
print(p1.x, p1.y)
print(p2.x, p2.y)
draw関数の呼び出し
code:python
#呼び出し時にselfは含まれないので、引数なしで呼び出す
p1.draw()
p2.draw()
plt.xlim(-4,4)
ply.ylim(-4,4)
plt.show()
クラスの継承
先ほどのPointクラスを再利用し円を描画する
code:python
#クラスの引数にすることでクラスの継承を行う
class Circle(Point):
def __init__(self, x, y, r):
#xとyは親クラスの属性として設定
super().__init__(x, y)
self.r = r
def draw(self):
c = patches.Circle(xy=self.x, self.y), radius=self.r, fc='b', ec='k')
ax.add_patch(c)
インスタンスの生成
code:python
c1 = Circle(1,0,2)
ax = plt.subplot()
p1.draw
p2.draw
c1.draw
plt.xlim(-4,4)
ply.ylim(-4,4)
plt.show()
インスタンスを関数として使う
__call__を使う
code:python
class H:
def __call_(self, x):
return 2*x**2 + 2
呼び出し
code:python
x = np.array(1,3,5)
h = H
y = h(x)
pytorchの基本機能
tensor変数の生成時には、必ず後ろにfloat関数の呼び出しをつけてdtypeを強制的にfloat32に変換する
code:python
r0 = torch.tensor(1.0).float()
print(r0.dtype)
例外)多値分類用の損失関数は、損失関数呼び出し時に第二引数に整数型を指定する必要がある
code:python
r1_np = np.array(1, 2, 3, 4, 5)
r1 = torch.tensor(r1_np).float()
r2 = r1.long()
#long関数を使うとdtypeにtorch.int64を持つ整数型テンソルが作れる
numpy tensor
reshape = view
code:python
torch.manual_seed(123)
r3 = torch.randn((3,2,2))
#2階化。要素数に−1を指定するとこの数を自動調整する
r4 = r3.view(3, -1)
#1階化
r5 = r3.view(-1)
item関数
item関数は、一階のテンソルまたは、要素が一つしかないテンソルにのみ有効
max関数
テンソル内で最も大きい数字を抜き出す
code:python
# 2つめの引数はどの軸で集約するかを意味する
torch.max(r2,1)
#要素を調べる。多値分類で予測ラベルを求めるときによく利用されるパターン
torch.max(r2,1)1
pytorchからnumpy
code:python
r2.data.numpy()
#注意点 テンソル側で値を変えるとnumpyも連動して値が変わる
#解決策
r2.data.numpy().copy()
自動微分機能
勾配=偏微分
変数xの定義
code:python
x_np = np.arange(-2,2.1,0.25)
#1. 勾配計算用変数の定義
x = torch.tensor(x_np,requires_grad=True,dtype=torch.float32)
#二次関数の計算(yもテンソル変数になる)
y = 2 * x**2 + 2
#勾配計算をするにあたり、計算対象の関数をスカラーにする
z = y.sum
#勾配計算
z.backward()
#勾配値の取得
print(x.grad)
#勾配の初期化
x.grad.zero_()