Example #1
0
def test_ensure_array_dim():

    with raises(ValueError):
        ensure_ndarray_2D(np.random.rand(10, 5), ensure_num_cols=3)

    with raises(ValueError):
        ensure_ndarray_2D(np.random.rand(10), ensure_num_cols=3)

    with raises(ValueError):
        ensure_ndarray_1D(np.random.rand(10, 5))

    with raises(ValueError):
        ensure_ndarray_1D(np.random.rand(10, 5, 10))
Example #2
0
    def __init__(self, km_set, weights, name='WeightedAverageKernel'):
        """Constructor."""

        super().__init__(km_set, name=name)

        if self.km_set.size == len(weights):
            self.weights = ensure_ndarray_1D(weights)
        else:
            raise ValueError('Number of weights ({}) supplied differ from the '
                             'kernel set size ({})'
                             ''.format(self.km_set.size, len(weights)))
Example #3
0
    def fit(self, kernel_weights=None):
        """Computes the sum kernel"""

        if kernel_weights is None:
            kernel_weights = np.ones(self.km_set.size)
        else:
            kernel_weights = ensure_ndarray_1D(kernel_weights)
            if kernel_weights.size != self.km_set.size:
                raise ValueError('Incompatible set of kernel_weights given.'
                                 'Must be an array of length exactly {}'
                                 ''.format(self.km_set.size))

        self.KM = np.zeros((self.num_samples, self.num_samples))
        for weight, km in zip(kernel_weights, self.km_set):
            self.KM = self.KM + weight * km.full

        self._is_fitted = True
Example #4
0
def linear_combination(km_set, weights, norm_weights=False):
    """
    Weighted linear combinations of a set of given kernel matrices

    Parameters
    ----------
    km_set : KernelSet
        Collection of compatible kernel matrices

    weights : Iterable
        Set of weights for the kernel matrices in km_set.
        Weights are not checked to sum to 1.0. Use norm_weights=True if needed.

    norm_weights : bool
        Flag to request normalizing weights to ensure they sum to 1.0

    Returns
    -------
    lin_comb_KM : ndarray
        Final result of weighted linear combination of the kernel matrix set

    """

    if km_set.size == len(weights):
        weights = ensure_ndarray_1D(weights)
    else:
        raise ValueError('Number of weights ({}) supplied differ '
                         'from the kernel set size ({})'
                         ''.format(km_set.size, len(weights)))

    if norm_weights:
        denom = weights.sum()
        if np.isclose(denom, 0.0):
            raise RuntimeError('sum of weights == 0.0, unable to normalize!')
        weights = weights / denom

    # Computes the weighted average kernel
    # km_set.num_samples is a tuple (N, M) when operating on two samples
    #   e.g. train x test
    KM = np.zeros(km_set.num_samples)
    for weight, km in zip(weights, km_set):
        KM = KM + weight * km.full

    return KM
Example #5
0
def linear_combination(km_set, weights):
    """
    Weighted linear combinations of a set of given kernel matrices

    Parameters
    ----------
    km_set : KernelSet
        Collection of compatible kernel matrices

    weights : Iterable
        Set of weights for the kernel matrices in km_set

    Returns
    -------
    lin_comb_KM : ndarray
        Final result of weighted linear combination of the kernel matrix set

    """

    if km_set.size == len(weights):
        weights = ensure_ndarray_1D(weights)
    else:
        raise ValueError('Number of weights ({}) supplied differ '
                         'from the kernel set size ({})'
                         ''.format(km_set.size, len(weights)))

    # TODO should we not ensure weights sum to 1.0?

    # Computes the weighted average kernel
    # km_set.num_samples is a tuple (N, M) when operating on two samples
    #   e.g. train x test
    KM = np.zeros(km_set.num_samples)
    for weight, km in zip(weights, km_set):
        KM = KM + weight * km.full

    return KM