예제 #1
0
def F_informaiton_calculation_kernel(args, latent_size, model_latent_size):
    #Since H(u) is a constant, we can calculate it at the end of all experiments
    best_F = 100
    vae = VAE_x(z_dim=10)

    model_path = 'vaex_model_relu_health_latent_500200.pth.tar'
    vae.load_state_dict(torch.load(model_path))
    train_loader, test_loader = create_torch_dataloader(batch=64)
    train_loss_F = 0.0
    cnt = 0.
    best_auc = 0.0
    bw = 15
    for epoch in range(args.epochs):
        bw = epoch + 1
        train_loss_F = 0.0
        correct = 0.0
        cnt = 0
        u_collect = []
        z_collect = []

        for iteration, (x, u, y) in enumerate(train_loader):
            x, u, y = x.cuda(), u.cuda(), y.cuda()
            recon_x, mean, log_var, z = vae(x, u)
            z_collect.append(mean)
            u_collect.append(u)

        z = torch.cat(z_collect, dim=0)
        u = torch.cat(u_collect, dim=0)
        K = KernelRegression(bandwidth=bw, X=z, Y=u)

        u_collect = []
        recon_u_collect = []
        for iteration, (x, u, y) in enumerate(test_loader):
            x, u, y = x.cuda(), u.cuda().long(), y.cuda()
            recon_x, mean, log_var, z = vae(x, u)

            recon_u = K.predict_u(mean)
            loss_F = nn.functional.nll_loss(recon_u, u.long())
            train_loss_F += loss_F.item() * x.size(0)
            pred = torch.max(recon_u, 1)[1]
            correct += (pred == u).float().sum()

            recon_u_collect.append(recon_u.detach().cpu())
            y_onehot = torch.FloatTensor(u.size(0), 18).zero_()
            y_onehot.scatter_(1, u.detach().cpu().unsqueeze(1), 1)
            u_collect.append(y_onehot.detach().cpu())

        u = torch.cat(u_collect, dim=0).numpy()
        recon_u = torch.cat(recon_u_collect, dim=0).numpy()
        test_auc = roc_auc_score(u, recon_u)

        print("epoch: {}, F loss : {}, acc: {}, auc:{}".format(
            epoch, 0.631475 - train_loss_F / (len(test_loader.dataset)),
            correct / len(test_loader.dataset), test_auc))

    print("Model F={}, Latent size :{}, F informaiton(best) :{}".format(
        model_latent_size, latent_size, best_F))
예제 #2
0
def F_informaiton_calculation_kernel(args, latent_size, model_latent_size):
    #Since H(u) is a constant, we can calculate it at the end of all experiments
    best_F = 100
    vae = VAE_x(z_dim=10)
    #model_path = 'vae_model_adult_latent_'+str(model_latent_size)+'.pth.tar'
    model_path = 'vaex_model_adult_kernel.pth.tar'
    vae.load_state_dict(torch.load(model_path))
    train_loader, test_loader = create_torch_dataloader(batch=64)
    train_loss_F = 0.0
    cnt = 0.
    best_auc = 0.0
    bw = 15
    for epoch in range(args.epochs):
        bw = epoch + 1
        train_loss_F = 0.0
        correct = 0.0
        cnt = 0
        u_collect = []
        z_collect = []

        for iteration, (x, u, y) in enumerate(train_loader):
            x, u, y = x.cuda(), u.cuda(), y.cuda()
            recon_x, mean, log_var, z = vae(x, u)
            z_collect.append(mean)
            u_collect.append(u)

        z = torch.cat(z_collect, dim=0)
        u = torch.cat(u_collect, dim=0)
        K = KernelRegression(bandwidth=bw, X=z, Y=u)

        u_collect = []
        recon_u_collect = []
        for iteration, (x, u, y) in enumerate(test_loader):
            x, u, y = x.cuda(), u.cuda(), y.cuda()
            recon_x, mean, log_var, z = vae(x, u)

            recon_u = K.predict_u(mean)
            loss_F = loss_BCE(recon_u, u)
            train_loss_F += loss_F.item() * x.size(0)
            pred = (recon_u > 0.5).float()
            correct += (pred == u).float().sum()
            u_collect.append(u.detach().cpu())
            recon_u_collect.append(recon_u.detach().cpu())

        u = torch.cat(u_collect, dim=0).numpy()
        recon_u = torch.cat(recon_u_collect, dim=0).numpy()
        test_auc = roc_auc_score(u, recon_u)
        if test_auc > best_auc:
            best_auc = test_auc
        print("epoch: {}, F loss : {}, acc: {}, auc: {}".format(
            epoch, 0.631475 - train_loss_F / (len(test_loader.dataset)),
            correct / len(test_loader.dataset), test_auc))
        if train_loss_F / (len(test_loader.dataset)) < best_F:
            best_F = train_loss_F / (len(test_loader.dataset))

    print("Model F={}, Latent size :{}, F informaiton(best) :{}".format(
        model_latent_size, latent_size, best_F))
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel()

###############################################################################
# Add noise to targets
y += 0.5 * (0.5 - np.random.rand(y.size))

###############################################################################
# Fit regression models
svr = GridSearchCV(SVR(kernel='rbf'),
                   cv=5,
                   param_grid={
                       "C": [1e-1, 1e0, 1e1, 1e2],
                       "gamma": np.logspace(-2, 2, 10)
                   })
kr = KernelRegression(kernel="rbf", gamma=np.logspace(-2, 2, 10))
t0 = time.time()
y_svr = svr.fit(X, y).predict(X)
print "SVR complexity and bandwidth selected and model fitted in %.3f s" \
    % (time.time() - t0)
t0 = time.time()
y_kr = kr.fit(X, y).predict(X)
print "KR including bandwith fitted in %.3f s" \
    % (time.time() - t0)

###############################################################################
# Visualize models
plt.scatter(X, y, c='k', label='data')
plt.hold('on')
plt.plot(X, y_kr, c='g', label='Kernel Regression')
plt.plot(X, y_svr, c='r', label='SVR')
예제 #4
0
import pandas as pd
from statsmodels.nonparametric.api import KernelReg
from kernel_regression import KernelRegression
from sklearn.cross_validation import train_test_split as sk_split
import numpy as np

df = pd.read_csv("abalone.data", header=None)
print df.shape
X = df.loc[:, 1:7].as_matrix()
y = df.loc[:, 8].as_matrix().reshape(-1, 1)
print X.shape
print y.shape
X_train, X_test, y_train, y_test = sk_split(X, y, test_size=0.20)
kr = KernelRegression(kernel="rbf")
kr.fit(X_train, y_train)
print len(X_test)
# Memory issues split X_test, just did two chunks here
X_test_1 = X_test[0:100, :]
X_test_2 = X_test[101:200, :]
pred_y = kr.predict(X_test_1)
pred_y = kr.predict(X_test_2)

예제 #5
0
def train_nearest_neighbor(vae_model, F, train_loader, test_loader, args,
                           latent_size):

    e1 = 1
    e2 = 1
    e3 = 100
    bw = 10
    optimizer_vae = torch.optim.Adam(vae_model.parameters(),
                                     lr=args.learning_rate,
                                     betas=(0.5, 0.999))

    for epoch in range(args.epochs):
        train_loss_v = 0.0
        z_collect = []
        u_collect = []
        for iteration, (x, u, y) in enumerate(train_loader):

            x, u, y = x.cuda(), u.cuda(), y.cuda()
            recon_x, mean, log_var, z = vae_model(x, u)
            K = KernelRegression(bandwidth=bw, X=z, Y=u)
            recon_u = K.predict_u(mean, train=True)
            #print(recon_u.size())
            loss = e1 * loss_BCE(recon_x, x) + e2 * loss_KLD(
                mean, log_var) - e3 * nn.functional.nll_loss(
                    recon_u, u.long())
            #loss = -e3 * nn.functional.nll_loss(recon_u, u)
            train_loss_v += loss.item()
            optimizer_vae.zero_grad()
            loss.backward()
            optimizer_vae.step()

            z_collect.append(mean)
            u_collect.append(u)

        z = torch.cat(z_collect, dim=0)
        u = torch.cat(u_collect, dim=0)
        K = KernelRegression(bandwidth=bw, X=z, Y=u)

        print("latent size : {}, epoch: {},  F loss : {}".format(
            latent_size, epoch, train_loss_v / len(train_loader.dataset)))
        train_loss_F = 0.0
        correct = 0.0
        u_collect = []
        recon_u_collect = []
        for iteration, (x, u, y) in enumerate(test_loader):
            x, u, y = x.cuda(), u.cuda().long(), y.cuda()
            recon_x, mean, log_var, z = vae_model(x, u)
            recon_u = K.predict_u(mean)
            loss_F = nn.functional.nll_loss(recon_u, u)
            train_loss_F += loss_F.item() * x.size(0)
            pred = torch.max(recon_u, 1)[1]
            correct += (pred == u).float().sum()

            recon_u_collect.append(recon_u.detach().cpu())
            y_onehot = torch.FloatTensor(u.size(0), 18).zero_()
            y_onehot.scatter_(1, u.detach().cpu().unsqueeze(1), 1)
            u_collect.append(y_onehot.detach().cpu())
        u = torch.cat(u_collect, dim=0).numpy()
        recon_u = torch.cat(recon_u_collect, dim=0).numpy()
        test_auc = roc_auc_score(u, recon_u)

        print("Test: latent size : {}, F information : {}, Acc : {}, Auc:{}".
              format(latent_size,
                     0.631475 - train_loss_F / len(test_loader.dataset),
                     correct / len(test_loader.dataset), test_auc))

    torch.save(vae_model.state_dict(), 'vaex_model_health_kernel.pth.tar')
예제 #6
0
def plot_regression():
    np.random.seed(12345)
    fig, axes = plt.subplots(4, 4)
    for i, ax in enumerate(axes.flatten()):
        n_in = 1
        n_out = 1
        d = np.random.randint(1, 5)
        n_ex = np.random.randint(5, 500)
        std = np.random.randint(0, 1000)
        intercept = np.random.rand() * np.random.randint(-300, 300)
        X_train, y_train, X_test, y_test, coefs = random_regression_problem(
            n_ex, n_in, n_out, d=d, intercept=intercept, std=std, seed=i)

        LR = LinearRegression(fit_intercept=True)
        LR.fit(X_train, y_train)
        y_pred = LR.predict(X_test)
        loss = np.mean((y_test.flatten() - y_pred.flatten())**2)

        d = 3
        best_loss = np.inf
        for gamma in np.linspace(1e-10, 1, 100):
            for c0 in np.linspace(-1, 1000, 100):
                kernel = "PolynomialKernel(d={}, gamma={}, c0={})".format(
                    d, gamma, c0)
                KR_poly = KernelRegression(kernel=kernel)
                KR_poly.fit(X_train, y_train)
                y_pred_poly = KR_poly.predict(X_test)
                loss_poly = np.mean(
                    (y_test.flatten() - y_pred_poly.flatten())**2)
                if loss_poly <= best_loss:
                    KR_poly_best = kernel
                    best_loss = loss_poly

        print("Best kernel: {} || loss: {:.4f}".format(KR_poly_best,
                                                       best_loss))
        KR_poly = KernelRegression(kernel=KR_poly_best)
        KR_poly.fit(X_train, y_train)

        KR_rbf = KernelRegression(kernel="RBFKernel(gamma=0.01)")
        KR_rbf.fit(X_train, y_train)
        y_pred_rbf = KR_rbf.predict(X_test)
        loss_rbf = np.mean((y_test.flatten() - y_pred_rbf.flatten())**2)

        xmin = min(X_test) - 0.1 * (max(X_test) - min(X_test))
        xmax = max(X_test) + 0.1 * (max(X_test) - min(X_test))
        X_plot = np.linspace(xmin, xmax, 100)
        y_plot = LR.predict(X_plot)
        y_plot_poly = KR_poly.predict(X_plot)
        y_plot_rbf = KR_rbf.predict(X_plot)

        ax.scatter(X_test, y_test, alpha=0.5)
        ax.plot(X_plot, y_plot, label="OLS", alpha=0.5)
        ax.plot(X_plot,
                y_plot_poly,
                label="KR (poly kernel, d={})".format(d),
                alpha=0.5)
        ax.plot(X_plot, y_plot_rbf, label="KR (rbf kernel)", alpha=0.5)
        ax.legend()
        #  ax.set_title(
        #      "MSE\nLR: {:.2f} KR (poly): {:.2f}\nKR (rbf): {:.2f}".format(
        #          loss, loss_poly, loss_rbf
        #      )
        #  )

        ax.xaxis.set_ticklabels([])
        ax.yaxis.set_ticklabels([])

    plt.tight_layout()
    plt.savefig("img/kr_plots.png", dpi=300)
    plt.close("all")
예제 #7
0
    def multivar_regress(self):
        #     X, y = self.regression_data()
        X, y = self.regression_data_split()
        X = np.array(X)
        y = np.array(y)

        pb = X[:, 0].argsort()
        Xb = X[pb]
        yb = y[pb]

        X1 = np.delete(X, 1, 1)
        p1 = X1[:, 0].argsort()
        X1 = X1[p1]
        y1 = y[p1]

        X2 = np.delete(X, 0, 1)
        p2 = X2[:, 0].argsort()
        X2 = X2[p2]
        y2 = y[p2]

        x_range = np.arange(0, 0.025, 0.001)  # generate a mesh
        y_range = np.arange(0, 1.3, 0.02)
        x_surf, y_surf = np.meshgrid(x_range, y_range)
        Xpred = np.stack((x_surf.flatten(), y_surf.flatten()), axis=1)

        svr = GridSearchCV(SVR(kernel='rbf'),
                           cv=5,
                           param_grid={
                               "C": [1e-1, 1e0, 1e1, 1e2],
                               "gamma": np.logspace(-2, 2, 10)
                           })
        kr = KernelRegression(kernel="rbf", gamma=np.logspace(-2, 2, 10))
        t0 = time.time()
        y_svrb = svr.fit(Xb, yb).predict(Xpred)
        print(
            "SVR complexity and bandwidth selected and model fitted in %.3f s"
            % (time.time() - t0))

        score_svr = svr.score(Xb, yb)
        y_svr1 = svr.fit(X1, y1).predict(np.expand_dims(x_range, 1))
        score_svr1 = svr.score(X1, y1)
        y_svr2 = svr.fit(X2, y2).predict(np.expand_dims(y_range, 1))
        score_svr2 = svr.score(X2, y2)

        t0 = time.time()
        y_krb = kr.fit(Xb, yb).predict(Xpred)
        print("KR including bandwith fitted in %.3f s" % (time.time() - t0))

        score_kr = kr.score(Xb, yb)
        y_kr1 = kr.fit(X1, y1).predict(np.expand_dims(x_range, 1))
        score_kr1 = kr.score(X1, y1)
        y_kr2 = kr.fit(X2, y2).predict(np.expand_dims(y_range, 1))
        score_kr2 = kr.score(X2, y2)

        print('R^2 / coeff determination:')
        print('  SVR model: cls_score=%0.3f bbox_pred=%0.3f both=%0.3f' %
              (score_svr1, score_svr2, score_svr))
        print('  KR model: cls_score=%0.3f bbox_pred=%0.3f both=%0.3f' %
              (score_kr1, score_kr2, score_kr))

        #     R^2 / coeff determination:
        #   SVR model: cls_score=0.675 bbox_pred=0.518 both=0.512
        #   KR model: cls_score=0.848 bbox_pred=0.320 both=0.881

        ###############################################################################
        # Visualize models
        #     fig = plt.figure()
        #     ax = fig.gca(projection='3d')               # to work in 3d
        #
        #     z_surf = np.reshape(y_krb, x_surf.shape)
        #     surf = ax.plot_surface(x_surf, y_surf, z_surf, cmap=cm.coolwarm, alpha=0.5, rstride=1, cstride=1);    # plot a 3d surface plot
        #     fig.colorbar(surf, shrink=0.5, aspect=5)
        #
        #     ax.scatter(X[:,0], X[:,1], y, s=1, c='k')                        # plot a 3d scatter plot
        #
        #     ax.set_xlabel('cls_score', fontsize=16)
        #     ax.set_ylabel('bbox_pred', fontsize=16)
        #     ax.set_zlabel('mAP', fontsize=16)
        #     plt.show()

        fig = plt.figure()
        plt.scatter(X1[:, 0], y1, c='k', s=1, label='data')
        #     plt.plot(x_range, y_kr1, c='g', label='Kernel Regression')
        #     plt.plot(x_range, y_svr1, c='r', label='SVR')
        plt.xlabel('cls_score')
        plt.ylabel('mAP')
        plt.ylim(0, 0.85)
        #     plt.title('Classification score difference as proxy for model performance/')
        plt.legend()
        plt.show()

        fig = plt.figure()
        plt.scatter(X2[:, 0], y2, c='k', s=1, label='data')
        #     plt.plot(y_range, y_kr2, c='g', label='Kernel Regression')
        #     plt.plot(y_range, y_svr2, c='r', label='SVR')
        plt.xlabel('bbox_pred')
        plt.ylabel('mAP')
        plt.ylim(0, 0.85)
        #     plt.title('Kernel regression versus SVR')
        plt.legend()
        plt.show()

        # Visualize learning curves
        plt.figure()
        train_sizes, train_scores_svr, test_scores_svr = \
            learning_curve(svr, X, y, train_sizes=np.linspace(0.1, 1, 10),
                           scoring="neg_mean_squared_error", cv=10)
        train_sizes_abs, train_scores_kr, test_scores_kr = \
            learning_curve(kr, X, y, train_sizes=np.linspace(0.1, 1, 10),
                           scoring="neg_mean_squared_error", cv=10)
        plt.plot(train_sizes,
                 test_scores_svr.mean(1),
                 'o-',
                 color="r",
                 label="SVR")
        plt.plot(train_sizes,
                 test_scores_kr.mean(1),
                 'o-',
                 color="g",
                 label="Kernel Regression")
        plt.yscale("symlog", linthreshy=1e-7)
        plt.ylim(-10, -0.01)
        plt.xlabel("Training size")
        plt.ylabel("Mean Squared Error")
        plt.title('Learning curves')
        plt.legend(loc="best")
        plt.show()