逆解析っぽいことをやりたい

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_

#全材料の合計は1

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



この記事が気に入ったらサポートをしてみませんか?