マイ備忘録

あくまで個人の意見、メモです。

pythonでfitting

簡単な回帰モデルを作らないと行けなくなりそうなので、事前確認。 pythonはド素人なもので。

環境構築

こういうテスト環境はdockerでやりたいので、以下を参考にさせて頂きました。

Alpine Linuxにnumpy, scipy, scikit-learn, pandasを入れた - Qiita

Dockerfile

FROM alpine:latest

RUN apk --update-cache \
    add musl \
    linux-headers \
    gcc \
    g++ \
    make \
    gfortran \
    openblas-dev \
    python3 \
    python3-dev \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev

RUN pip3 install --upgrade pip
RUN pip3 install numpy \
    scipy  \
    scikit-learn \
    matplotlib \
    pandas

RUN mkdir /app

build command

docker build ./ -t python-test

script準備&実行

docker run -it --name python-test-container python-test
docker cp ./test.py python-test-container:/app/test.py
docker start python-test-container
docker exec python-test-container python3 /app/test.py
docker cp python-test-container:/app/plot.png plot.png

データ的に反比例の関数になるはずなので、scipy.optimizeのcurve_fitを使う。python、すごく便利ですね。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitfunc(x, a):
    return a/x

x = np.array([それっぽい適当なデータ])
y = np.array([それっぽい適当なデータ])

param, cov = curve_fit(fitfunc, x, y)
list_y_fit = []
for num in x:
    list_y_fit.append(param[0] / num)

array_y_fit = np.array(list_y_fit)
plt.plot(x, y, marker="o", linestyle="None")
plt.plot(x, array_y_fit, marker="")
plt.savefig('/app/plot.png')
print("a = " + str(param[0]))
plt.show()

結果はこんな感じ。

f:id:takata3:20190425224841p:plain