(보충) 난택화 부립엽 특징의 척추 회귀를 사용

1. 목적


앞의 글에서 학습 데이터 수가 적은 계산 시간의 관점에서 볼 때 난선화 부립엽 특징을 사용할 때의 이득을 보지 못했다.본고에서 교사의 데이터 수를 매개 변수로 하여 내핵법과 부립엽 특징을 난선화할 때의 계산 시간을 확인한다.또한 다차원 입력에 대응하는 난택화 부립엽 특징을 사용하는 척추 회귀의 실현을 나타낸다.
마지막 게시물
https://qiita.com//hiroponX/items/448daec79fac2ffd82a0

2. 시간 계산


먼저 척추 회귀에서 내핵법과 부립엽 특징을 난선화할 때의 계산 시간에 대해 지난번에 실현된 종류를 사용하여 확인한다.교사 데이터는 원고와 같습니다. $g(x) = xsin(x) +ε$생성에 따라($)ε$평균 0, 방차 0.2의 정적 분포).

*Rff: 무작위 부립엽 특징, mf는 $u$의 샘플링 수를 나타냅니다.
주의해야 할 것은 난선화 부립엽 특징을 사용할 때 일반적인 척추 회귀와 마찬가지로 계산 시간은 $O(N)$이다.참고로 scikit-learn의 내핵척추 회귀(sklearn.kernel_ridge.KernelRidge)의 계산 시간도 보여 줍니다.역시 코어법의 계산 시간은 $O(N^2)$이기 때문에 대규모 데이터에 적용하기 어렵다.

3. 다차원화


다음은 입력 값이 다차원일 때의 구현입니다.다차원 변경은 삼각 함수에 한정된 내용입니다. $u$와 $x$의 곱셈에서 벡터 $u^T$와 $x$의 곱셈으로 변경되었습니다.1차원 때와 마찬가지로 $u$는 $p(u)$에 따라 $M$개를 무작위로 샘플링합니다.단, 1차원과 달리 $u$는 입력 비트 $D$와 같은 비트의 벡터입니다.
\begin{align}
k(x, x_n)&=\int_{R}\exp(iu^T(x-x_n))dp(u)=\int_{R}\cos(u^T(x-x_n))dp(u)\\
&\approx\sum_{m=1}^M\cos(u_m^T(x-x_n))\\
&=\sum_{m=1}^M\cos(u_m^Tx)\cos(u_m^Tx)+\sin(u_m^Tx)\sin(u_m^Tx)
\end{align}
내핵은 하식과 같은 기함수로 분해될 수 있다.
$$k(x, x_n)=\sum_{m=1}^{2M}\phi_m(x)\phi_m(x_n)$$
\begin{align}
&\phi_m(x)=\cos(u_m^Tx)\quad (m=1,2,3\dots,M)\\
&\phi_m(x)=\sin(u_{m-M}^Tx)\quad (m=M+1,M+2,M+3\dots,2M)\\
\end{align}
변경이 매우 적고 1차원에서 다차원으로 확장하기 쉽다.
rff.py
import numpy as np
class RffRegression(object):
    def __init__(self, lamda=0.1, sigma=1, mf=100):
        self.lamda = lamda
        self.sigma = sigma
        self.mf = mf

    def fit(self, X, t):
        self.X = X
        self.N = len(t)
        self.D = X.shape[1]
        self.u = np.random.normal(0, self.sigma*self.sigma, (self.mf, self.D))
        Phi = np.zeros((self.N, 2*self.mf))
        for n in range(self.N):
            Phi[n, :] = self.func(X[n,:])
        A = np.dot(Phi.T, Phi) + np.identity(2*self.mf) * self.lamda
        b = np.dot(Phi.T, t)
        self.w = np.linalg.solve(A, b)

    def predict(self, x):
        return np.dot(self.w, self.func(x))

    def func(self, x1):
        cosf = np.cos(np.dot(self.u, x1))
        sinf = np.sin(np.dot(self.u, x1))
        return np.hstack((cosf, sinf))
여기서 실시된 회귀 모델을 사용하여 $f(x, y)=\sin(x\cos(y)$로 생성된 2500점의 교사 데이터를 바탕으로 $f(x, y)$가 재현될 수 있는지 확인합니다.그리고 이곳의 샘플링 수는 1000이다.
다음 그림은 결과입니다.각각 왼쪽 상단은 2500분의 교사 데이터로 왼쪽 하단은 $f(x, y)$, 오른쪽 하단은 회귀 모형 재현의 $f(x, y)$, 오른쪽 상단은 진정한 $f(x, y)$와 회귀 모형 재현의 $f(x, y)$의 차이의 절대값이다.회귀 모델은 대체로 $f(x, y)$를 잘 재현했다.

4. 요약


원고의 보충으로 척추 회귀에서 내핵법과 난택화 부립엽 특징을 사용할 때의 계산 시간의 확인, 그리고 난택화 부립엽 특징을 사용하는 척추 회귀의 다차원 입력이 대응하는 것을 나타냈다.

좋은 웹페이지 즐겨찾기