使用Python为平滑约束最小二乘法寻找最佳权重值?

2024-05-16 21:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个最小二乘问题要解决,没有任何已知的参数估计。我施加了一个约束条件,即我想要的解决方案是平滑的(模型参数变化缓慢),因此我最小化了相邻参数之间的差异(用于此地质问题的传统补救方法)

通过将约束方程排列为原始数据方程d=Gm中的行来实现约束。辅助参数w通过试错法选择(某些教科书称w为拉格朗日乘数)

我有以下资料:

G = np.array([[1,0,1,0,0,6],
             [1,0,0,1,0,6.708],
             [1,0,0,0,1,8.485],
             [0,1,1,0,0,7.616],
             [0,1,0,1,0,7],
             [0,1,0,0,1,7.616]])

d = np.array([[2.323],
             [2.543],
             [2.857],
             [2.64],
             [2.529],
             [2.553]])

现在添加任意w加权平滑度(w=0.01)的约束:

w = 0.01
G = np.array([[1,0,1,0,0,6],
                 [1,0,0,1,0,6.708],
                 [1,0,0,0,1,8.485],
                 [0,1,1,0,0,7.616],
                 [0,1,0,1,0,7],
                 [0,1,0,0,1,7.616],
                 [w,-w,0,0,0,0],
                 [0,w,-w,0,0,0],
                 [0,0,w,-w,0,0],
                 [0,0,0,w,-w,0],
                 [0,0,0,0,w,-w]])

d = np.array([[2.323],
             [2.543],
             [2.857],
             [2.64],
             [2.529],
             [2.553],
              [0],
              [0],
              [0],
              [0],
              [0]])

然而,为w选择合适的值似乎是约束模型参数的良好解的关键步骤

因此,我的问题是:使用Python,是否有一种方法可以循环使用w的不同值的许多计算出的解决方案,并选择用于实现具有最佳质量的解决方案的值


Tags: 方法模型参数原始数据np差异传统解决方案
1条回答
网友
1楼 · 发布于 2024-05-16 21:26:05

在给出的解决方案中,我将G_0称为没有附加约束的G,类似地,d_0是没有附加零的d。我还假设你从某个地方读G_0和d_0,我指的是已知的

import numpy as np

def create_W(n_rows, w):
    W = -np.diagflat(np.ones(n_rows), 1)
    np.fill_diagonal(W, 1)
    return W

def solution_quality_metric(m):
    # this need to be implemented to determine what you mean by "best"

n_rows = 5
d_w = np.zeros(n_rows)

# choose range for w values for example w_min = 0, w_max = 1, dw = 0.01

best_m = -np.inf
best_w = w_min

for w in np.arange(w_min, w_max, dw):
    W = create_W(n_rows, w)

    G = np.concatenate([G_0, W], axis=0)
    d = np.concatenate([d_0, d_w])
    m = np.lstsq(G, d)

    if solution_quality_metric(m) > best_m:
        best_m = solution_quality_metric(m)
        best_w = w 

这段代码显然无法正常工作,因为您没有指定“具有最佳质量的解决方案”的含义。为此,您需要实现solution_quality_metric函数

相关问题 更多 >