soy-curd's blog

へぼプログラマーです [https://twitter.com/soycurd1]

最急降下法をPythonで実装した

関数x2 + xは、どうやら最小値がひとつだけ存在するらしい。どうしてもその値を知りたくなったので、最急降下法を使ってPythonでその値を求めてみた。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

learning_late = 0.01
loop_max = 1000

def main():
    
    initial = random.uniform(-10, 10)
    old = initial
    new = 0.0
    for _ in range(1000):
        
        # 更新式
        new = old - learning_late * diff_func(old)
        
        # 目的関数の値を確認
        y = object_func(new)
        print(y)
        
        # 値を更新
        old = new
        
    print(new, y)
        
    
# 目的関数
def object_func(x):
    return x * x + x
    
# x ^ 2 + x の微分
def diff_func(x):
    return 2 * x + 1

if  __name__=='__main__':
    main()

これを実行すると、

# x、y
(-0.5000000145792641, -0.24999999999999978)

と、xが-0.5付近の時に目的の関数が最小値となることがわかった。なるほどというかんじ。

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)