示例#1
0
    def forward(self, x):

        radius = 1.2
        adjacency_method = 'cyflann'
        adjacency_kwds = {'radius': radius}
        affinity_method = 'gaussian'
        affinity_kwds = {'radius': radius}
        laplacian_method = 'symmetricnormalized'
        laplacian_kwds = {'scaling_epps': radius}

        geom = Geometry(adjacency_method=adjacency_method,
                        adjacency_kwds=adjacency_kwds,
                        affinity_method=affinity_method,
                        affinity_kwds=affinity_kwds,
                        laplacian_method=laplacian_method,
                        laplacian_kwds=laplacian_kwds)
        x = x.view(100, -1)
        #print(x.shape)
        geom.set_data_matrix(x)
        lle = LocallyLinearEmbedding(n_components=10,
                                     eigen_solver='dense',
                                     geom=geom)
        embed_lle = lle.fit_transform(x)
        embed_lle = torch.from_numpy(embed_lle).float()

        x = embed_lle.view(-1, 10)
        x = self.fc(x)
        return x
示例#2
0
    def forward(self, x):
        #print('x in:' , x.shape)

        rad1 = 0.7272
        radius = rad1
        adjacency_method = 'cyflann'
        adjacency_kwds = {'radius': radius}
        affinity_method = 'gaussian'
        affinity_kwds = {'radius': radius}
        laplacian_method = 'symmetricnormalized'
        laplacian_kwds = {'scaling_epps': radius}

        geom = Geometry(adjacency_method=adjacency_method,
                        adjacency_kwds=adjacency_kwds,
                        affinity_method=affinity_method,
                        affinity_kwds=affinity_kwds,
                        laplacian_method=laplacian_method,
                        laplacian_kwds=laplacian_kwds)

        x = x.view(100, -1)
        #print('before embedding:', x.shape)
        geom.set_data_matrix(x)
        spectral = SpectralEmbedding(n_components=10,
                                     eigen_solver='amg',
                                     geom=geom,
                                     drop_first=False)  # use 3 for spectral
        embed_spectral = spectral.fit_transform(x)
        embed_spectral = torch.from_numpy(embed_spectral).float()
        #print('x_totorch:', embed_spectral.shape)

        x = embed_spectral.view(-1, 10)
        x = self.fc(x)
        return x
示例#3
0
 def compute_geom_brute(self, diffusion_time, n_neighbors):
     data = self.data
     dim = self.dim
     #set radius according to paper (i think this is dim not d)
     radius = (diffusion_time * (diffusion_time * np.pi * 4)**(dim/2))**(0.5)
     #set adjacency radius large enough that points beyond it have affinity close to zero
     bigradius = 3 * radius
     adjacency_method = 'brute'
     adjacency_kwds = {'radius':bigradius}
     affinity_method = 'gaussian'
     affinity_kwds = {'radius':radius}
     laplacian_method = 'geometric'
     laplacian_kwds = {'scaling_epps':1}
     geom = Geometry(adjacency_method=adjacency_method, adjacency_kwds=adjacency_kwds,
                     affinity_method=affinity_method, affinity_kwds=affinity_kwds,
                     laplacian_method=laplacian_method, laplacian_kwds=laplacian_kwds)
     geom.set_data_matrix(data)
     geom.adjacency_matrix = geom.compute_adjacency_matrix()
     geom.laplacian_matrix = geom.compute_affinity_matrix()
     geom.laplacian_matrix = self.get_laplacian(geom, radius)
     return(geom)
示例#4
0
 def compute_geom(self, diffusion_time, n_neighbors):
     data = self.data
     dim = self.dim
     #set radius according to paper (i think this is dim not d)
     radius = (diffusion_time * (diffusion_time * np.pi * 4)**(dim/2))**(0.5)
     #set adjacency radius large enough that points beyond it have affinity close to zero
     bigradius = 3 * radius
     adjacency_method = 'cyflann'
     cyflann_kwds = {'index_type':'kdtrees', 'num_trees':10, 'num_checks':n_neighbors}
     adjacency_kwds = {'radius':bigradius, 'cyflann_kwds':cyflann_kwds}
     affinity_method = 'gaussian'
     affinity_kwds = {'radius':radius}
     laplacian_method = 'geometric'
     laplacian_kwds = {'scaling_epps':radius}
     geom = Geometry(adjacency_method=adjacency_method, adjacency_kwds=adjacency_kwds,
                     affinity_method=affinity_method, affinity_kwds=affinity_kwds,
                     laplacian_method=laplacian_method, laplacian_kwds=laplacian_kwds)
     geom.set_data_matrix(data)
     adjacency_matrix = geom.compute_adjacency_matrix()
     laplacian_matrix = geom.compute_laplacian_matrix()
     return(geom)
示例#5
0
affinity_kwds = {'radius': radius}  # A = exp(-||x - y||/radius^2)
laplacian_method = 'geometric'
laplacian_kwds = {
    'scaling_epps': radius
}  # scaling ensures convergence to Laplace-Beltrami operator

geom = Geometry(adjacency_method=adjacency_method,
                adjacency_kwds=adjacency_kwds,
                affinity_method=affinity_method,
                affinity_kwds=affinity_kwds,
                laplacian_method=laplacian_method,
                laplacian_kwds=laplacian_kwds)

# You can/should also use the set_data_matrix, set_adjacency_matrix, set_affinity_matrix
# to send your data set (in whichever form it takes) this way.
geom.set_data_matrix(X)

# You can get the distance, affinity etc with e.g: Geometry.get_distance_matrix()
# you can update the keyword arguments passed inially using these functions
adjacency_matrix = geom.compute_adjacency_matrix()
# by defualt this is pass-by-reference. Use copy=True to get a copied version.

# If you don't want to pre-compute a Geometry you can pass a dictionary or geometry
# arguments to one of the embedding classes.
geom = {
    'adjacency_method': adjacency_method,
    'adjacency_kwds': adjacency_kwds,
    'affinity_method': affinity_method,
    'affinity_kwds': affinity_kwds,
    'laplacian_method': laplacian_method,
    'laplacian_kwds': laplacian_kwds
示例#6
0
adjacency_method = 'cyflann'
adjacency_kwds = {'radius': radius}
affinity_method = 'gaussian'
affinity_kwds = {'radius': radius}
laplacian_method = 'symmetricnormalized'
laplacian_kwds = {'scaling_epps': radius}
dataname = workingdirectory + '/untracked_data/chemistry_data/tolueneangles020619_pca50'
#dataname = '/Users/samsonkoelle/Downloads/manigrad-100818/mani-samk-gradients/untracked_data/chemistry_data/ethanolangles022119_pca50'
data = np.load(dataname + '.npy')
geom = Geometry(adjacency_method=adjacency_method,
                adjacency_kwds=adjacency_kwds,
                affinity_method=affinity_method,
                affinity_kwds=affinity_kwds,
                laplacian_method=laplacian_method,
                laplacian_kwds=laplacian_kwds)
geom.set_data_matrix(data)
geom.laplacian_method = 'geometric'
geom.laplacian_kwds = {'scaling_epps': radius}
laplacian_matrix = geom.compute_laplacian_matrix()
geom.compute_laplacian_matrix()
sample = np.arange(0, data.shape[0], 1000)
distorion_vs_rad_dim2 = run_estimate_radius(data,
                                            geom.adjacency_matrix,
                                            sample=sample,
                                            d=1,
                                            rmin=1,
                                            rmax=10,
                                            ntry=50,
                                            run_parallel=True,
                                            search_space='logspace')
np.save(dataname + '_distortionradius', distorion_vs_rad_dim2)
示例#7
0
set_data_matrix(): input an (n_observation X n_dimensions) array of data points
set_adjacency_matrix(): input an (n_observation X n_observation) pairwise (sparse)
    matrix indicating neighborhoods distances. This matrix should be sparse
    with zero entries considered Infinite. The diagonal is considered explicitly
    zero when calculating an affinity matrix. 
set_affinity_matrix(): input an (n_observation X n_observation) pairwise (sparse)
    indicating similarity between points. High values indicate strong degree of 
    similarity, the diagonal should take on the maximum value in its row.
'''

'''
In this example we're working with a data set of observed points and so we
input with:
'''

geom.set_data_matrix(X)

## Computing geometric matrices
'''
Once you've input your data you may  be interested in computing the
various geometric matrices like the distance, affinity etc.

You can do this with the .compute_ functions.

If you passed a method parameter e.g. adjacency_method = 'cyflann'
then it will use this one. 
To update this use geom.adjacency_method = <new method name>
you can pass new keywords to these functions.
'''

adjacency_matrix = geom.compute_adjacency_matrix()