示例#1
0
def test_poly_phi(n, d, deg):
    X = randn(n,d)
    Phi = phi(X,deg)
    polydeg = lambda x,y: dotp(x,y)**deg
    (K , _, _) = bhatta.kernel_matrix(X, polydeg)
    (Kp, _, _) = bhatta.kernel_matrix(Phi, dotp)
    return sum(abs(K-Kp))
示例#2
0
def eig_poly(X1, X2, deg, eta, r):
    # Not tested in the slightest ... probably all broken

    # Make Kc1, Kc2
    # U1.T * S1 * U1
    kernel = bhatta.polyk(deg)
    (n1, d1) = X1.shape
    (n2, d) = X2.shape
    assert d1==d
    n = n1+n2
    X = bmat("X1;X2")

    #Let's get this shit forreal now:
    Xp = phi(X,deg)
    (n, pd) = Xp.shape
    X1p = Xp[0:n1, :]
    X2p = Xp[n1:n, :]
    mu1p = sum(X1p,0) / n1
    mu2p = sum(X2p,0) / n2
    X1cp = X1p - tile(mu1p, (n1,1))
    X2cp = X2p - tile(mu2p, (n2,1))
    Xcp = bmat('X1cp; X2cp')
    Etap = eye(pd) * eta
    S1p  = Etap + X1cp.T * X1cp / n1
    S2p  = Etap + X2cp.T * X2cp / n2

    mu3p = .5 * (S1p.I * mu1p.T + S2p.I * mu2p.T).T
    S3p  = 2  * (S1p.I + S2p.I).I

    dt1p = det(S1p) ** -.25
    dt2p = det(S2p) ** -.25
    dt3p = det(S3p) ** .5
    dterm = dt1p * dt2p * dt3p

    e1p = -.25 * mu1p * S1p.I * mu1p.T
    e2p = -.25 * mu2p * S2p.I * mu2p.T
    e3p = .5   * mu3p * S3p   * mu3p.T

    eterm = math.exp(e1p + e2p + e3p)

    (Lam1p, Alpha1p) = eigsh(S1p, r)
    (Lam2p, Alpha2p) = eigsh(S2p, r)
    Alpha1p = matrix(Alpha1p)
    Alpha2p = matrix(Alpha2p)



    (K, Kuc, Kc) = bhatta.kernel_matrix(X, kernel, n1, n2)
    Kc1 = Kc[0:n1, 0:n1]
    Kc2 = Kc[n1:n, n1:n]

    (Lam1, Alpha1) = eigsh(Kc1, r)
    (Lam2, Alpha2) = eigsh(Kc2, r)
    Alpha1 = matrix(Alpha1)
    Alpha2 = matrix(Alpha2)
    Lam1 = Lam1 / n1
    Lam2 = Lam2 / n2
    Lam1 += eta
    Lam2 += eta
    Beta1 = zeros((n,r))
    Beta2 = zeros((n,r))

    for i in xrange(r):
        Beta1[0:n1, i] = Alpha1[:,i] / (n1 * Lam1[i])**.5
        Beta2[n1:n, i] = Alpha2[:,i] / (n2 * Lam2[i])**.5


    #Eta = eye((gamma, gamma)) * eta
    Beta = bmat('Beta1, Beta2')
    Gamma = eig_ortho(Kc, Beta)
    Omega = Beta * Gamma
    V = Xcp.T * Beta #RKHS representation of eigenvectors
    #V[0:r] is orthonormal, V[r:2r] is orthonormal
    W = Xcp.T * Omega # RKHS representation of orthogonalized eigenvectors

    mu1_v = sum(Kuc[0:n1, :] * Beta1, 0) / n1
    mu2_v = sum(Kuc[n1:n, :] * Beta2, 0) / n2
    mu1_w = sum(Kuc[0:n1, :] * Omega, 0) / n1
    mu2_w = sum(Kuc[n1:n, :] * Omega, 0) / n2

    Eta_v = 0 * eye(r)
    Eta_w = 0 * eye(2*r)
    S1_v = makediag(Lam1) + Eta_v
    S2_v = makediag(Lam2) + Eta_v

    #d1 = (product(Lam1 + eta) * eta ** n2) ** -.25
    #d2 = product(Lam2 + eta) ** -.25


    

    S1_w = Omega.T * Kc[:,0:n1] * Kc[0:n1,:] * Omega / n1
    S2_w = Omega.T * Kc[:,n1:n] * Kc[n1:n,:] * Omega / n2
    S1_w += Eta_w
    S2_w += Eta_w

    mu3_w = .5 * (S1_w.I * mu1_w.T + S2_w.I * mu2_w.T).T
    S3_w = 2 * (S1_w.I + S2_w.I).I

    d1 = det(S1_w) ** -.25
    d2 = det(S2_w) ** -.25

    e1 = exp(-mu1_w * S1_w.I * mu1_w.T / 4)
    e2 = exp(-mu2_w * S2_w.I * mu2_w.T / 4)
    d3 = det(S3_w) ** .5
    e3 = exp(mu3_w * S3_w * mu3_w.T / 2)

    try:
        assert not(isnan(d1*d2*d3*e1*e2*e3))
        rval = float(d1*d2*d3*e1*e2*e3)
    except AssertionError:
        rval = -1

    ebhatta = eterm*dterm
    #print "Explicit: {} Eigen: {}".format(ebhatta,rval)
    #print "Diff: {} Ratio: {}".format(ebhatta-rval, ebhatta/rval)
    #print "---"

    return (rval)