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
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
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
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