機械学習1章・2章
教師あり学習
教師なし学習
強化学習
その他
半教師学習
転移学習
学習データが不足している際に有効
教師あり学習
教師あり学習における学習データは、正解ラベルと特徴量から構成される
既知のパターンを検知
教師なし学習
学習データに正解ラベルを含まない(データ全体の性質を学習する)
未知のパターンの発見
手法)クラスタリング、GAN(敵対的生成ネットワーク、画像生成、アソシエーション分析
強化学習
報酬を手がかりに、環境に適した行動を学習する手法
手法)イプシロング・グリーディー
半教師学習
手法)
分類機に基づく手法ー自己訓練
データに基づく手法ー半教師ありK近傍法
深層学習
単体で機械学習を行えるユニットを、並列・多段で繋げて使い倒すような機械学習
実装
コンテナデータ型の変数に注意
.copyを使うことによって新たなコンテナデータを作成できる
code:py
y = x
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
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):
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
h = H
y = h(x)
pytorchの基本機能
tensor変数の生成時には、必ず後ろにfloat関数の呼び出しをつけてdtypeを強制的にfloat32に変換する
code:python
r0 = torch.tensor(1.0).float()
print(r0.dtype)
例外)多値分類用の損失関数は、損失関数呼び出し時に第二引数に整数型を指定する必要がある
code:python
r1 = torch.tensor(r1_np).float()
r2 = r1.long()
numpy tensor
reshape = view
code:python
torch.manual_seed(123)
r3 = torch.randn((3,2,2))
r4 = r3.view(3, -1)
r5 = r3.view(-1)
item関数
item関数は、一階のテンソルまたは、要素が一つしかないテンソルにのみ有効
max関数
テンソル内で最も大きい数字を抜き出す
code:python
# 2つめの引数はどの軸で集約するかを意味する
torch.max(r2,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)
x = torch.tensor(x_np,requires_grad=True,dtype=torch.float32)
y = 2 * x**2 + 2
z = y.sum
z.backward()
print(x.grad)
x.grad.zero_()