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

基于Scipy的2D仿射映射参数估计:实现正确性与优化咨询

问题分析与解决方案

1. 验证平方距离和最小化实现的正确性

你的误差函数实现数学逻辑是正确的:目标是最小化预测值与真实值的平方欧氏距离之和,对应公式:
$$\sum_{i=1}^N | M A_i + c - B_i |_2^2$$
代码中np.sum(np.sum((predicted_B - B)**2, axis=1))完全等价于该公式,计算逻辑无误。

但当前实现依赖迭代优化(scipy.optimize.minimize),存在两个潜在隐患:

  • 全零初始猜测可能导致优化陷入局部最优
  • 默认L-BFGS-B优化器对线性问题的效率和稳定性不如闭式解

2. 严格遵循假设下的优化方案

由于你的模型是线性仿射变换(参数M、c均为线性参数),该问题属于线性最小二乘问题,存在闭式解,无需迭代优化,结果更准确且稳定。

闭式解推导

将模型拆分为两个独立的线性回归问题:

  • 对于B的第一列:$B_{i,0} = M_{00}A_{i,0} + M_{01}A_{i,1} + c_0$
  • 对于B的第二列:$B_{i,1} = M_{10}A_{i,0} + M_{11}A_{i,1} + c_1$

构造增广特征矩阵:给每个A的样本行末尾添加1,转化为标准线性回归形式 $y = X\beta$,其中:

  • $X$ 是 $N \times 3$ 矩阵,每行是 $[A_{i,0}, A_{i,1}, 1]$
  • $\beta$ 是参数向量,对应B第一列的 $[M_{00}, M_{01}, c_0]^T$,第二列的 $[M_{10}, M_{11}, c_1]^T$

改进代码

import numpy as np
import matplotlib.pyplot as plt

A = np.array([
    [0, -6],
    [0, 6],
    [-6, 0],
    [6, 0],
    [-3, -3],
    [-3, 3],
    [0,0],
    [2, -2],
    [2, 4],
    [-3, 0],
    [-5, -3],
    [2, 5]
])

B = np.array([
    [0.45070423, 0.52288732],
    [0.125, 0.5625],
    [0.1754386, 0.15789474],
    [0.200489, 0.55012225],
    [0.30769231, 0.32451923],
    [0.1375, 0.45],
    [0.19935691, 0.46302251],
    [0.32142857, 0.53571429],
    [0.12765957, 0.53191489],
    [0.15246637, 0.30269058],
    [0.2247191, 0.20224719],
    [0.14379085, 0.55882353],
])

# 构造增广特征矩阵:添加常数项列
X = np.hstack([A, np.ones((A.shape[0], 1))])

# 求解线性最小二乘:对B的每一列分别求解
beta0, _, _, _ = np.linalg.lstsq(X, B[:, 0], rcond=None)
beta1, _, _, _ = np.linalg.lstsq(X, B[:, 1], rcond=None)

# 重构M和c
M = np.array([
    [beta0[0], beta0[1]],
    [beta1[0], beta1[1]]
])
c = np.array([beta0[2], beta1[2]])

# 计算预测值与平方距离和
predicted_B = A @ M + c
sum_squared_error = np.sum(np.sum((predicted_B - B)**2, axis=1))

# 输出结果
print(f"平方距离和: {sum_squared_error:.6f}")
print("估计的M矩阵:")
print(M)
print("估计的c向量:")
print(c)

# 可视化:设置坐标轴范围匹配B的取值区间
plt.scatter(B[:,0], B[:,1], color='red', s=10, label='真实值B')
plt.scatter(predicted_B[:,0], predicted_B[:,1], color='blue', s=10, label='预测值', marker='x')
plt.legend()
plt.xlim(0, 0.7)
plt.ylim(0, 0.7)
plt.show()

关键改进点

  1. 闭式解替代迭代优化:直接得到全局最优解,避免初始值和局部最优问题
  2. 拆分独立回归:利用线性模型的可分性,分别求解B两列的参数,结果更精准
  3. 优化可视化:设置坐标轴范围与B的取值范围一致,更清晰对比真实值与预测值

额外建议

  • 若坚持使用minimize,务必打印result.success和result.message确认优化是否收敛
  • 可计算每个维度的$R^2$值,评估模型对B每一列的解释能力
  • 若闭式解的可视化效果仍不理想,可能说明线性仿射变换的假设不符合数据真实映射关系,但这超出了你设定的前提范围

内容的提问来源于stack exchange,提问作者yuxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:18:08