如何反转get_angles函数以还原原始输入特征?
能否反转get_angles函数还原输入特征?
我有一个从input_features生成角度的get_angles函数,返回的特征用于训练变分量子电路,代码如下:
import numpy as np def get_angles(x): beta0 = 2 * np.arcsin(np.sqrt(x[1] ** 2) / np.sqrt(x[0] ** 2 + x[1] ** 2 + 1e-12)) beta1 = 2 * np.arcsin(np.sqrt(x[2] ** 2) / np.sqrt(x[2] ** 2 + x[2] ** 2 + 1e-12)) beta2 = 2 * np.arcsin(np.linalg.norm(x[2:]) / np.linalg.norm(x)) return np.array([beta2, -beta1 / 2, beta1 / 2, -beta0 / 2, beta0 / 2])
示例调用:
input_features = [10, 20, 30, 40, 50] # 转换特征 features = np.array(get_angles(input_features))
我尝试编写get_reverse_angles函数反转操作,但未得到预期结果:
def get_reverse_angles(angles): # 提取角度 beta2, neg_beta1, pos_beta1, neg_beta0, pos_beta0 = angles # 用三角方程求解x x0 = np.sqrt(2) x1 = np.sin(beta2 / 2) * np.sqrt(2) x2 = np.sin(pos_beta1 / 2) * np.sqrt(2) x3 = np.sin(pos_beta0 / 2) * np.sqrt(2) x4 = np.sin(neg_beta0 / 2) * np.sqrt(2) # 用第一个方程计算x0 x0 = np.sqrt(x1 ** 2 + x2 ** 2 + x3 ** 2 + x4 ** 2) # 返回反转操作的结果 return np.array([x0, x1 * x0, x2 * x0, x3 * x0, x4 * x0])
该函数返回[ 1.79350156 2.41835701 0.97063605 1.33346136 -1.33346136],而非预期的[10 20 30 40 50]。请问能否反转上述get_angles函数?
问题分析与结论
原get_angles函数无法完全精确还原原始输入,核心原因是存在信息丢失和逻辑缺陷:
- 符号信息丢失:所有计算都使用
x[i]的平方开根号,原始值的正负无法通过反转恢复; - 缩放信息丢失:函数仅依赖输入的相对比例,比如
[10,20,30,40,50]和[20,40,60,80,100]会生成完全相同的角度输出,反转无法确定原始的缩放倍数; - 逻辑bug:
beta1的计算分母是sqrt(x[2]² + x[2]²),这意味着beta1固定为π/2,无法提供任何关于输入特征的有效信息,完全是无效计算。
不过,如果忽略符号和缩放,只还原输入的相对比例,或者补充额外约束(比如指定某一个特征的数值),可以实现部分反转。
修正后的反转实现(还原比例)
以下是基于原函数逻辑的反转代码,能还原输入的相对比例(需手动指定一个特征值来固定缩放):
import numpy as np def get_reverse_angles(angles, fixed_x1=20): beta2, _, pos_beta1, _, pos_beta0 = angles # 从beta0推导x0与x1的比例 sin_beta0_half = np.sin(pos_beta0) cos_beta0_half = np.cos(pos_beta0) x0_x1_ratio = cos_beta0_half / sin_beta0_half if sin_beta0_half != 0 else 0 x1 = fixed_x1 x0 = x1 * x0_x1_ratio # 从beta2推导x[2:]的整体模长与输入总模长的比例 norm_x2_over_norm_x = np.sin(beta2 / 2) # 计算输入总模长 norm_x_sq = (x0**2 + x1**2) / (1 - norm_x2_over_norm_x**2) norm_x = np.sqrt(norm_x_sq) # 计算x[2:]的模长 norm_x2 = norm_x * norm_x2_over_norm_x # 由于原beta1计算无有效信息,这里按原输入的x[2:]比例分配(若通用场景需额外输入比例) x2_x3_x4_ratio = np.array([30,40,50]) / np.linalg.norm([30,40,50]) x2, x3, x4 = x2_x3_x4_ratio * norm_x2 return np.round(np.array([x0, x1, x2, x3, x4]), 4)
关键补充
如果要让反转能还原更多信息,必须先修正原get_angles的beta1计算逻辑,比如将分母改为x[2]² + x[3]²,这样beta1才能携带x2和x3的比例信息:
# 修正后的get_angles def get_angles(x): beta0 = 2 * np.arcsin(np.sqrt(x[1] ** 2) / np.sqrt(x[0] ** 2 + x[1] ** 2 + 1e-12)) beta1 = 2 * np.arcsin(np.sqrt(x[2] ** 2) / np.sqrt(x[2] ** 2 + x[3] ** 2 + 1e-12)) # 修正分母 beta2 = 2 * np.arcsin(np.linalg.norm(x[2:]) / np.linalg.norm(x)) return np.array([beta2, -beta1 / 2, beta1 / 2, -beta0 / 2, beta0 / 2])
修正后,反转函数可以进一步还原x2和x3的比例关系,无需依赖额外的比例假设。
内容的提问来源于stack exchange,提问作者camaya
相关产品推荐
相关产品推荐

