Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python为平滑约束最小二乘法寻找最佳权重值?_Python_Numpy_Scipy_Statsmodels_Least Squares - Fatal编程技术网

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

使用Python为平滑约束最小二乘法寻找最佳权重值?,python,numpy,scipy,statsmodels,least-squares,Python,Numpy,Scipy,Statsmodels,Least Squares,我有一个最小二乘问题要解决,没有任何已知的参数估计。我施加了一个约束条件,即我想要的解决方案是平滑的(模型参数变化缓慢),因此我最小化了相邻参数之间的差异(用于此地质问题的传统补救方法) 通过将约束方程排列为原始数据方程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

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

通过将约束方程排列为原始数据方程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选择合适的值似乎是约束模型参数的良好解的关键步骤


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

在所提供的解决方案中,我将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\u quality\u metric
函数

在所提供的解决方案中,我将G\u 0称为G,不带附加约束,类似地,d\u 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 

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

,请您解释一下您认为质量最好的解决方案是什么?您是否试图以“最佳质量”优化
w
G
d
?我相信残差的改进行为可用于为所寻求的参数选择一组最佳值。残差改进行为的定义是什么?也许你可以提供一个公式/函数来优化或给出一个例子,所以我们可以帮助更好。你能解释一下你认为最好的解决方案吗?您是否试图以“最佳质量”优化
w
G
d
?我相信残差的改进行为可用于为所寻求的参数选择一组最佳值。残差改进行为的定义是什么?也许你可以提供一个方程/函数来优化,或者给出一个例子,这样我们可以更好地帮助你。