def varying_view_number(N=100,runs=1): """\ Multiview-MDS experiment with varying number of views """ view_number = range(1,11) print('*** test.varying_view_number() ***') print(f' N : {N}') print() X = misc.disk(N,dim=3) persp = perspective.Persp(dimX=3,dimY=2,family='linear', restriction='orthogonal') cost = [] for i in view_number: persp.fix_Q(number=i,random='orthogonal') Y = persp.compute_Y(X) D = distances.compute(Y) mv = multiview.Multiview(D,persp=persp) mv.setup_visualization(visualization='mds') mv.initialize_X(number=runs) mv.optimize_X(algorithm='agd') cost.append(mv.ncost) print(f' {i:>2} : {mv.ncost:0.2e}') print()
def mds_comparison(): max_iters = 100 save_frequency = 10 import misc, distances, mds print('\n*** gd.mds_comparison() ***\n') Y = misc.disk(30,2) plt.figure() plt.plot(Y[:,0],Y[:,1],'o') plt.title('Original data') plt.draw() plt.pause(0.1) D = distances.compute(Y) vis = mds.MDS(D,dim=2,verbose=1) vis.initialize_Y() vis.optimize(algorithm='gd',max_iters=max_iters,save_cost=True, learning_rate=0.01,from_scratch=True, save_frequency=save_frequency,label='mds, lr=0.01',verbose=2) vis.optimize(algorithm='gd',max_iters=max_iters,save_cost=True, learning_rate=0.1,from_scratch=True, save_frequency=save_frequency,label='mds, lr=0.05',verbose=2) vis.optimize(algorithm='agd',max_iters=max_iters,save_cost=True, from_scratch=True,save_frequency=save_frequency,verbose=2) plt.show()
def agd_multiview_mds_standard(N=100,trials=3,runs=5): """\ Test convergence of adaptive gradient descent for multiview MDS with standard projections, by solving a single multiview MDS problem using multiple initial parameters. """ print('*** test.agd_multiview_mds_standard() ***') print(f' N : {N}') print() for i in range(trials): print(f' Trial # {i}') print(' Normalized cost :') X = misc.disk(N,dim=3) persp = perspective.Persp() persp.fix_Q(special='standard') Y = persp.compute_Y(X) D = distances.compute(Y) mv = multiview.Multiview(D,persp=persp) mv.setup_visualization(visualization='mds') stress = [] for run in range(runs): mv.initialize_X() mv.optimize_X(algorithm='agd') stress.append(mv.ncost) print(f' {mv.ncost:0.2e}') print()
def disk_compare(N=100,dim=2): ### print('\n***mds.disk_compare()***') X = misc.disk(N,2); labels = misc.labels(X) plt.figure() plt.scatter(X[:,0],X[:,1],c=labels) plt.title('original data') plt.draw() plt.pause(0.1) D = distances.compute(X) mds = MDS(D,dim=dim,verbose=1,title='disk experiments',labels=labels) mds.initialize() mds.figureX(title='initial embedding') title = 'full gradient & agd' mds.optimize(algorithm='agd',verbose=2,label=title) mds.figureX(title=title) mds.figureH(title=title) mds.forget() title = 'approx gradient & gd' mds.approximate(algorithm='gd',verbose=2,label=title) mds.figureX(title=title) mds.figureH(title=title) mds.forget() title = 'combine' mds.approximate(algorithm='gd',verbose=2,label=title) mds.optimize(verbose=2,label=title,max_iters=10) mds.figureX(title=title) mds.figureH(title=title) plt.show()
def example_approx(N=30, dim=2, batch_number=5): print('\n***mds.example_disk_batch()***\n') Y = misc.disk(N, dim) labels = misc.labels(Y) plt.figure() plt.scatter(Y[:, 0], Y[:, 1], c=labels) plt.title('Original data') plt.draw() plt.pause(0.1) D = distances.compute(Y) title = 'basic disk example using approximate gradient' mds = MDS(D, dim=dim, verbose=1, title=title, labels=labels) mds.initialize() mds.approximate(verbose=2, max_iters=200, lr=0.1, batch_number=batch_number, algorithm='gd') mds.figureX(title='Final embedding') mds.figureH() plt.show()
def compare_multiview_same(N=100,runs=1): noise_levels = [0.0001,0.001,0.01,0.1,0.5] stress = [] X = misc.disk(N,dim=2) persp = perspective.Persp(dimX=2,dimY=2) #persp.fix_Q(random='orthogonal',number=3) persp.fix_Q(special='identity',number=3) Y = persp.compute_Y(X) D = distances.compute(Y) persp1 = perspective.Persp(dimX=3,dimY=2) persp1.fix_Q(special='standard',number=3) persp2 = perspective.Persp(dimX=2,dimY=2) persp2.fix_Q(special='identity',number=3) persp3 = perspective.Persp(dimX=3,dimY=3) persp3.fix_Q(special='identity',number=3) cost = []; cost2 = []; cost3 = []; costm = [] for noise in noise_levels: D_noisy = distances.add_noise(D,noise) mv = Multiview(D_noisy,persp=persp1,verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_X(number=1) mv.optimize_X(algorithm='agd',max_iters=200) cost.append(mv.ncost) mv = Multiview(D_noisy,persp=persp2,verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_X(number=runs) mv.optimize_X(algorithm='agd',max_iters=200) cost2.append(mv.ncost) mv = Multiview(D_noisy,persp=persp3,verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_X(number=1) mv.optimize_X(algorithm='agd',max_iters=200) cost3.append(mv.ncost) mv = Multiview(D_noisy,persp=persp1,verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_Q() mv.initialize_X(number=1) mv.optimize_all(algorithm='agd',max_iters=[30,20],rounds=40) costm.append(mv.ncost) fig = plt.figure() plt.loglog(noise_levels,cost,linestyle='--',marker='o', label='multi-perspective') plt.loglog(noise_levels,cost2,linestyle='--',marker='o', label='combine 2') plt.loglog(noise_levels,cost3,linestyle='--',marker='o', label='combine 3') plt.loglog(noise_levels,costm,linestyle='--',marker='o', label='multi-all') plt.legend() plt.xlabel('noise level') plt.ylabel('normalized stress') plt.show()
def example_disk(N=100): X = misc.disk(N,dim=3); labels=misc.labels(X) persp = perspective.Persp() persp.fix_Q(number=3,special='standard') Y = persp.compute_Y(X) D = distances.compute(Y) mv = Multiview(D,persp=persp,verbose=1,labels=labels) mv.setup_visualization(visualization='mds') mv.initialize_X(verbose=1) mv.optimize_X(batch_size=10,max_iters=50,verbose=1) mv.figureX(save='hola') mv.figureY() mv.figureH() plt.show()
def example_disk_Q(N=100): X = misc.disk(N,dim=3) persp = perspective.Persp() Q_true = persp.generate_Q(number=3,special='standard') Y_true = persp.compute_Y(X,Q=Q_true) D = distances.compute(Y_true) mv = Multiview(D,persp=persp,verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_Q(random='orthogonal') mv.initialize_X(X0=X) mv.optimize_Q(verbose=2,batch_size=10) mv.optimize_Q(verbose=2) mv.figureH() plt.show()
def example_disk_all(N=100): X = misc.disk(N,dim=3); labels=misc.labels(X) persp = perspective.Persp() Q_true = persp.generate_Q(number=3,special='standard') Y_true = persp.compute_Y(X,Q=Q_true) D = distances.compute(Y_true) mv = Multiview(D,persp=persp,verbose=1,labels=labels) mv.setup_visualization(visualization='mds') mv.initialize_Q() mv.initialize_X() mv.optimize_all(agd=True,batch_size=10) mv.figureX(plot=True) mv.figureY(plot=True) mv.figureH() plt.show()
def example_disk_dimensions(N=100): print('\n***mds.example_disk_dimensions()***\n') dims = range(1,11) stress = [] for dim in dims: Y = misc.disk(N,dim) D = distances.compute(Y) mds = MDS(D,dim,verbose=1,label=f'dimension : {dim}') mds.initialize_Y() mds.optimize(algorithm='agd',max_iters=300) stress.append(mds.ncost) fig = plt.figure() plt.semilogy(dims,stress) plt.xlabel('dimension') plt.ylabel('stress') plt.title('Normalized MDS stress for various dimensions') plt.show()
def example_disk_noisy(N=100,dim=2): print('\n***mds.example_disk_noisy()***\n') noise_levels = [0.001,0.005,0.01,0.03,0.07,0.1,0.15,0.2,0.7,1.0] stress = [] Y = misc.disk(N,dim) D = distances.compute(Y) for noise in noise_levels: D_noisy = distances.add_noise(D,noise) mds = MDS(D_noisy,dim,verbose=1,title=f'noise : {noise:0.2f}') mds.initialize() mds.optimize(algorithm='agd',max_iters=300,verbose=1) stress.append(mds.ncost) fig = plt.figure() plt.loglog(noise_levels,stress,'.-') plt.xlabel('noise level') plt.ylabel('stress') plt.title('Normalized MDS stress for various noise levels') plt.show()
def noise_all(N=100): noise_levels = [0.001,0.01,0.07,0.15,0.4] stress = [] X = misc.disk(N,dim=3) proj = perspective.Proj(dimX=2,dimY=2) proj.set_params_list(special='identity',number=3) Y = proj.project(X) D = distances.compute(Y) for noise in noise_levels: D_noisy = distances.add_noise(D,noise) mv = Multiview(D_noisy,persp=proj) mv.setup_visualization(visualization='mds') mv.initialize_X(verbose=1) mv.optimize_X(algorithm='gd',learning_rate=1,max_iters=300, verbose=1) stress.append(mv.cost) fig = plt.figure() plt.semilogx(noise_levels,stress) plt.show()
def embeddability_noise(ax=None): print('\n**mds.embeddability_noise()') N=50 ncost = [] noise_list = [0]+10**np.arange(-4,0,0.5) X = misc.disk(N,4) DD = distances.compute(X) for noise in noise_list: D = DD*(1+np.random.randn(N,N)*noise) mds = MDS(D,dim=4,verbose=1) mds.initialize() mds.optimize() ncost.append(mds.ncost) if ax is None: fig, ax = plt.subplots(1) plot = True else: plot = False ax.semilogx(noise_list,ncost) if plot is True: plt.show()
def example_disk(N=100,dim=2,**kwargs): print('\n***mds.example_disk()***') Y = misc.disk(N,dim); labels = misc.labels(Y) plt.figure() plt.scatter(Y[:,0],Y[:,1],c=labels) plt.title('original data') plt.draw() plt.pause(0.1) D = distances.compute(Y) title = 'basic disk example' mds = MDS(D,dim=dim,verbose=1,title=title,labels=labels) mds.initialize() mds.figureX(title='initial embedding') mds.optimize(**kwargs) mds.figureX(title='final embedding',labels=labels,edges=.2) mds.figure(title='final embedding',labels=labels) plt.show()
def embeddability_dims(ax=None): print('\n**mds.embeddability_dims()') N=50 ncost = [] dims = list(range(2,50,5)) XX = misc.disk(N,20) #XX = misc.box(N,20) for dim in dims: X = XX[:,0:dim] D = distances.compute(X) mds = MDS(D,dim=2,verbose=1) mds.initialize() mds.optimize() ncost.append(mds.ncost) if ax is None: fig, ax = plt.subplots(1) plot = True else: plot = False ax.plot(dims,ncost) if plot is True: plt.show()
def agd_mds_standard(N=100,dim=2,trials=3,runs=5): """\ test convergence of adaptive gradient descent for MDS problem, by solving the MDS problems with multiple initial parameters. """ print('*** test.agd_mds_standard() ***') print(f' N : {N}') print(f' dim : {dim}') print() for i in range(trials): print(f' Trial # {i}') print(' Normalized cost :') Y = misc.disk(N,dim) D = distances.compute(Y) vis = mds.MDS(D,dim=dim) stress = [] for run in range(runs): vis.initialize_Y() vis.optimize(algorithm='agd') stress.append(vis.ncost) print(f' {vis.ncost:0.2e}') print()
def noisy(N=100): noise_levels = [0.0001, 0.001, 0.01, 0.1, 0.5] stress = [] X = misc.disk(N, dim=3) proj = perspective.Proj() proj.set_params_list(special='standard') Y = proj.project(X) D = distances.compute(Y) for noise in noise_levels: D_noisy = distances.add_noise(D, noise) stress_best = [] for i in range(3): mv = Multiview(D_noisy, persp=proj, verbose=1) mv.setup_visualization(visualization='mds') mv.initialize_X() mv.optimize_X(algorithm='agd') stress_best.append(mv.normalized_cost) stress.append(min(stress_best)) fig = plt.figure() plt.loglog(noise_levels, stress, linestyle='--', marker='o') plt.title('Normalized total stress') plt.xlabel('noise level') plt.ylabel('total stress') plt.show()