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]def fit(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.copy()
# 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
w, d, it = fortran_module.fortran_module.continuous_fit(
x, y, iters, atol, rtol, impute)
d = [di[1:it[i]] for i, di in enumerate(d)]
return w, d
[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:]