如何使用 numpy 从具有约束的损失最小化中获得r_squared?



使用带有约束的损失最小化对 numpy 和 scipy 执行回归。下面是一个示例:

y_values是具有 numObservation 值的向量

x_matrix_trans是 x 矩阵

我们希望用约束求解 y = Xc,使得一些系数乘以一些输入权重的总和必须为 0。

def constraint1(x):
res = 0
for i in range (0, NUM_WEIGHTS):
res = res + x[CONST_VAL + i] * weights[CONST_VAL + i]
return res
def loss(x):
return np.sum(np.square((np.dot(x, x_matrix_trans) - y_values)))
cons = ({'type': 'eq',
'fun' : constraint1})
x0 = np.zeros(x_matrix_trans.shape[0])        
res = minimize(loss, x0, method='SLSQP',constraints=cons, options={'disp': True, 'maxiter' : 1000, 'ftol' : 1e-07}) 
print(res.x)

我的回归在res.x中产生了正确的值,但我还需要计算r_squared和调整后的r_squared。我试图计算r_squared但结果不正确。

以下是我尝试计算r_squared的方式:

ymeas = y_values
yfit = np.dot(res.x, x_matrix_trans)
ss_res = np.sum((ymeas - yfit) ** 2)
ss_tot = np.var(ymeas) * len(ymeas)
rsq = 1 - ss_res / ss_tot

以下是我尝试计算调整后r_squared的方式:

adjRsq = 0.0
if ((num_coefficients - num_observations - 1) != 0):
adjRsq = rsq - (1-rsq)*(num_coefficients - 1)/( num_observations -num_coefficients - 1)

谢谢。

事实证明,我的答案一直都是正确的。根据维基百科应该调整r_square除外

adjRsq = rsq - (1-rsq)*(num_coeff)/(num_observations-num_coeff-1)

而不是

adjRsq = rsq - (1-rsq)*(num_coeff - 1)/(num_observations-num_coeff-1)

最新更新