Source code for fem.continuous.fit
import numpy as np
from scipy.special import erf
from numpy.linalg import solve
from .. import fortran_module
[docs]class model(object):
def __init__(self):
pass
[docs] def fit(self, x, y=None, iters=100, atol=1e-8, rtol=1e-5, impute=False):
x = np.array(x)
n = x.shape[0]
if y is None:
impute = True
y = x
w, disc, it = fortran_module.fortran_module.continuous_fit(
x, y, iters, atol, rtol, impute)
disc = [d[1:it[i]] for i, d in enumerate(disc)]
self.w = w
self.disc = disc
self.x = x
self.y = y
self.n = n
self.iters = iters
self.atol = atol
self.rtol = rtol
self.impute = impute
[docs] def predict(self, x):
w = self.w
return x + w.dot(x)
[docs]def fit(x, y=None, iters=100, atol=1e-8, rtol=1e-5, impute=False):
dt = 1.0
sqrt_dt = np.sqrt(dt)
sqrt_2 = np.sqrt(2)
rat = sqrt_dt / sqrt_2
s = np.sign(y - x)
mean_x = x.mean(1)
cov_x = np.cov(x)
x_mean0 = x - mean_x[:, np.newaxis]
w = np.empty((n, n))
d = []
for i in range(n):
res = fit_i(i, x, s, cov_x, x_mean0, iters, impute)
w[i] = res[0]
d.append(res[1])
w /= rat
[docs]def fit_i(i, x, s, cov_x, x_mean0, iters, impute):
n, l = x.shape
w = np.zeros(n)
w[i] = 1
erf_last = erf(x[i]) + 1
e = []
for it in range(iters):
h = w.dot(x)
erf_next = erf(h)
ei = np.linalg.norm(erf_next - erf_last)
e.append(ei)
if ei < 1e-5:
break
erf_last = erf_next.copy()
h *= s[i] / erf_next
w = solve(cov_x, x_mean0.dot(h) / (l - 1))
if impute:
w[i] = 0
return w, e[1:]