def newton(app: ArrayApplication, model: GLM, beta, X: BlockArray, y: BlockArray, tol: BlockArray, max_iter: int): for _ in range(max_iter): mu: BlockArray = model.forward(X, beta) g = model.gradient(X, y, mu, beta=beta) # These are PSD, but inv is faster than psd inv. beta += -app.inv(model.hessian(X, y, mu)) @ g if app.max(app.abs(g)) <= tol: break return beta
def irls(app: ArrayApplication, model: LogisticRegression, beta, X: BlockArray, y: BlockArray, tol: BlockArray, max_iter: int): for _ in range(max_iter): eta: BlockArray = X @ beta mu: BlockArray = model.link_inv(eta) s = mu * (1 - mu) + 1e-16 XT_s = (X.T * s) # These are PSD, but inv is faster than psd inv. XTsX_inv = app.inv(XT_s @ X) z = eta + (y - mu) / s beta = XTsX_inv @ XT_s @ z g = model.gradient(X, y, mu, beta) if app.max(app.abs(g)) <= tol: break return beta
def test_uops(app_inst: ArrayApplication): np_x = np.arange(100) ba_x = app_inst.array(np_x, block_shape=np_x.shape) assert np.allclose(np.abs(np_x), app_inst.abs(ba_x).get()) assert np.allclose(np.linalg.norm(np_x), app_inst.norm(ba_x).get())