123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748 |
- import numpy as np
- import scipy as sp
- from scipy.optimize import root
- import scipy.linalg as sla
- from scipy.stats import norm
- def get_acc(u, labels, unlabeled = None):
- u_ = np.sign(u)
- u_[u_ == 0] = 1
- if unlabeled is None:
- corr = sum(1.*(u_ == labels))
- return corr, corr/u.shape[0]
- else:
- corr = sum(1.*(u_[unlabeled] == labels[unlabeled]))
- return corr, corr/len(unlabeled)
- def get_acc_multi(u, labels, unlabeled=None):
- """
- Assuming that u and labels are NOT in one-hot encoding. i.e. ith entry of
- u and labels is the integer class in {0,1,2,...num_classes}.
- """
- if unlabeled is None:
- corr = sum(1.*(u == labels))
- return corr, corr/u.shape[0]
- else:
- corr = sum(1.*(u[unlabeled] == labels[unlabeled]))
- return corr, corr/len(unlabeled)
- ############# Gaussian Regression functions (Full Storage Model)##############
- def gr_C(Z, gamma, d, v):
- H_d = len(Z) *[1./gamma**2.]
- vZ = v[Z,:]
- post = sp.sparse.diags(d, format='csr') \
- + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- return v @ sp.linalg.inv(post) @ v.T
- def gr_map(Z, y, gamma, d, v):
- C = gr_C(Z, gamma, d, v)
- return (C[:,Z] @ y)/(gamma * gamma)
- ########### ProbitNorm Jacobian and Hessian entry Calculations ##########
- def jac_calc(uj_, yj_, gamma):
- return -yj_*(norm.pdf(uj_*yj_, scale=gamma)/norm.cdf(uj_*yj_, scale=gamma))
- def hess_calc(uj_, yj_, gamma):
- return (norm.pdf(uj_*yj_,scale=gamma)**2 - pdf_deriv(uj_*yj_, gamma)*norm.cdf(uj_*yj_,scale=gamma))/(norm.cdf(uj_*yj_,scale=gamma)**2)
- ########### (Full Storage Model) Functions #############
- def probit_map_dr(Z_, yvals, gamma, Ct):
- """
- Probit MAP estimator, using dimensionality reduction via Representer Theorem.
- *** This uses cdf of normal distribution ***
- """
- Ctp = Ct[np.ix_(Z_,Z_)]
- Jj = len(yvals)
- def f(x):
- vec = [jac_calc(x[j], yj, gamma) for j,yj in enumerate(yvals)]
- if np.any(vec == np.inf):
- print('smally in f')
- return x + Ctp @ vec
- def fprime(x):
- H = Ctp * np.array([hess_calc(x[j],yj, gamma)
- for j, yj in enumerate(yvals)])
- if np.any(H == np.inf):
- print('smally')
- H[np.diag_indices(Jj)] += 1.0
- return H
- x0 = np.random.rand(Jj)
- x0[np.array(yvals) < 0] *= -1
- res = root(f, x0, jac=fprime)
- #print(np.allclose(0., f(res.x)))
- tmp = sla.inv(Ctp) @ res.x
- return Ct[:, Z_] @ tmp
- def Hess_inv(u, Z, y, gamma, Ct):
- Ctp = Ct[np.ix_(Z, Z)]
- H_d = np.zeros(len(y))
- for i, (j, yj) in enumerate(zip(Z, y)):
- H_d[i] = 1./hess_calc(u[j], yj, gamma)
- temp = sp.linalg.inv(sp.sparse.diags(H_d, format='csr') + Ctp)
- return Ct - Ct[:, Z] @ temp @ Ct[Z, :]
- def Hess_inv_st(u, Z, y, w, v, gamma, debug=False):
- H_d = np.zeros(len(Z))
- vZ = v[Z,:]
- for i, (j, yj) in enumerate(zip(Z, y)):
- H_d[i] = hess_calc2(u[j], yj, gamma)
- post = sp.sparse.diags(w, format='csr') \
- + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- return v @ sp.linalg.inv(post) @ v.T
- ################ Logistic and Hessian entry Calculations##################
- def jac_calc2(uj_, yj_, gamma):
- return -yj_*(np.exp(-uj_*yj_/gamma))/(gamma*(1.0 + np.exp(-uj_*yj_/gamma)))
- def hess_calc2(uj_, yj_, gamma):
- return np.exp(-uj_*yj_/gamma)/(gamma**2. * (1. + np.exp(-uj_*yj_/gamma))**2.)
- ########### (Full Storage Model) Functions #############
- def probit_map_dr2(Z_, yvals, gamma, Ct):
- """
- Probit MAP estimator, using dimensionality reduction via Representer Theorem.
- *** This uses logistic cdf ***
- """
- Ctp = Ct[np.ix_(Z_,Z_)]
- Jj = len(yvals)
- def f(x):
- vec = [jac_calc2(x[j], yj, gamma)
- for j,yj in enumerate(yvals)]
- return x + Ctp @ vec
- def fprime(x):
- H = Ctp * np.array([hess_calc2(x[j], yj, gamma)
- for j, yj in enumerate(yvals)])
- if np.any(H == np.inf):
- print('smally')
- H[np.diag_indices(Jj)] += 1.0
- return H
- x0 = np.random.rand(Jj)
- x0[np.array(yvals) < 0] *= -1
- res = root(f, x0, jac=fprime)
- tmp = sla.inv(Ctp) @ res.x
- return Ct[:, Z_] @ tmp
- def Hess2_inv(u, Z, y, gamma, Ct):
- Ctp = Ct[np.ix_(Z, Z)]
- H_d = np.zeros(len(y))
- for i, (j, yj) in enumerate(zip(Z, y)):
- H_d[i] = 1./hess_calc2(u[j], yj, gamma)
- temp = sp.linalg.inv(sp.sparse.diags(H_d, format='csr') + Ctp)
- return Ct - Ct[:, Z] @ temp @ Ct[Z, :]
- def Hess_inv_st2(u, Z, y, w, v, gamma, debug=False):
- H_d = np.zeros(len(Z))
- vZ = v[Z,:]
- for i, (j, yj) in enumerate(zip(Z, y)):
- H_d[i] = hess_calc2(u[j], yj, gamma)
- post = sp.sparse.diags(w, format='csr') \
- + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- return v @ sp.linalg.inv(post) @ v.T
- ##################################################################################
- ################### Helper Functions for Reduced Model ###########################
- ##################################################################################
- def Hess_inv_st_alpha(alpha, y, d, v_Z, gamma):
- '''
- This method keeps everything in the "alpha"-space, of dimension num_eig x num_eig
- '''
- Dprime = sp.sparse.diags([1./hess_calc(np.inner(v_Z[i,:],alpha), yi, gamma) for i, yi in enumerate(y)], format='csr')
- A = d[:, np.newaxis] * ((v_Z.T @ sp.linalg.inv(Dprime + v_Z @ (d[:, np.newaxis] * (v_Z.T))) @ v_Z) * d)
- return np.diag(d) - A
- def Hess_inv_st2_alpha(alpha, y, d, v_Z, gamma):
- '''
- This method keeps everything in the "alpha"-space, of dimension num_eig x num_eig
- '''
- Dprime = sp.sparse.diags([1./hess_calc2(np.inner(v_Z[i,:],alpha), yi, gamma) for i, yi in enumerate(y)], format='csr')
- A = d[:, np.newaxis] * ((v_Z.T @ sp.linalg.inv(Dprime + v_Z @ (d[:, np.newaxis] * (v_Z.T))) @ v_Z) * d)
- return np.diag(d) - A
- def probit_map_st_alpha(Z, y, gamma, w, v):
- n,l = v.shape[1], len(y)
- def f(x):
- vec = np.zeros(l)
- for j, (i,yi) in enumerate(zip(Z,y)):
- vec[j] = - jac_calc(np.inner(v[i,:], x), yi, gamma)
- return w * x - v[Z,:].T @ vec
- def fprime(x):
- vec = np.zeros(l)
- for j, (i,yi) in enumerate(zip(Z, y)):
- vec[j] = -hess_calc(np.inner(v[i,:], x), yi, gamma)
- H = (-v[Z,:].T * vec) @ v[Z,:]
- H[np.diag_indices(n)] += w
- return H
- x0 = np.random.rand(len(w))
- res = root(f, x0, jac=fprime)
- #print(f"Root Finding is successful: {res.success}")
- return res.x
- def probit_map_st2_alpha(Z, y, gamma, w, v):
- n,l = v.shape[1], len(y)
- def f(x):
- vec = np.zeros(l)
- for j, (i,yi) in enumerate(zip(Z,y)):
- vec[j] = - jac_calc2(np.inner(v[i,:], x), yi, gamma)
- return w * x - v[Z,:].T @ vec
- def fprime(x):
- vec = np.zeros(l)
- for j, (i,yi) in enumerate(zip(Z, y)):
- vec[j] = -hess_calc2(np.inner(v[i,:], x), yi, gamma)
- H = (-v[Z,:].T * vec) @ v[Z,:]
- H[np.diag_indices(n)] += w
- return H
- x0 = np.random.rand(len(w))
- res = root(f, x0, jac=fprime)
- #print(f"Root Finding is successful: {res.success}")
- return res.x
- # class Classifier(object):
- # def __init__(self, name, gamma, tau, v=None, w=None, Ct=None):
- # self.gamma = gamma
- # self.tau = tau
- # self.v = v
- # self.w = w
- # if Ct is not None:
- # self.Ct = Ct
- # else:
- # self.d = (self.tau ** (2.)) * ((self.w + self.tau**2.) ** (-1.))
- # self.Ct = (self.v * self.d) @ self.v.T
- # self.name = name
- # return
- #
- # def get_m(self, Z, y):
- # if self.name == "probit":
- # if len(y) <= len(self.w):
- # return probit_map_dr(Z, y, self.gamma, self.Ct)
- # else:
- # return probit_map_st(Z, y, self.gamma, 1./self.d, self.v)
- # elif self.name == "probit2":
- # if len(y) <= len(self.w):
- # return probit_map_dr2(Z, y, self.gamma, self.Ct)
- # else:
- # return probit_map_st2(Z, y, self.gamma, 1./self.d, self.v)
- # elif self.name == "gr":
- # #return gr_map(Z, y, self.gamma, self.Ct)
- # return gr_map(Z, y, self.gamma, 1./self.d, self.v)
- # else:
- # pass
- #
- # def get_C(self, Z, y, m):
- # if self.name in ["probit", "probit-st"]:
- # if len(y) > len(self.w):
- # return Hess_inv_st(m, Z, y, 1./self.d, self.v, self.gamma)
- # else:
- # return Hess_inv(m, Z, y, self.gamma, self.Ct)
- # elif self.name in ["probit2", "probit2-st"]:
- # if len(y) > len(self.w):
- # return Hess_inv_st2(m, Z, y, 1./self.d, self.v, self.gamma)
- # else:
- # return Hess2_inv(m, Z, y, self.gamma, self.Ct)
- # elif self.name in ["gr"]:
- # #return gr_C(Z, self.gamma, self.Ct)
- # return gr_C(Z, self.gamma, 1./self.d, self.v)
- # else:
- # pass
- #
- #
- # class Classifier_HF(object):
- # def __init__(self, tau, L):
- # self.tau = tau
- # if sps.issparse(L):
- # self.sparse = True
- # self.L = L + self.tau**2. * sps.eye(L.shape[0])
- # else:
- # self.sparse = False
- # self.L = L + self.tau**2. * np.eye(L.shape[0])
- # return
- #
- # def get_m(self, Z, y):
- # Zbar = list(filter(lambda x: x not in Z, range(self.L.shape[0])))
- # self.m = -self.get_C(Z, Zbar=Zbar) @ self.L[np.ix_(Zbar, Z)] @ y
- # return self.m
- #
- # def get_C(self, Z, Zbar=None):
- # if Zbar is None:
- # Zbar = list(filter(lambda x: x not in Z, range(self.L.shape[0])))
- # if self.sparse:
- # self.C = scipy.sparse.linalg.inv(self.L[np.ix_(Zbar, Zbar)]).toarray() # inverse will be dense anyway
- # return self.C
- # else:
- # self.C = sla.inv(self.L[np.ix_(Zbar, Zbar)])
- # return self.C
- #
- #
- # ###############################################################################
- # ############### Gaussian Regression Helper Functions ##########################
- #
- #
- # def get_init_post(C_inv, labeled, gamma2):
- # """
- # calculate the risk of each unlabeled point
- # C_inv: prior inverse (i.e. graph Laplacian L)
- # """
- # N = C_inv.shape[0]
- # #unlabeled = list(filter(lambda x: x not in labeled, range(N)))
- # B_diag = [1 if i in labeled else 0 for i in range(N)]
- # B = sp.sparse.diags(B_diag, format='csr')
- # return sp.linalg.inv(C_inv + B/gamma2)
- #
- #
- # def calc_next_m(m, C, y, lab, k, y_k, gamma2):
- # ck = C[k,:]
- # ckk = ck[k]
- # ip = np.dot(ck[lab], y[lab])
- # val = ((gamma2)*y_k -ip )/(gamma2*(gamma2 + ckk))
- # m_k = m + val*ck
- # return m_k
- #
- #
- # def get_probs(m, sigmoid=False):
- # if sigmoid:
- # return 1./(1. + np.exp(-3.*m))
- # m_probs = m.copy()
- # # simple fix to get probabilities that respect the 0 threshold
- # m_probs[np.where(m_probs >0)] /= 2.*np.max(m_probs)
- # m_probs[np.where(m_probs <0)] /= -2.*np.min(m_probs)
- # m_probs += 0.5
- # return m_probs
- #
- #
- # def EEM_full(k, m, C, y, lab, unlab, m_probs, gamma2):
- # N = C.shape[0]
- # m_at_k = m_probs[k]
- # m_k_p1 = calc_next_m(m, C, y, lab, k, 1., gamma2)
- # m_k_p1 = get_probs(m_k_p1)
- # risk = m_at_k*np.sum([min(m_k_p1[i], 1.- m_k_p1[i]) for i in range(N)])
- # m_k_m1 = calc_next_m(m, C, y, lab, k, -1., gamma2)
- # m_k_m1 = get_probs(m_k_m1)
- # risk += (1.-m_at_k)*np.sum([min(m_k_m1[i], 1.- m_k_m1[i]) for i in range(N)])
- # return risk
- #
- #
- # def EEM_opt_record(m, C, y, labeled, unlabeled, gamma2):
- # m_probs = get_probs(m)
- # N = C.shape[0]
- # risks = [EEM_full(j, m, C, y, labeled, unlabeled, m_probs, gamma2) for j in range(N)]
- # k = np.argmin(risks)
- # return k, risks
- #
- #
- # def Sigma_opt(C, unlabeled, gamma2):
- # sums = np.sum(C[np.ix_(unlabeled,unlabeled)], axis=1)
- # sums = np.asarray(sums).flatten()**2.
- # s_opt = sums/(gamma2 + np.diag(C)[unlabeled])
- # k_max = unlabeled[np.argmax(s_opt)]
- # return k_max
- #
- #
- # def V_opt_record(C, unlabeled, gamma2):
- # ips = np.array([np.inner(C[k,:], C[k,:]) for k in unlabeled]).flatten()
- # v_opt = ips/(gamma2 + np.diag(C)[unlabeled])
- # k_max = unlabeled[np.argmax(v_opt)]
- # return k_max, v_opt
- #
- #
- # def V_opt_record2(u, C, unlabeled, gamma2, lam):
- # ips = np.array([np.inner(C[k,:], C[k,:]) for k in unlabeled]).flatten()
- # v_opt = ips/(gamma2 + np.diag(C)[unlabeled])
- # print(np.max(v_opt), np.min(v_opt))
- # v_opt += lam*(np.max(v_opt) + np.min(v_opt))*0.5*(1./np.absolute(u[unlabeled])) # add term that bias toward decision boundary
- # k_max = unlabeled[np.argmax(v_opt)]
- # return k_max, v_opt
- #
- #
- # def Sigma_opt_record(C, unlabeled, gamma2):
- # sums = np.sum(C[np.ix_(unlabeled,unlabeled)], axis=1)
- # sums = np.asarray(sums).flatten()**2.
- # s_opt = sums/(gamma2 + np.diag(C)[unlabeled])
- # k_max = unlabeled[np.argmax(s_opt)]
- # return k_max, s_opt
- #
- #
- #
- #
- # ################################################################################
- # ################## Plotting Helper Functions ###################################
- #
- #
- # def plot_iter(m, X, labels, labeled, k_next=-1, title=None, subplot=False):
- # '''
- # Assuming labels are +1, -1
- # '''
- # m1 = np.where(m >= 0)[0]
- # m2 = np.where(m < 0)[0]
- #
- # #sup1 = list(set(labeled).intersection(set(np.where(labels == 1)[0])))
- # #sup2 = list(set(labeled).intersection(set(np.where(labels == -1)[0])))
- #
- # corr1 = list(set(m1).intersection(set(np.where(labels == 1)[0])))
- # incorr1 = list(set(m2).intersection(set(np.where(labels == 1)[0])))
- # corr2 = list(set(m2).intersection(set(np.where(labels == -1)[0])))
- # incorr2 = list(set(m1).intersection(set(np.where(labels == -1)[0])))
- #
- # print("\tnum incorrect = %d" % (len(incorr1) + len(incorr2)))
- #
- # if k_next >= 0:
- # plt.scatter(X[k_next,0], X[k_next,1], marker= 's', c='y', alpha= 0.7, s=200) # plot the new points to be included
- # plt.title(r'Dataset with Label for %s added' % str(k_next))
- # elif k_next == -1:
- # if not title:
- # plt.title(r'Dataset with Initial Labeling')
- # else:
- # plt.title(title)
- #
- # plt.scatter(X[corr1,0], X[corr1,1], marker='x', c='b', alpha=0.2)
- # plt.scatter(X[incorr1,0], X[incorr1,1], marker='x', c='r', alpha=0.2)
- # plt.scatter(X[corr2,0], X[corr2,1], marker='o', c='r',alpha=0.15)
- # plt.scatter(X[incorr2,0], X[incorr2,1], marker='o', c='b',alpha=0.15)
- # # plt.scatter(X[corr1,0], X[corr1,1], marker='x', c='b', alpha=0.8)
- # # plt.scatter(X[incorr1,0], X[incorr1,1], marker='x', c='r', alpha=0.8)
- # # plt.scatter(X[corr2,0], X[corr2,1], marker='o', c='r',alpha=0.8)
- # # plt.scatter(X[incorr2,0], X[incorr2,1], marker='o', c='b',alpha=0.8)
- #
- # sup1 = list(set(labeled).intersection(set(np.where(labels == 1)[0])))
- # sup2 = list(set(labeled).intersection(set(np.where(labels == -1)[0])))
- # plt.scatter(X[sup1,0], X[sup1,1], marker='x', c='k', alpha=1.0)
- # plt.scatter(X[sup2,0], X[sup2,1], marker='o', c='k', alpha=1.0)
- # plt.axis('equal')
- # if subplot:
- # return
- # plt.show()
- # return
- #
- # ################################################################################
- # ########## MAP estimators of Probit model (with normal distribution's pdf )
- # ################################################################################
- #
- #
- def pdf_deriv(t, gamma):
- return -t*norm.pdf(t, scale = gamma)/(gamma**2)
- #
- # def jac_calc(uj_, yj_, gamma):
- # return -yj_*(norm.pdf(uj_*yj_, scale=gamma)/norm.cdf(uj_*yj_, scale=gamma))
- #
- #
- # def hess_calc(uj_, yj_, gamma):
- # return (norm.pdf(uj_*yj_,scale=gamma)**2 - pdf_deriv(uj_*yj_, gamma)*norm.cdf(uj_*yj_,scale=gamma))/(norm.cdf(uj_*yj_,scale=gamma)**2)
- #
- # def Hess(u, y, labeled, Lt, gamma, debug=False):
- # """
- # Assuming matrices are sparse, since L_tau should be relatively sparse,
- # and we are perturbing with diagonal matrix.
- # """
- # H_d = np.zeros(u.shape[0])
- # for j, yj in zip(labeled, y):
- # H_d[j] = hess_calc(u[j], yj, gamma)
- # if debug:
- # print(H_d[np.nonzero(H_d)])
- # # if np.any(H_d == np.inf):
- # # print('smally')
- # return Lt + sp.sparse.diags(H_d, format='csr')
- #
- #
- # def J(u, y, labeled, Lt, gamma, debug=False):
- # vec = np.zeros(u.shape[0])
- # for j, yj in zip(labeled,y):
- # vec[j] = -yj*norm.pdf(u[j]*yj, gamma)/norm.cdf(u[j]*yj, gamma)
- # if debug:
- # print(vec[np.nonzero(vec)])
- # return Lt @ u + vec
- #
- #
- # def probit_map_dr(Z_, yvals, gamma, Ct):
- # """
- # Probit MAP estimator, using dimensionality reduction via Representer Theorem.
- # *** This uses cdf of normal distribution ***
- # """
- # Ctp = Ct[np.ix_(Z_,Z_)]
- # Jj = len(yvals)
- #
- # def f(x):
- # vec = [jac_calc(x[j], yj, gamma) for j,yj in enumerate(yvals)]
- # if np.any(vec == np.inf):
- # print('smally in f')
- # return x + Ctp @ vec
- #
- # def fprime(x):
- # H = Ctp * np.array([hess_calc(x[j],yj, gamma)
- # for j, yj in enumerate(yvals)])
- # if np.any(H == np.inf):
- # print('smally')
- # H[np.diag_indices(Jj)] += 1.0
- # return H
- #
- # x0 = np.random.rand(Jj)
- # x0[np.array(yvals) < 0] *= -1
- # res = root(f, x0, jac=fprime)
- # #print(np.allclose(0., f(res.x)))
- # tmp = sla.inv(Ctp) @ res.x
- # return Ct[:, Z_] @ tmp
- #
- #
- #
- # ################################################################################
- # ################### Probit with logit likelihood
- # ################################################################################
- #
- # ###################### Psi = cdf of logistic #######################
- # def log_pdf(t, g):
- # return np.exp(-t/g)/(g*(1. + np.exp(-t/g)**2.))
- #
- #
- # def log_cdf(t, g):
- # return 1.0/(1.0 + np.exp(-t/g))
- #
- #
- # def log_pdf_deriv(t, g):
- # return -np.exp(-t/g)/((g*(1. + np.exp(-t/g)))**2.)
- #
- # def jac_calc2(uj_, yj_, gamma):
- # return -yj_*(np.exp(-uj_*yj_/gamma))/(gamma*(1.0 + np.exp(-uj_*yj_/gamma)))
- #
- # def hess_calc2(uj_, yj_, gamma):
- # return np.exp(-uj_*yj_/gamma)/(gamma**2. * (1. + np.exp(-uj_*yj_/gamma))**2.)
- #
- #
- # def Hess2(u, y, labeled, Lt, gamma, debug=False):
- # """
- # Assuming matrices are sparse, since L_tau should be relatively sparse,
- # and we are perturbing with diagonal matrix.
- # """
- # H_d = np.zeros(u.shape[0])
- # for j, yj in zip(labeled, y):
- # H_d[j] = hess_calc2(u[j], yj, gamma)
- # if debug:
- # print(H_d[np.nonzero(H_d)])
- # if np.any(H_d == np.inf):
- # print('smally')
- # return Lt + sp.sparse.diags(H_d, format='csr')
- #
- #
- # def J2(u, y, labeled, Lt, gamma, debug=False):
- # vec = np.zeros(u.shape[0])
- # for j, yj in zip(labeled,y):
- # vec[j] = jac_calc2(u[j], yj, gamma)
- # if debug:
- # print(vec[np.nonzero(vec)])
- # return Lt @ u + vec
- #
- #
- # def probit_map_dr2(Z_, yvals, gamma, Ct):
- # """
- # Probit MAP estimator, using dimensionality reduction via Representer Theorem.
- # *** This uses logistic cdf ***
- # """
- # Ctp = Ct[np.ix_(Z_,Z_)]
- # Jj = len(yvals)
- #
- # def f(x):
- # vec = [jac_calc2(x[j], yj, gamma)
- # for j,yj in enumerate(yvals)]
- # return x + Ctp @ vec
- #
- # def fprime(x):
- # H = Ctp * np.array([hess_calc2(x[j], yj, gamma)
- # for j, yj in enumerate(yvals)])
- # if np.any(H == np.inf):
- # print('smally')
- # H[np.diag_indices(Jj)] += 1.0
- # return H
- #
- # x0 = np.random.rand(Jj)
- # x0[np.array(yvals) < 0] *= -1
- # res = root(f, x0, jac=fprime)
- # tmp = sla.inv(Ctp) @ res.x
- # return Ct[:, Z_] @ tmp
- #
- #
- #
- # ################################################################################
- # # Spectral truncation
- # ################################################################################
- # """
- #
- # def pdf_deriv(t, gamma):
- # return -t*norm.pdf(t, scale = gamma)/(gamma**2)
- #
- # def jac_calc(uj_, yj_, gamma):
- # return -yj_*(norm.pdf(uj_*yj_, scale=gamma)/norm.cdf(uj_*yj_, scale=gamma))
- #
- #
- # def hess_calc(uj_, yj_, gamma):
- # return (norm.pdf(uj_*yj_,scale=gamma)**2 - pdf_deriv(uj_*yj_, gamma)*norm.cdf(uj_*yj_,scale=gamma))/(norm.cdf(uj_*yj_,scale=gamma)**2)
- #
- # """
- # def probit_map_st(Z, y, gamma, w, v):
- # N = v.shape[0]
- # n = v.shape[1]
- # def f(x):
- # vec = np.zeros(N)
- # tmp = v @ x
- # for i, yi in zip(Z, y):
- # vec[i] = - jac_calc(tmp[i], yi, gamma)
- # #vec[i] = yi*norm.pdf(tmp[i]*yi, scale=gamma)/norm.cdf(tmp[i]*yi, scale=gamma)
- # return w * x - v.T @ vec
- # def fprime(x):
- # tmp = v @ x
- # vec = np.zeros(N)
- # for i, yi in zip(Z, y):
- # vec[i] = -hess_calc(tmp[i], yi, gamma)
- # #vec[i] = (pdf_deriv(tmp[i]*yi,gamma)*norm.cdf(tmp[i]*yi,scale=gamma)
- # # - norm.pdf(tmp[i]*yi,scale=gamma)**2)/ (norm.cdf(tmp[i]*yi,scale=gamma)**2)
- # H = (-v.T * vec) @ v
- # H[np.diag_indices(n)] += w
- # return H
- # x0 = np.random.rand(len(w))
- # res = root(f, x0, jac=fprime)
- # #print(f"Root Finding is successful: {res.success}")
- # return v @ res.x
- #
- # # OLD Code
- # # def Hess_inv_st(u, Z, y, w, v, gamma, debug=False):
- # # """
- # # Assuming matrices are sparse, since L_tau should be relatively sparse,
- # # and we are perturbing with diagonal matrix.
- # # """
- # # H_d = np.zeros(u.shape[0])
- # # for j, yj in zip(Z, y):
- # # H_d[j] = hess_calc(u[j], yj, gamma)
- # # post = sp.sparse.diags(w, format='csr') \
- # # + v.T @ sp.sparse.diags(H_d, format='csr') @ v
- # # return v @ sp.linalg.inv(post) @ v.T
- #
- # def Hess_inv_st(u, Z, y, w, v, gamma, debug=False):
- # H_d = np.zeros(len(Z))
- # vZ = v[Z,:]
- # for i, (j, yj) in enumerate(zip(Z, y)):
- # H_d[i] = hess_calc2(u[j], yj, gamma)
- # post = sp.sparse.diags(w, format='csr') \
- # + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- # return v @ sp.linalg.inv(post) @ v.T
- #
- #
- #
- # def probit_map_st2(Z, y, gamma, w, v):
- # N = v.shape[0]
- # n = v.shape[1]
- # def f(x):
- # vec = np.zeros(N)
- # tmp = v @ x
- # for i, yi in zip(Z, y):
- # vec[i] = - jac_calc2(tmp[i], yi, gamma)
- # #vec[i] = yi*norm.pdf(tmp[i]*yi, scale=gamma)/norm.cdf(tmp[i]*yi, scale=gamma)
- # return w * x - v.T @ vec
- # def fprime(x):
- # tmp = v @ x
- # vec = np.zeros(N)
- # for i, yi in zip(Z, y):
- # vec[i] = -hess_calc2(tmp[i], yi, gamma)
- # #vec[i] = (pdf_deriv(tmp[i]*yi,gamma)*norm.cdf(tmp[i]*yi,scale=gamma)
- # # - norm.pdf(tmp[i]*yi,scale=gamma)**2)/ (norm.cdf(tmp[i]*yi,scale=gamma)**2)
- # H = (-v.T * vec) @ v
- # H[np.diag_indices(n)] += w
- # return H
- # x0 = np.random.rand(len(w))
- # res = root(f, x0, jac=fprime)
- # #print(f"Root Finding is successful: {res.success}")
- # return v @ res.x
- #
- # # OLD code
- # # def Hess_inv_st2(u, Z, y, w, v, gamma, debug=False):
- # # """
- # # Assuming matrices are sparse, since L_tau should be relatively sparse,
- # # and we are perturbing with diagonal matrix.
- # # """
- # # H_d = np.zeros(u.shape[0])
- # # for j, yj in zip(Z, y):
- # # H_d[j] = hess_calc2(u[j], yj, gamma)
- # # post = sp.sparse.diags(w, format='csr') \
- # # + v.T @ sp.sparse.diags(H_d, format='csr') @ v
- # # return v @ sp.linalg.inv(post) @ v.T
- #
- # def Hess_inv_st2(u, Z, y, w, v, gamma, debug=False):
- # H_d = np.zeros(len(Z))
- # vZ = v[Z,:]
- # for i, (j, yj) in enumerate(zip(Z, y)):
- # H_d[i] = hess_calc2(u[j], yj, gamma)
- # post = sp.sparse.diags(w, format='csr') \
- # + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- # return v @ sp.linalg.inv(post) @ v.T
- #
- #
- # def Hess_inv(u, Z, y, gamma, Ct):
- # Ctp = Ct[np.ix_(Z, Z)]
- # H_d = np.zeros(len(y))
- # for i, (j, yj) in enumerate(zip(Z, y)):
- # H_d[i] = 1./hess_calc(u[j], yj, gamma)
- # temp = sp.linalg.inv(sp.sparse.diags(H_d, format='csr') + Ctp)
- # return Ct - Ct[:, Z] @ temp @ Ct[Z, :]
- #
- # def Hess2_inv(u, Z, y, gamma, Ct):
- # Ctp = Ct[np.ix_(Z, Z)]
- # H_d = np.zeros(len(y))
- # for i, (j, yj) in enumerate(zip(Z, y)):
- # H_d[i] = 1./hess_calc2(u[j], yj, gamma)
- # temp = sp.linalg.inv(sp.sparse.diags(H_d, format='csr') + Ctp)
- # return Ct - Ct[:, Z] @ temp @ Ct[Z, :]
- #
- # # OLD inefficient
- # # def gr_C(Z, gamma, Ct):
- # # Ctp = Ct[np.ix_(Z, Z)]
- # # H_d = np.ones(len(Z)) * (gamma * gamma)
- # # temp = sp.linalg.inv(sp.sparse.diags(H_d, format='csr') + Ctp)
- # # return Ct - Ct[:, Z] @ temp @ Ct[Z, :]
- #
- # def gr_C(Z, gamma, d, v):
- # H_d = len(Z) *[1./gamma**2.]
- # vZ = v[Z,:]
- # post = sp.sparse.diags(d, format='csr') \
- # + vZ.T @ sp.sparse.diags(H_d, format='csr') @ vZ
- # return v @ sp.linalg.inv(post) @ v.T
- #
- # def gr_map(Z, y, gamma, d, v):
- # C = gr_C(Z, gamma, d, v)
- # return (C[:,Z] @ y)/(gamma * gamma)
|