def non_linear_inverse(self, y, verbose=False):
x_lin = self.linear_inverse(y)
rmse_lin = ((y - self.execute(x_lin)) ** 2).sum(axis=1).mean() ** 0.5
# scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08,
# xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=0.0, factor=100, diag=None)
x_nl = numpy.zeros_like(x_lin)
y_dim = y.shape[1]
x_dim = x_lin.shape[1]
if y_dim < x_dim:
num_zeros_filling = x_dim - y_dim
else:
num_zeros_filling = 0
if verbose:
print("x_dim=", x_dim, "y_dim=", y_dim, "num_zeros_filling=", num_zeros_filling)
y_long = numpy.zeros(y_dim + num_zeros_filling)
for i, y_i in enumerate(y):
y_long[0:y_dim] = y_i
if verbose:
print("x_0=", x_lin[i])
print("y_long=", y_long)
plsq = scipy.optimize.leastsq(func=f_residual, x0=x_lin[i], args=(self, y_long), full_output=False)
x_nl_i = plsq[0]
if verbose:
print("x_nl_i=", x_nl_i, "plsq[1]=", plsq[1])
if plsq[1] != 2:
print("Quitting: plsq[1]=", plsq[1])
# quit()
x_nl[i] = x_nl_i
print("|E_lin(%d)|=" % i, ((y_i - self.execute(x_lin[i].reshape((1, -1)))) ** 2).sum() ** 0.5)
print("|E_nl(%d)|=" % i, ((y_i - self.execute(x_nl_i.reshape((1, -1)))) ** 2).sum() ** 0.5)
rmse_nl = ((y - self.execute(x_nl)) ** 2).sum(axis=1).mean() ** 0.5
print("rmse_lin(all samples)=", rmse_lin, "rmse_nl(all samples)=", rmse_nl)
return x_nl
评论列表
文章目录