五、实战:量子分类器应用
5.1 数据准备
在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类器需求,选取前两类鸢尾花数据,以简化问题同时突出量子模型分类能力展示。
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:100, :2] # 前100个样本,两个特征
y = iris.target[:100]
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
首先,通过datasets.load_iris()加载完整鸢尾花数据集,利用切片操作iris.data[:100, :2]精准提取前 100 个样本且仅保留两个特征,对应标签y同样取前 100 个,完成数据初步筛选。接着,引入StandardScaler进行数据标准化,这一步骤至关重要,能将不同特征的数据统一到相近数值范围,避免因特征量纲差异导致模型训练偏差,经fit_transform操作,训练数据X_train完成标准化转换,测试数据X_test亦同。最后,train_test_split函数依据 80:20 比例划分训练集与测试集,随机种子random_state=42确保每次划分结果一致,为后续模型训练与评估的可比性提供保障。
5.2 数据编码
数据编码环节旨在将经典数据转换为量子态,使量子电路能够处理。在此采用角度编码,因其直观且高效地将数据特征映射为量子门旋转角度,契合量子计算逻辑。
# 定义量子比特
qubits = cirq.GridQubit.rect(1, 2) # 两个量子比特
# 定义数据编码电路
def create_quantum_circuit(x):
circuit = cirq.Circuit()
circuit.append(cirq.rx(x[0] * np.pi)(qubits[0]))
circuit.append(cirq.ry(x[1] * np.pi)(qubits[1]))
# 添加纠缠门
circuit.append(cirq.CNOT(qubits[0], qubits[1]))
return circuit
# 创建训练和测试量子电路
train_circuits = [create_quantum_circuit(x) for x in X_train]
test_circuits = [create_quantum_circuit(x) for x in X_test]
# 转换为TFQ张量
train_quantum_data = tfq.convert_to_tensor(train_circuits)
test_quantum_data = tfq.convert_to_tensor(test_circuits)
先通过cirq.GridQubit.rect(1, 2)定义两个排成一行的量子比特,作为量子电路基础单元。随后,create_quantum_circuit函数构建核心编码电路,针对输入数据特征向量x,分别对两个量子比特施加绕 X 轴和 Y 轴旋转门,旋转角度依据对应特征值乘以np.pi确定,如此将特征值编码到量子比特状态;并添加CNOT门引入纠缠,丰富量子态表达。基于此,利用列表推导式为训练集、测试集中每个样本构建量子电路,分别存储于train_circuits与test_circuits。最后,借助tfq.convert_to_tensor函数将量子电路列表转换为 TensorFlow Quantum 张量形式,完成向模型输入数据的最终转换,确保量子模型能顺利接收处理。
5.3 模型构建
模型构建是量子分类器实战核心,整合前期数据准备与编码成果,构建含参数化量子电路(PQC)层的量子模型,使其兼具量子计算优势与机器学习分类能力。
# 创建符号变量
readout = cirq.Z(qubits[0]) # 测量第一个量子比特
# 定义可训练的量子电路
symbol = sympy.Symbol('theta')
variational_circuit = cirq.Circuit()
variational_circuit.append(cirq.ry(symbol)(qubits[0]))
variat