You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反转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函数无法完全精确还原原始输入,核心原因是存在信息丢失和逻辑缺陷:

  1. 符号信息丢失:所有计算都使用x[i]的平方开根号,原始值的正负无法通过反转恢复;
  2. 缩放信息丢失:函数仅依赖输入的相对比例,比如[10,20,30,40,50]和[20,40,60,80,100]会生成完全相同的角度输出,反转无法确定原始的缩放倍数;
  3. 逻辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:46