1919from six .moves import xrange
2020from sklearn .metrics import euclidean_distances
2121from sklearn .base import TransformerMixin
22+
23+ from ._util import _check_n_components
2224from .base_metric import MahalanobisMixin
2325
2426
2527# commonality between LMNN implementations
2628class _base_LMNN (MahalanobisMixin , TransformerMixin ):
2729 def __init__ (self , k = 3 , min_iter = 50 , max_iter = 1000 , learn_rate = 1e-7 ,
2830 regularization = 0.5 , convergence_tol = 0.001 , use_pca = True ,
29- verbose = False , preprocessor = None ):
31+ verbose = False , preprocessor = None , n_components = None ,
32+ num_dims = 'deprecated' ):
3033 """Initialize the LMNN object.
3134
3235 Parameters
@@ -40,6 +43,15 @@ def __init__(self, k=3, min_iter=50, max_iter=1000, learn_rate=1e-7,
4043 preprocessor : array-like, shape=(n_samples, n_features) or callable
4144 The preprocessor to call to get tuples from indices. If array-like,
4245 tuples will be formed like this: X[indices].
46+
47+ n_components : int or None, optional (default=None)
48+ Dimensionality of reduced space (if None, defaults to dimension of X).
49+
50+ num_dims : Not used
51+
52+ .. deprecated:: 0.5.0
53+ `num_dims` was deprecated in version 0.5.0 and will
54+ be removed in 0.6.0. Use `n_components` instead.
4355 """
4456 self .k = k
4557 self .min_iter = min_iter
@@ -49,27 +61,35 @@ def __init__(self, k=3, min_iter=50, max_iter=1000, learn_rate=1e-7,
4961 self .convergence_tol = convergence_tol
5062 self .use_pca = use_pca
5163 self .verbose = verbose
64+ self .n_components = n_components
65+ self .num_dims = num_dims
5266 super (_base_LMNN , self ).__init__ (preprocessor )
5367
5468
5569# slower Python version
5670class python_LMNN (_base_LMNN ):
5771
5872 def fit (self , X , y ):
73+ if self .num_dims != 'deprecated' :
74+ warnings .warn ('"num_dims" parameter is not used.'
75+ ' It has been deprecated in version 0.5.0 and will be'
76+ ' removed in 0.6.0. Use "n_components" instead' ,
77+ DeprecationWarning )
5978 k = self .k
6079 reg = self .regularization
6180 learn_rate = self .learn_rate
6281
6382 X , y = self ._prepare_inputs (X , y , dtype = float ,
6483 ensure_min_samples = 2 )
65- num_pts , num_dims = X .shape
84+ num_pts , d = X .shape
85+ output_dim = _check_n_components (d , self .n_components )
6686 unique_labels , label_inds = np .unique (y , return_inverse = True )
6787 if len (label_inds ) != num_pts :
6888 raise ValueError ('Must have one label per point.' )
6989 self .labels_ = np .arange (len (unique_labels ))
7090 if self .use_pca :
7191 warnings .warn ('use_pca does nothing for the python_LMNN implementation' )
72- self .transformer_ = np .eye (num_dims )
92+ self .transformer_ = np .eye (output_dim , d )
7393 required_k = np .bincount (label_inds ).min ()
7494 if self .k > required_k :
7595 raise ValueError ('not enough class labels for specified k'
@@ -272,7 +292,7 @@ class LMNN(_base_LMNN):
272292 n_iter_ : `int`
273293 The number of iterations the solver has run.
274294
275- transformer_ : `numpy.ndarray`, shape=(num_dims , n_features)
295+ transformer_ : `numpy.ndarray`, shape=(n_components , n_features)
276296 The learned linear transformation ``L``.
277297 """
278298
0 commit comments