Classifiers

Discriminative Dictionary Learning

class dictlearn.models.DDL(fit_algorithm, transform_algorithm, n_components, n_nonzero_coefs, params, alpha, init_method=0, init_iter=20, gamma=0.001)

Solves the following classification problem

\[\min _{D, W, \boldsymbol{X}}\|\boldsymbol{Y}-\boldsymbol{D} \boldsymbol{X}\|_{F}^{2}+\alpha\|\boldsymbol{H}-\boldsymbol{W} \boldsymbol{X}\|_{F}^{2}\]
Parameters:
  • fit_algorithm ({'ksvd', 'aksvd', 'uaksvd', 'sgk', 'nsgk', 'mod'}, default='aksvd') –

    Algorithm used to update the dictionary:

    • ’ksvd’: uses the ksvd algorithm

    • ’aksvd’: uses the aksvd algorithm

    • ’uaksvd’: uses the uaksvd algorithm

    • ’sgk’: uses the sgk algorithm

    • ’nsgk’: uses the nsgk algorithm

    • ’mod’: uses the mod algorithm

  • transform_algorithm ({'omp'}, default='omp') –

    Algorithm for computing the sparse representation:

    • ’omp’: uses orthogonal matching pursuit to estimate the sparse solution.

  • n_components (int, default=n_features) – Number of dictionary elements to extract.

  • n_nonzero_coefs (int, default=None) – Number of nonzero coefficients to target in each column of the solution. If None, then n_nonzero_coefs=int(n_features / 10).

  • params (None, default=None) – Dictionary with provided parameters for the DL problem. If the params are not given then they will be automatically initialized.

  • alpha (scalar constant) –

  • init_method (scalar constant) –

  • init_iter (int, default=100) – Maximum number of iterations to perform.

  • gamma (scalar constant) –

Example:

import numpy as np

from dictlearn.models import DDL
from dictlearn.datasets import yaleb


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

alpha = 2               # classification penalty
n_components = 200      # number of atoms
n_nonzero_coefs = 4     # sparsity constraint

# define dl parameters
params = {}

# train model
ddl = DDL('ksvd', 'omp', n_components, n_nonzero_coefs, params, alpha)
ddl.fit(X_train, y_train, max_iter=10, batches=4)

# test model
y_pred = ddl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = ddl.predict_proba(X_test)

References: Q. Zhang, B. Li, Discriminative K-SVD for dictionary learning in face recognition, in Proceedings of IEEE Conf. Computer Vision and Pattern Recognition (2010), pp. 2691–2698

Kernel Discriminative Dictionary Learning

class dictlearn.models.KDDL(transform_algorithm, n_components, n_nonzero_coefs, kernel_function, params, alpha)

Solves the following classification problem

\[\min _{\boldsymbol{A}, \boldsymbol{W}, \boldsymbol{X}}\| \boldsymbol{\varphi}(\boldsymbol{Y})-\boldsymbol{\varphi} (\boldsymbol{Y}) \boldsymbol{A} \boldsymbol{X}\|_{F}^{2}+\alpha \|\boldsymbol{H}-\boldsymbol{W} \boldsymbol{X}\|_{F}^{2}\]
Parameters:
  • transform_algorithm ({'omp'}, default='omp') –

    Algorithm for computing the sparse representation:

    • ’omp’: uses orthogonal matching pursuit to estimate the sparse solution.

  • n_components (int, default=n_features) – Number of dictionary elements to extract.

  • n_nonzero_coefs (int, default=None) – Number of nonzero coefficients to target in each column of the solution. If None, then n_nonzero_coefs=int(n_features / 10).

  • kernel_function (handle function) – Computes the kernel matrix.

  • params (None, default=None) – Dictionary with provided parameters for the DL problem. If the params are not given then they will be automatically initialized.

  • alpha (scalar constant) –

  • init_method (scalar constant) –

  • init_iter (int, default=100) – Maximum number of iterations to perform.

  • gamma (scalar constant) –

Example:

import numpy as np

from dictlearn.models import KDDL
from dictlearn.datasets import yaleb
from dictlearn.kernels import dl_rbf_kernel


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

alpha = 2               # classification penalty
n_components = 200      # number of atoms
n_nonzero_coefs = 4     # sparsity constraint

# define general parameters
params = {}
params['gamma'] = 1e-5

# train model
kddl = KDDL('omp', n_components, n_nonzero_coefs, dl_rbf_kernel, params, alpha)
kddl.fit(X_train, y_train, max_iter=10, batches=2)

# test model
y_pred = kddl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = kddl.predict_proba(X_test)

Label Consistent Dictionary Learning

class dictlearn.models.LCDL(fit_algorithm, transform_algorithm, n_components, n_nonzero_coefs, params, alpha, beta, init_method=0, init_iter=20, gamma=0.001)

Solves the following classification problem

\[\min _{D, W, \boldsymbol{A}, X}\|\boldsymbol{Y}-\boldsymbol{D} \boldsymbol{X}\|_{F}^{2}+\alpha\|\boldsymbol{H}-\boldsymbol{W} \boldsymbol{X}\|_{F}^{2}+\beta\|\boldsymbol{Q}-\boldsymbol{A} \boldsymbol{X}\|_{F}^{2}\]
Parameters:
  • fit_algorithm ({'ksvd', 'aksvd', 'uaksvd', 'sgk', 'nsgk', 'mod'}, default='aksvd') –

    Algorithm used to update the dictionary:

    • ’ksvd’: uses the ksvd algorithm problem

    • ’aksvd’: uses the aksvd algorithm problem

    • ’uaksvd’: uses the uaksvd algorithm problem

    • ’sgk’: uses the sgk algorithm problem

    • ’nsgk’: uses the nsgk algorithm problem

    • ’mod’: uses the mod algorithm problem

  • transform_algorithm ({'omp'}, default='omp') –

    Algorithm for computing the sparse representation:

    • ’omp’: uses orthogonal matching pursuit to estimate the sparse solution.

  • n_components (int, default=n_features) – Number of dictionary elements to extract.

  • n_nonzero_coefs (int, default=None) – Number of nonzero coefficients to target in each column of the solution. If None, then n_nonzero_coefs=int(n_features / 10).

  • params (None, default=None) – Dictionary with provided parameters for the DL problem. If the params are not given then they will be automatically initialized.

  • alpha (scalar constant) –

  • beta (scalar constant) –

  • init_method (scalar constant) –

  • init_iter (int, default=100) – Maximum number of iterations to perform.

  • gamma (scalar constant) –

Example:

import numpy as np

from dictlearn.models import LCDL
from dictlearn.datasets import yaleb


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

alpha = 2               # classification penalty
beta = 4                # label consistent penalty
n_components = 5        # number of atoms
n_nonzero_coefs = 4     # sparsity constraint

# define general parameters
params = {}

# train model
lcdl = LCDL('aksvd', 'omp', n_components, n_nonzero_coefs, params, alpha, beta,
            init_method=0)
lcdl.fit(X_train, y_train, max_iter=10)

# test model
y_pred = lcdl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = lcdl.predict_proba(X_test)

References: Z. Jiang, Z. Lin, L.S. Davis, Label consistent K-SVD: learning a discriminative dictionary for recognition. IEEE Trans. Pattern Anal. Mach. Intell. 35(11), 2651–2664 (2013)

Kernel Label Consistent Dictionary Learning

class dictlearn.models.KLCDL(transform_algorithm, n_components, n_nonzero_coefs, kernel_function, params, alpha, beta)

Solves the following classification problem

\[\min _{D, W, \boldsymbol{A}, X} \|\boldsymbol{\varphi} (\boldsymbol{Y})-\boldsymbol{\varphi}(\boldsymbol{Y}) \boldsymbol{A} \boldsymbol{X}\|_{F}^{2} +\alpha\|\boldsymbol{H}- \boldsymbol{W} \boldsymbol{X}\|_{F}^{2}+\beta\|\boldsymbol{Q}- \boldsymbol{A} \boldsymbol{X}\|_{F}^{2}\]
Parameters:
  • transform_algorithm ({'omp'}, default='omp') –

    AAlgorithm for computing the sparse representation:

    • ’omp’: uses orthogonal matching pursuit to estimate the sparse solution.

  • n_components (int, default=n_features) – Number of dictionary elements to extract.

  • n_nonzero_coefs (int, default=None) – Number of nonzero coefficients to target in each column of the solution. If None, then n_nonzero_coefs=int(n_features / 10).

  • kernel_function (handle function) – Computes the kernel matrix.

  • params (None, default=None) – Dictionary with provided parameters for the DL problem. If the params are not given then they will be automatically initialized.

  • alpha (scalar constant) –

  • beta (scalar constant) –

Example:

import numpy as np

from dictlearn.models import KLCDL
from dictlearn.datasets import yaleb
from dictlearn.kernels import dl_rbf_kernel


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

alpha = 0.01             # classification penalty
beta = 0.01              # label consistent penalty
n_components = 200       # number of atoms
n_nonzero_coefs = 4      # sparsity constraint

# define general parameters
params = {}
params['sigma'] = 100

# train model
klcdl = KLCDL('omp', n_components, n_nonzero_coefs, dl_rbf_kernel, params,
              alpha, beta)
klcdl.fit(X_train, y_train, max_iter=10, batches=1)

# test model
y_pred = klcdl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = klcdl.predict_proba(X_test)

Dictionary Pair Learning

class dictlearn.models.DPL(n_components, tau, theta, gamma)

Solves the following classification problem

\[\min _{\boldsymbol{P}, \boldsymbol{A}, \boldsymbol{D}} \sum_{k=1}^{K}\left\|\boldsymbol{X}_{i}-\boldsymbol{D}_{k} \boldsymbol{A}_{k}\right\|_{F}^{2}+\tau\left\|\boldsymbol{P}_{k} \boldsymbol{X}_{k}-\boldsymbol{A}_{k}\right\|_{F}^{2}+ \theta\left\|\boldsymbol{P}_{k} \overline{\boldsymbol{X}}_{k} \right\|_{F}^{2}, \quad \text { s.t. }\left\|\boldsymbol{d}_{i} \right\|_{2}^{2} \leq 1\]
Parameters:
  • n_components – dictionary size (number of atoms)

  • tau – scalar constant

  • theta – scalar constant

  • gamma – scalar constant

Example:

import numpy as np

from sklearn import preprocessing
from dictlearn.models import DPL
from dictlearn.datasets import yaleb


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

# data normalization
X_train = preprocessing.normalize(X_train, norm='l2', axis=0)
X_test = preprocessing.normalize(X_test, norm='l2', axis=0)

# train model
dpl = DPL(n_components=30, tau=0.05, theta=0.003, gamma=0.0001)
dpl.fit(X_train, y_train, max_iter=10)

# test model
y_pred = dpl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = dpl.predict_proba(X_test)

References: Gu, Shuhang, et al. “Projective dictionary pair learning for pattern classification.” Advances in neural information processing systems 27 (2014): 793-801

Kernel Dictionary Pair Learning

class dictlearn.models.KDPL(n_components, tau, theta, gamma, alpha, kernel_function, params)

Solves the following classification problem

\[\begin{split}\begin{array}{r} \displaystyle\min_{\boldsymbol{P}, \boldsymbol{A}, \boldsymbol{D}} \sum_{k=1}^{\mathrm{N}}\left\| \boldsymbol{\Phi}\left(\boldsymbol{X}_{\boldsymbol{k}}\right) -\boldsymbol{\Phi}(\boldsymbol{X}) \boldsymbol{D}_{k} \boldsymbol{A}_{k}\right\|_{F}^{2}+\tau\left\|\boldsymbol{P}_{k} \boldsymbol{\Phi}^{T}(\boldsymbol{X}) \boldsymbol{\Phi} \left(\boldsymbol{X}_{k}\right)-\boldsymbol{A}_{k}\right\|_{F}^{2} \\ +\theta\left\|\boldsymbol{P}_{k} \boldsymbol{\Phi}^{T}(\boldsymbol{X}) \Phi\left(\overline{\boldsymbol{X}}_{k}\right)\right\|_{F}^{2}, \quad \text { s.t. }\left\|\boldsymbol{d}_{i}\right\|_{2}^{2} \leq 1 \end{array}\end{split}\]
Parameters:
  • n_components – dictionary size (number of atoms)

  • tau – scalar constant

  • theta – scalar constant

  • gamma – scalar constant

  • alpha – scalar constant

  • kernel_function – kernel method

  • params – dictionary learning parameters

Example:

import numpy as np

from sklearn import preprocessing
from dictlearn.models import KDPL
from dictlearn.datasets import yaleb
from dictlearn.kernels import dl_rbf_kernel


# load data
(X_train, y_train), (X_test, y_test) = yaleb.load_data()

# data normalization
X_train = preprocessing.normalize(X_train, norm='l2', axis=0)
X_test = preprocessing.normalize(X_test, norm='l2', axis=0)

# define dl parameters
params = {}
params['gamma'] = 0.5

# train model
kdpl = KDPL(n_components=30, tau=0.05, theta=0.003, gamma=1e-4,
            alpha=1e-4, kernel_function=dl_rbf_kernel, params=params)
kdpl.fit(X_train, y_train, max_iter=10)

# test model
y_pred = kdpl.predict(X_test)
accuracy = np.sum(y_test == y_pred) / len(y_test)
y_proba = kdpl.predict_proba(X_test)