Skip to content
Permalink
Browse files

Merge pull request #3552 from pavlin-policar/update-tsne

Update openTSNE version to >=0.3
  • Loading branch information...
lanzagar committed Feb 1, 2019
2 parents 2124dba + 7b2eccd commit ec0ac1e5e368af963b260386a8a3cbbc447067eb
Showing with 19 additions and 19 deletions.
  1. +17 −17 Orange/projection/manifold.py
  2. +1 −1 conda-recipe/meta.yaml
  3. +1 −1 requirements-core.txt
@@ -8,9 +8,9 @@
from scipy.sparse.linalg import eigsh as arpack_eigh
import sklearn.manifold as skl_manifold

import fastTSNE
import fastTSNE.affinity
import fastTSNE.initialization
import openTSNE
import openTSNE.affinity
import openTSNE.initialization

import Orange
from Orange.data import Table, Domain, ContinuousVariable
@@ -22,8 +22,8 @@
"TSNE"]

# Disable t-SNE user warnings
fastTSNE.tsne.log.setLevel(logging.ERROR)
fastTSNE.affinity.log.setLevel(logging.ERROR)
openTSNE.tsne.log.setLevel(logging.ERROR)
openTSNE.affinity.log.setLevel(logging.ERROR)


def torgerson(distances, n_components=2, eigen_solver="auto"):
@@ -204,7 +204,7 @@ class TSNEModel(Projection):
pre_domain : Domain
Original data domain
"""
def __init__(self, embedding: fastTSNE.TSNEEmbedding, table: Table,
def __init__(self, embedding: openTSNE.TSNEEmbedding, table: Table,
pre_domain: Domain):
transformer = TransformDomain(self)

@@ -221,13 +221,13 @@ def proj_variable(i):
class_vars=table.domain.class_vars,
metas=table.domain.metas)

def transform(self, X: np.ndarray, **kwargs) -> fastTSNE.PartialTSNEEmbedding:
def transform(self, X: np.ndarray, learning_rate=1, **kwargs) -> openTSNE.PartialTSNEEmbedding:
if sp.issparse(X):
raise TypeError(
"A sparse matrix was passed, but dense data is required. Use "
"X.toarray() to convert to a dense numpy array."
)
if isinstance(self.embedding_.affinities, fastTSNE.affinity.Multiscale):
if isinstance(self.embedding_.affinities, openTSNE.affinity.Multiscale):
perplexity = kwargs.pop("perplexity", False)
if perplexity:
if not isinstance(self.perplexity, Iterable):
@@ -242,7 +242,7 @@ def transform(self, X: np.ndarray, **kwargs) -> fastTSNE.PartialTSNEEmbedding:

embedding = self.embedding_.prepare_partial(X, **perplexity_params,
**kwargs)
embedding.optimize(100, inplace=True, momentum=0.4)
embedding.optimize(100, inplace=True, momentum=0.4, learning_rate=learning_rate)
return embedding

def __call__(self, data: Table, **kwargs) -> Table:
@@ -400,7 +400,7 @@ def __init__(self, n_components=2, perplexity=30, learning_rate=200,
self.callbacks_every_iters = callbacks_every_iters
self.random_state = random_state

def fit(self, X: np.ndarray, Y: np.ndarray = None) -> fastTSNE.TSNEEmbedding:
def fit(self, X: np.ndarray, Y: np.ndarray = None) -> openTSNE.TSNEEmbedding:
# Sparse data are not supported
if sp.issparse(X):
raise TypeError(
@@ -416,33 +416,33 @@ def fit(self, X: np.ndarray, Y: np.ndarray = None) -> fastTSNE.TSNEEmbedding:
raise ValueError(
"Perplexity should be an instance of `Iterable`, `%s` "
"given." % type(self.perplexity).__name__)
affinities = fastTSNE.affinity.Multiscale(
affinities = openTSNE.affinity.Multiscale(
X, perplexities=self.perplexity, metric=self.metric,
method=self.neighbors, random_state=self.random_state, n_jobs=self.n_jobs)
else:
if isinstance(self.perplexity, Iterable):
raise ValueError(
"Perplexity should be an instance of `float`, `%s` "
"given." % type(self.perplexity).__name__)
affinities = fastTSNE.affinity.PerplexityBasedNN(
affinities = openTSNE.affinity.PerplexityBasedNN(
X, perplexity=self.perplexity, metric=self.metric,
method=self.neighbors, random_state=self.random_state, n_jobs=self.n_jobs)

# Create an initial embedding
if isinstance(self.initialization, np.ndarray):
initialization = self.initialization
elif self.initialization == "pca":
initialization = fastTSNE.initialization.pca(
initialization = openTSNE.initialization.pca(
X, self.n_components, random_state=self.random_state)
elif self.initialization == "random":
initialization = fastTSNE.initialization.random(
X.shape[0], self.n_components, random_state=self.random_state)
initialization = openTSNE.initialization.random(
X, self.n_components, random_state=self.random_state)
else:
raise ValueError(
"Invalid initialization `%s`. Please use either `pca` or "
"`random` or provide a numpy array." % self.initialization)

embedding = fastTSNE.TSNEEmbedding(
embedding = openTSNE.TSNEEmbedding(
initialization, affinities, learning_rate=self.learning_rate,
theta=self.theta, min_num_intervals=self.min_num_intervals,
ints_in_interval=self.ints_in_interval, n_jobs=self.n_jobs,
@@ -486,5 +486,5 @@ def __call__(self, data: Table) -> TSNEModel:

@staticmethod
def default_initialization(data, n_components=2, random_state=None):
return fastTSNE.initialization.pca(
return openTSNE.initialization.pca(
data, n_components, random_state=random_state)
@@ -51,7 +51,7 @@ requirements:
- commonmark
- serverfiles
- matplotlib >=2.0.0
- fasttsne ==0.2.13
- opentsne >=0.3.0

test:
# Python imports
@@ -18,4 +18,4 @@ serverfiles # for Data Sets synchronization
networkx
python-louvain
requests
fastTSNE==0.2.13
openTSNE>=0.3.0

0 comments on commit ec0ac1e

Please sign in to comment.
You can’t perform that action at this time.