狠狠撸

狠狠撸Share a Scribd company logo
式を書くだけで
最適化計算してほしい!
~CVXPY編~
Python東海 #43 (2023.7.8)
H.Hiro (Twitter: @h_hiro_)
自己紹介
? H.Hiro (Twitter: @h_hiro_)
? Python東海の初参加は第29回(2016.2.6)
? 比較的不定期参加感
? 本業:アルゴリズム作ったりデータ分析したりしてる某
研究員
? ちょっとした処理はPythonで書くことが多いが、パ
フォーマンスまで考えたプログラムを書きたいときは
C++とかを使うことも
? 趣味ではPythonよりもRubyが利用多いです
? 最近Ruby東海も復活したのですよね(行きました)
問題
「x2 + 4xの最小値を求めよ」みたいな、式と最適化条件
だけ渡して計算してほしい
? このような問題は一般には難しい
? 式がどんなに複雑でもうまくいく方法は構築困難
? 「最適化しやすいとわかるなら計算し、そうでないなら
“私はその問題は対応できません”と返す」、というライ
ブラリならある
? そのひとつがCVXPY
前提知識:凸関数
? 「2点を直線で結ぶと、関数値は
必ずその下に来る」ような関数
? このような関数は、最小化がしや
すいことが知られている
? 先程の例「x2 + 4xの最小値を
求めよ」もそのひとつ
CVXPYは、凸関数に特化して最小
化をしてくれるライブラリ
例
import cvxpy as cp
x = cp.Variable(1, name="x")
# 1は「1個の変数」の意味
func = x ** 2 + 4 * x
obj = cp.Minimize(func)
prob = cp.Problem(obj)
prob.solve()
https://www.cvxpy.org/tutorial/intro/index.html
をもとに作成
結果
prob.value # => -4.0 (関数値自体の最小値)
{v.name():v.value for v in prob.variables()}
# => x: [-2.0] (最小値を実現するときの変数値)
高校数学で出てきた2次関数の最小値の要領で計算す
れば、同じ結果になるはず
難しいところ
あくまで、ライブラリが「凸関数と判断可能な形で」書い
てあげないとならない!
例えば func = x ** 2 + 4 * x
の代わりに func = x * x + 4 * x
と書いても動いてくれない…
(と癖が強いので、使う際には注意されたい)
もう少し複雑な例
? 「線形回帰」により、データの入力値と出力値に線形
関係があると仮定して、その最善な関係性を求める
? その際には、データ点ごとに「入力値から求めた出力
値の予測値」と「真の出力値」の二乗誤差の総和を小
さくするのが最も一般的
もう少し複雑な例
? 「線形回帰」により、データの入力値と出力値に線形
関係があると仮定して、その最善な関係性を求める
? その際には、データ点ごとに「入力値から求めた出力
値の予測値」と「真の出力値」の二乗誤差の総和を小
さくするのが最も一般的
? (このこと自体は、scikit-learnのLinearRegression
でできるのですが、CVXPYで書いてみます)
もう少し複雑な例
import cvxpy as cp
import numpy as np
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
input = diabetes['data'][:, [2]]
output = diabetes['target']
n = output.size
w = cp.Variable(1, name="w")
b = cp.Variable(1, name="b")
func = cp.sum_squares(input @ w + np.ones(n) * b - output)
obj = cp.Minimize(func)
prob = cp.Problem(obj)
prob.solve() 「二乗の和」は、CVXPYで用意して
いるこの関数を通さないと、凸関数
と認識してくれないと思われる
wが「直線の傾き」、bが「直線の切片」
データはもともとscikit-learnで用意され
ているもの(出力値を予測するための特
徴量は1つに絞った)
結果
? w = 949.435
? b = 152.133
おわりに
? 式と最適化条件だけ渡して計算する、というのはいろ
いろ技術が考えられているところ(だと思われます)
? そのうち、CVXPYで扱うような「凸関数限定の」最適
化は比較的早くから(?)行われているはず
? 扱いやすいので
? 数値計算がこの形に乗るなら使ってみるとよいかも?
という紹介でした!

More Related Content

式を书くだけで最适化计算してほしい!~颁痴齿笔驰编~