逆解析っぽいことをやりたい
a, b, cの混合物の融点データからモデルを作成し、最も融点が低くなる組成を得たい
とりあえずまずはpythonのコードを書くゾ~
import pandas as pd
#データの読み込み
df = pd.read_csv("melting_point.csv", index_col = 0)
y = df.iloc[:, 0]
x = df.iloc[:, 1:]
#標準化
x_scaled = (x-x.mean())/x.std()
y_scaled = (y-y.mean())/y.std()
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_scaled, y_scaled)
y_pred = model.predict(x_scaled)
from sklearn import metrics
metrics.r2_score(y_scaled, y_pred)
#今回はコードを書くのが目的でデータがクソ (数少ない、抜け多くて適当に埋めた)なので、モデルもクソなスコアだった
from pulp import *
m = LpProblem(sense=LpMinimize) # 数理モデル
#変数の範囲 >= 0
#後述の条件含めて 0 ~ 1.0の間になってるはず
a = LpVariable("a", lowBound=0)
b = LpVariable("b", lowBound=0)
c = LpVariable("c", lowBound=0)
#a , b, c結合してmodel.predictでもよいのだろうけど、ひとまず変数でばらして代入している。線形モデルだから多分これでいいはず
m += model.coef_[0] * a + model.coef_[1] * b + model.coef_[2] * c + model.intercept_
m += a + b + c == 1
#材料aの占める割合は0 .7以下
m += a <= 0.7
m.solve()
print(value(a), value(b), value(c))
結果:0.7 0.3 0.0
cはいらない子になったとさ
==================================================
完走した感想
ほとんどコピペコードでnote書いてて恥ずかしくないんですか?
==================================================
参考にさせて頂いたサイト
PuLP を使ってみた:https://note.crohaco.net/2018/pulp-first-step/
最適化におけるPython:https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0
この記事が気に入ったらサポートをしてみませんか?