|
| 1 | +import pennylane as qml |
| 2 | +from pennylane import numpy as np |
| 3 | + |
| 4 | +from sklearn.model_selection import train_test_split |
| 5 | +import pandas as pd |
| 6 | + |
| 7 | +from sklearn.metrics import accuracy_score |
| 8 | +from sklearn.metrics import f1_score, precision_score, recall_score |
| 9 | + |
| 10 | +from sklearn.svm import SVC |
| 11 | + |
| 12 | +num_qubits = 4 |
| 13 | + |
| 14 | +def layer(x): |
| 15 | + |
| 16 | + qml.BasisEmbedding(x, wires=range(num_qubits)) |
| 17 | + |
| 18 | + for j, wire in enumerate(wires): |
| 19 | + qml.Hadamard(wires=[wire]) |
| 20 | + if j != num_qubits-1: |
| 21 | + qml.CNOT(wires=[j, j+1]) |
| 22 | + else: |
| 23 | + qml.CNOT(wires=[j, 0]) |
| 24 | + |
| 25 | +def ansatz(x, wires): |
| 26 | + layer(x) |
| 27 | + |
| 28 | +adjoint_ansatz = qml.adjoint(ansatz) |
| 29 | + |
| 30 | +dev = qml.device("default.qubit", wires=num_qubits, shots=None) |
| 31 | +wires = dev.wires.tolist() |
| 32 | + |
| 33 | +@qml.qnode(dev, interface="autograd") |
| 34 | +def kernel_circuit(x1, x2): |
| 35 | + ansatz(x1, wires=wires) |
| 36 | + adjoint_ansatz(x2, wires=wires) |
| 37 | + return qml.probs(wires=wires) |
| 38 | + |
| 39 | +def kernel(x1, x2): |
| 40 | + return kernel_circuit(x1, x2)[0] |
| 41 | + |
| 42 | +df_train = pd.read_csv('titanic.csv') |
| 43 | + |
| 44 | +df_train['Pclass'] = df_train['Pclass'].astype(str) |
| 45 | + |
| 46 | +df_train = pd.concat([df_train, pd.get_dummies(df_train[['Pclass', 'Sex', 'Embarked']])], axis=1) |
| 47 | + |
| 48 | +X_train, X_test, y_train, y_test = train_test_split(df_train.drop(columns=['Survived']), df_train['Survived'], test_size=0.10, random_state=42, stratify=df_train['Survived']) |
| 49 | + |
| 50 | +X_train['Age'] = X_train['Age'].fillna(X_train['Age'].median()) |
| 51 | +X_test['Age'] = X_test['Age'].fillna(X_test['Age'].median()) |
| 52 | + |
| 53 | +X_train['is_child'] = X_train['Age'].map(lambda x: 1 if x < 12 else 0) |
| 54 | +X_test['is_child'] = X_test['Age'].map(lambda x: 1 if x < 12 else 0) |
| 55 | + |
| 56 | +cols_model = ['is_child', 'Pclass_1', 'Pclass_2', 'Sex_female'] |
| 57 | + |
| 58 | +X_train = X_train[cols_model] |
| 59 | +X_test = X_test[cols_model] |
| 60 | + |
| 61 | +X_train = np.array(X_train.values, requires_grad=False) |
| 62 | + |
| 63 | +init_kernel = lambda x1, x2: kernel(x1, x2) |
| 64 | +K = qml.kernels.square_kernel_matrix(X_train, init_kernel, assume_normalized_kernel=True) |
| 65 | + |
| 66 | +svm = SVC(kernel=lambda X1, X2: qml.kernels.kernel_matrix(X1, X2, init_kernel)).fit(X_train, y_train) |
| 67 | + |
| 68 | +X_test = np.array(X_test.values, requires_grad=False) |
| 69 | + |
| 70 | +predictions = svm.predict(X_test) |
| 71 | + |
| 72 | +accuracy_score(y_test, predictions) |
| 73 | +precision_score(y_test, predictions) |
| 74 | +recall_score(y_test, predictions) |
| 75 | +f1_score(y_test, predictions, average='macro') |
| 76 | + |
| 77 | +svm1 = SVC(gamma='auto', kernel='rbf') |
| 78 | +svm1.fit(X_train, y_train) |
| 79 | + |
| 80 | +y_pred = svm1.predict(X_test) |
| 81 | + |
| 82 | +accuracy_score(y_test, y_pred) |
| 83 | +precision_score(y_test, y_pred) |
| 84 | +recall_score(y_test, y_pred) |
| 85 | +f1_score(y_test, y_pred, average='macro') |
0 commit comments