基于二值矩阵的闭合形状多项式方程近似求解方法咨询
二元n次多项式拟合0-1闭合形状的最优方案
核心思路
将拟合问题转化为可微二分类优化问题,直接针对多项式系数做梯度优化,相比你之前尝试的方案收敛更快、精度更高。
具体实现步骤
- 数据预处理:将0-1矩阵的所有像素坐标映射到[-1,1]区间,给每个坐标点打标签:形状内的点标签为0(对应
p(x,y) ≤ 0),形状外的点标签为1(对应p(x,y) > 0)。 - 构造多项式特征:枚举所有n次二元多项式的单项式项,即所有满足
a + b ≤ n的x^a * y^b项,将每个坐标点代入计算得到对应的特征向量。例如n=2时,特征为[1, x, y, x², xy, y²]。 - 设计可微损失函数:采用带L2正则的交叉熵损失,避免离散损失难优化的问题:
- 对每个点的多项式输出
p(x,y)过sigmoid函数,得到该点属于形状外的预测概率 - 计算所有点的预测结果和真实标签的交叉熵,作为损失主项
- 加入多项式系数的L2正则项,防止高次多项式过拟合
- 对每个点的多项式输出
- 优化求解:使用L-BFGS或者Adam等梯度优化算法,直接迭代更新多项式的系数,直到损失收敛。
简单实现示例(Python)
import numpy as np from scipy.optimize import minimize # 生成多项式特征 def poly_features(x, y, n): features = [] for a in range(n+1): for b in range(n+1 - a): features.append((x**a) * (y**b)) return np.array(features).T # 损失函数 def loss_func(coeffs, X, y, n, reg_lambda=1e-4): feats = poly_features(X[:,0], X[:,1], n) p = feats @ coeffs # 交叉熵损失 sigmoid = 1 / (1 + np.exp(-p)) ce_loss = -np.mean(y * np.log(sigmoid + 1e-8) + (1 - y) * np.log(1 - sigmoid + 1e-8)) # L2正则 reg_loss = reg_lambda * np.sum(coeffs**2) return ce_loss + reg_loss # 入参说明:X为坐标矩阵(shape为[N,2],每行对应一个点的(x,y)坐标) # y为标签数组(shape为[N,],0代表形状内,1代表形状外),n为指定的多项式次数 n = 4 init_coeffs = np.random.randn(sum([i+1 for i in range(n+1)])) res = minimize(loss_func, init_coeffs, args=(X, y, n), method='L-BFGS') optimal_coeffs = res.x
原有方案的问题说明
你之前尝试的两种方案本身存在结构性缺陷,效果不达预期是正常情况:
- 随机生成样本训练CNN的方案属于间接拟合,需要海量标注数据,且CNN输出的系数无法保证多项式拟合的精度,数据效率极低。
- 贪心优化系数的方案采用不可微的像素重合度作为损失,容易陷入局部最优,收敛速度极慢,很难得到全局较优解。
注意事项
- 多项式的次数n需要和形状的复杂度匹配:低次多项式只能表达凸形状,若你要拟合的是凹形状,需要适当提高n的取值。
- 若对拟合精度要求极高,可以在损失收敛后,再用小学习率做少量迭代微调,进一步降低像素不重合率。
内容的提问来源于stack exchange,提问作者Metin Ersin Arıcan
相关产品推荐
相关产品推荐

