機能がフォームである場合
次いで、十分なトレーニング機能所定の線形回帰を用いて学習することができるおよびターゲット値。これは、台形規則によって積分を近似することで行われます:
で
ここで、F[f(x)]=∫abf(x)g(x)dx
g(x)fi(x), i=0,…,MF[fi(x)]F[f(x)]=Δx[f0g02+f1g1+...+fN−1gN−1+fNgN2]
F[f(x)]Δx=y=f0g02+f1g1+...+fN−1gN−1+fNgN2
f0=a, f1=f(x1), ..., fN−1=f(xN−1), fN=b,
a<x1<...<xN−1<b, Δx=xj+1−xj
我々が持っていると仮定訓練機能。各について、
Mfi(x), i=1,…,MiF[fi(x)]Δx=yi=fi0g02+fi1g1+...+fi,N−1gN−1+fiNgN2
次に、値は、説明変数の行列を使用した線形回帰問題の解として見つかり
とターゲットベクトル。g0,…,gNX=⎡⎣⎢⎢⎢⎢f00/2f10/2…fM0/2f01f11…fM1…………f0,N−1f1,N−1…fM,N−1f0N/2f1N/2…fMN/2⎤⎦⎥⎥⎥⎥
y=[y0,…,yM]
簡単な例でテストしてみましょう。がガウスであると仮定します。g(x)
import numpy as np
def Gaussian(x, mu, sigma):
return np.exp(-0.5*((x - mu)/sigma)**2)
ドメイン離散化しますx∈[a,b]
x = np.arange(-1.0, 1.01, 0.01)
dx = x[1] - x[0]
g = Gaussian(x, 0.25, 0.25)
トレーニング関数として、異なる周波数の正弦と余弦を考えてみましょう。ターゲットベクトルの計算:
from math import cos, sin, exp
from scipy.integrate import quad
freq = np.arange(0.25, 15.25, 0.25)
y = []
for k in freq:
y.append(quad(lambda x: cos(k*x)*exp(-0.5*((x-0.25)/0.25)**2), -1, 1)[0])
y.append(quad(lambda x: sin(k*x)*exp(-0.5*((x-0.25)/0.25)**2), -1, 1)[0])
y = np.array(y)/dx
ここで、リグレッサマトリックス:
X = np.zeros((y.shape[0], x.shape[0]), dtype=float)
print('X',X.shape)
for i in range(len(freq)):
X[2*i,:] = np.cos(freq[i]*x)
X[2*i+1,:] = np.sin(freq[i]*x)
X[:,0] = X[:,0]/2
X[:,-1] = X[:,-1]/2
線形回帰:
from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(X, y)
ghat = reg.coef_
import matplotlib.pyplot as plt
plt.scatter(x, g, s=1, marker="s", label='original g(x)')
plt.scatter(x, ghat, s=1, marker="s", label='learned $\hat{g}$(x)')
plt.legend()
plt.grid()
plt.show()
データは実際の関数の周りにいくらか広がっていますが、ガウス関数はうまく学習されています。がゼロに近い場合、広がりは大きくなります。この広がりは、Savitzky-Golayフィルターで平滑化できます。g(x)
from scipy.signal import savgol_filter
ghat_sg = savgol_filter(ghat, 31, 3) # window size, polynomial order
plt.scatter(x, g, s=1, marker="s", label='original g(x)')
plt.scatter(x, ghat, s=1, marker="s", label='learned $\hat{g}$(x)')
plt.plot(x, ghat_sg, color="red", label='Savitzky-Golay $\hat{g}$(x)')
plt.legend()
plt.grid()
plt.show()
一般に、に直線的に依存しないであり、
を離散化した後も
関数として書き込むことができます。これは、の汎関数にも当てはまります。
は有限差分で近似できる
ため。の非線形関数であるF[f(x)]f(x)F[f(x)]=∫abL(f(x))dx
f0,f1…,fNxF[f(x)]=∫abL(f(x),f′(x))dx
f′f0,f1…,fNLf0,f1…,fN、それはおそらく非線形の方法、例えばニューラルネットワークやSVMでそれを学ぼうとするかもしれませんが、それはおそらく線形の場合ほど簡単ではありません。