2015年6月28日日曜日

Pythonで多項式回帰

pythonで最小二乗法で係数を求めるのには関数を定義しなければいけないが、高次の多項式だとクロスタームやらいっぱい出てきて書くのが大変だ。

scikit-learnのPolynomialFeaturesはそこを自動で計算してくれる。
例えば2次の場合degree=2とすれば、

[x1, y1] -> [x1**2, x1*y1, y1**2, x1, y1]

を計算してくれる。

それを使って多項式近似をする。
以下メモ。
Pipelineについては
http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

#original function
def f(x):
    return 2*x[0]**2 + 3*x[0]*x[1] + 4*x[1]**2 + 2*x[0] + 3*x[1] + 4

#observed data
xx, yy = np.meshgrid(np.linspace(-2, 2, 10), np.linspace(-2, 2, 10))
X = np.vstack((xx.reshape(-1), yy.reshape(-1))).T
y = list(map(f, X))

#fit the data
degree = 2
model = make_pipeline(PolynomialFeatures(degree), Ridge())
model.fit(X, y)

#accessing to the coeffs
#(model is a Pipeline.)
print(model.steps[1][1].coef_)


2015年6月27日土曜日

Python でサクッとLeast Square fit

Pythonで最小二乗を使うときはサクッと以下のように行おう。

import numpy as np
from scipy.optimize import leastsq

def func(c, x):
    return c[0]*x**2 + c[1]*x + c[2] 

def errfunc(c, x, t):
    return t - func(c, x)

#observed data and initial guess
x = np.linspace(-5, 5, 100)
t = 4*x**2 + 1 
c0 = [0, 0, 0]

leastsq(errfunc, c0, args=(x, t))


2015年6月2日火曜日

AnacondaでPython2と3のIPython notebookを起動する。

Pythonで計算をするときはAnacondaを入れとけばとりあえず色々できる。

Python2と3の両方を使うためにAnacondaとAnaconda3を2つインストールしていたが、そんなことしなくてもよいことがわかった。Anaconda3でPython2を扱う方法をメモしておく。


まず、AnacondaでPython2の環境を作る。これはいろいろなサイトに載っている通りに行う。




>conda create -n python2 python=2.7 anaconda




IPython notebookをPython2で使うときは



>activate python2
>ipython notebook




SublimetextでPython2を使いたいときは

{
    "shell": true,
    "cmd": ["C:\\Users\\myname\\Anaconda3\\envs\\python2\\python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)"
}