使用Python为平滑约束最小二乘法寻找最佳权重值?
我有一个最小二乘问题要解决,没有任何已知的参数估计。我施加了一个约束条件,即我想要的解决方案是平滑的(模型参数变化缓慢),因此我最小化了相邻参数之间的差异(用于此地质问题的传统补救方法) 通过将约束方程排列为原始数据方程d=Gm中的行来实现约束。辅助参数w通过试错法选择(某些教科书称w为拉格朗日乘数) 我有以下资料:使用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
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
?我相信残差的改进行为可用于为所寻求的参数选择一组最佳值。残差改进行为的定义是什么?也许你可以提供一个方程/函数来优化,或者给出一个例子,这样我们可以更好地帮助你。