Ejemplo n.º 1
0
    def __init__(
        self,
        feature_map: FeatureMap,
        training_dataset: Optional[Dict[str, np.ndarray]] = None,
        test_dataset: Optional[Dict[str, np.ndarray]] = None,
        datapoints: Optional[np.ndarray] = None,
        multiclass_extension: Optional[MulticlassExtension] = None,
        quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None
    ) -> None:
        """
        Args:
            feature_map: Feature map module, used to transform data
            training_dataset: Training dataset.
            test_dataset: Testing dataset.
            datapoints: Prediction dataset.
            multiclass_extension: If number of classes is greater than 2 then a multiclass scheme
                must be supplied, in the form of a multiclass extension.
            quantum_instance: Quantum Instance or Backend

        Raises:
            AquaError: Multiclass extension not supplied when number of classes > 2
        """
        super().__init__(quantum_instance)
        # check the validity of provided arguments if possible
        if training_dataset is not None:
            is_multiclass = get_num_classes(training_dataset) > 2
            if is_multiclass:
                if multiclass_extension is None:
                    raise AquaError('Dataset has more than two classes. '
                                    'A multiclass extension must be provided.')
            else:
                if multiclass_extension is not None:
                    logger.warning(
                        "Dataset has just two classes. "
                        "Supplied multiclass extension will be ignored")

        self.training_dataset = None
        self.test_dataset = None
        self.datapoints = None
        self.class_to_label = None
        self.label_to_class = None
        self.num_classes = None

        self.setup_training_data(training_dataset)
        self.setup_test_data(test_dataset)
        self.setup_datapoint(datapoints)

        self.feature_map = feature_map
        self.num_qubits = self.feature_map.num_qubits

        if multiclass_extension is None:
            qsvm_instance = _QSVM_Binary(self)
        else:
            multiclass_extension.set_estimator(_QSVM_Estimator, [feature_map])
            qsvm_instance = _QSVM_Multiclass(self, multiclass_extension)

        self.instance = qsvm_instance
Ejemplo n.º 2
0
    def __init__(self, feature_map, training_dataset, test_dataset=None, datapoints=None,
                 multiclass_extension=None):
        """Constructor.

        Args:
            feature_map (FeatureMap): feature map module, used to transform data
            training_dataset (dict): training dataset.
            test_dataset (Optional[dict]): testing dataset.
            datapoints (Optional[numpy.ndarray]): prediction dataset.
            multiclass_extension (Optional[MultiExtension]): if number of classes > 2 then
                a multiclass scheme is needed.

        Raises:
            ValueError: if training_dataset is None
            AquaError: use binary classifer for classes > 3
        """
        super().__init__()
        if training_dataset is None:
            raise ValueError('Training dataset must be provided')

        is_multiclass = get_num_classes(training_dataset) > 2
        if is_multiclass:
            if multiclass_extension is None:
                raise AquaError('Dataset has more than two classes. '
                                'A multiclass extension must be provided.')
        else:
            if multiclass_extension is not None:
                logger.warning("Dataset has just two classes. "
                               "Supplied multiclass extension will be ignored")

        self.training_dataset, self.class_to_label = split_dataset_to_data_and_labels(
            training_dataset)
        if test_dataset is not None:
            self.test_dataset = split_dataset_to_data_and_labels(test_dataset,
                                                                 self.class_to_label)
        else:
            self.test_dataset = None

        self.label_to_class = {label: class_name for class_name, label
                               in self.class_to_label.items()}
        self.num_classes = len(list(self.class_to_label.keys()))

        if datapoints is not None and not isinstance(datapoints, np.ndarray):
            datapoints = np.asarray(datapoints)
        self.datapoints = datapoints

        self.feature_map = feature_map
        self.num_qubits = self.feature_map.num_qubits

        if multiclass_extension is None:
            qsvm_instance = _QSVM_Binary(self)
        else:
            qsvm_instance = _QSVM_Multiclass(self, multiclass_extension)

        self.instance = qsvm_instance
Ejemplo n.º 3
0
    def __init__(
            self,
            feature_map: FeatureMap,
            training_dataset: Optional[Dict[str, np.ndarray]] = None,
            test_dataset: Optional[Dict[str, np.ndarray]] = None,
            datapoints: Optional[np.ndarray] = None,
            multiclass_extension: Optional[MulticlassExtension] = None
    ) -> None:
        """

        Args:
            feature_map: feature map module, used to transform data
            training_dataset: training dataset.
            test_dataset: testing dataset.
            datapoints: prediction dataset.
            multiclass_extension: if number of classes > 2 then
                a multiclass scheme is needed.

        Raises:
            AquaError: Using binary classifier when number of classes > 2
        """
        super().__init__()
        # check the validity of provided arguments if possible
        if training_dataset is not None:
            is_multiclass = get_num_classes(training_dataset) > 2
            if is_multiclass:
                if multiclass_extension is None:
                    raise AquaError('Dataset has more than two classes. '
                                    'A multiclass extension must be provided.')
            else:
                if multiclass_extension is not None:
                    logger.warning(
                        "Dataset has just two classes. "
                        "Supplied multiclass extension will be ignored")

        self.training_dataset = None
        self.test_dataset = None
        self.datapoints = None
        self.class_to_label = None
        self.label_to_class = None
        self.num_classes = None

        self.setup_training_data(training_dataset)
        self.setup_test_data(test_dataset)
        self.setup_datapoint(datapoints)

        self.feature_map = feature_map
        self.num_qubits = self.feature_map.num_qubits

        if multiclass_extension is None:
            qsvm_instance = _QSVM_Binary(self)
        else:
            qsvm_instance = _QSVM_Multiclass(self, multiclass_extension)

        self.instance = qsvm_instance
Ejemplo n.º 4
0
    def __init__(
        self,
        feature_map: Union[QuantumCircuit, FeatureMap],
        training_dataset: Optional[Dict[str, np.ndarray]] = None,
        test_dataset: Optional[Dict[str, np.ndarray]] = None,
        datapoints: Optional[np.ndarray] = None,
        multiclass_extension: Optional[MulticlassExtension] = None,
        lambda2: float = 0.001,
        quantum_instance: Optional[Union[QuantumInstance, BaseBackend,
                                         Backend]] = None
    ) -> None:
        """
        Args:
            feature_map: Feature map module, used to transform data
            training_dataset: Training dataset.
            test_dataset: Testing dataset.
            datapoints: Prediction dataset.
            multiclass_extension: If number of classes is greater than 2 then a multiclass scheme
                must be supplied, in the form of a multiclass extension.
            lambda2: L2 norm regularization factor
            quantum_instance: Quantum Instance or Backend

        Raises:
            AquaError: Multiclass extension not supplied when number of classes > 2
        """
        super().__init__(quantum_instance)
        warn_package('aqua.algorithms.classifiers',
                     'qiskit_machine_learning.algorithms.classifiers',
                     'qiskit-machine-learning')
        # check the validity of provided arguments if possible
        if training_dataset is not None:
            is_multiclass = get_num_classes(training_dataset) > 2
            if is_multiclass:
                if multiclass_extension is None:
                    raise AquaError('Dataset has more than two classes. '
                                    'A multiclass extension must be provided.')
            else:
                if multiclass_extension is not None:
                    logger.warning(
                        "Dataset has just two classes. "
                        "Supplied multiclass extension will be ignored")

        self.training_dataset = None
        self.test_dataset = None
        self.datapoints = None
        self.class_to_label = None
        self.label_to_class = None
        self.num_classes = None

        self.setup_training_data(training_dataset)
        self.setup_test_data(test_dataset)
        self.setup_datapoint(datapoints)
        self.lambda2 = lambda2

        self.feature_map = feature_map
        self.num_qubits = self.feature_map.num_qubits

        if isinstance(feature_map, QuantumCircuit):
            # patch the feature dimension attribute to the circuit
            self.feature_map.feature_dimension = len(feature_map.parameters)
            if not hasattr(feature_map, 'ordered_parameters'):
                self.feature_map.ordered_parameters = sorted(
                    feature_map.parameters, key=lambda p: p.name)
            self.feature_map_params_x = ParameterVector(
                'x', self.feature_map.feature_dimension)
            self.feature_map_params_y = ParameterVector(
                'y', self.feature_map.feature_dimension)
        else:
            warnings.warn("""
            The {} object as input for the QSVM is deprecated as of 0.9.0 and will
            be removed no earlier than 3 months after the release.
            You should pass a QuantumCircuit object instead.
            See also qiskit.circuit.library.data_preparation for a collection
            of suitable circuits.""".format(type(feature_map)),
                          DeprecationWarning,
                          stacklevel=2)
            self.feature_map_params_x = ParameterVector(
                'x', feature_map.feature_dimension)
            self.feature_map_params_y = ParameterVector(
                'y', feature_map.feature_dimension)

        qsvm_instance = None  # type: Optional[Union[_QSVM_Binary, _QSVM_Multiclass]]
        if multiclass_extension is None:
            qsvm_instance = _QSVM_Binary(self)
        else:
            multiclass_extension.set_estimator(_QSVM_Estimator, [feature_map])
            qsvm_instance = _QSVM_Multiclass(self, multiclass_extension)

        self.instance = qsvm_instance