подгонка полиномиальных наименьших квадратов: неинтуитивный результат при регуляризации и добавлении ограничения - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть проблема полиномиальных наименьших квадратов, и когда я (1) регуляризирую и (2) добавляю ограничение (подгонка 4), подгонка будет выглядеть хорошо, если я переверну знак и сместу его вниз.Это показано на графике: fit plot

Мне интересно, почему это так.Исходя из подбора три, ограничение не кажется слишком ужасным, но оно пропускает кривизну в первой части графика, но получает его во второй.Почему регуляризация этой ограниченной проблемы (теперь фиолетового цвета) заставляет также потерять вторую кривую?

Я включил свой код ниже:

import matplotlib.pyplot as plt
import numpy as np
import numpy.linalg as la
import cvxpy as cp

# data
x = np.array([0.98775, 0.9942, 0.99438333, 0.99145417, 0.99070833, 
              0.991325, 0.99117917, 0.97414583, 0.9754625, 0.9850875])
y = np.array([0.729069, 0.66085, 0.658708, 0.693509, 0.723134, 
              0.716455, 0.715611, 0.86655, 0.854071, 0.757493])
N = len(x)
X = np.zeros((N, 3))

# model
def model(x, beta):
    return beta[0] + beta[1]*x + beta[2]*x**2.0

# build features
for i in range(N):
    X[i, 0] = 1.
    X[i, 1] = x[i]
    X[i, 2] = x[i]**2.0

# unconstrained ----------------------------------------------------------

# min_x ||Xbeta - y||_2^2
sol = np.linalg.lstsq(X, y, rcond=None)
beta1 = sol[0]
print "Unconstrained solution: " + str(beta1)
print "Error: ", la.norm(X.dot(beta1) - y)
print "Sum of coeffs: ", sum(beta1)
print

# regularize and solve min_x ||Xbeta - y||_2^2 + mu||beta||_2^2
mu = 1e-6
X_dagger = np.dot(np.linalg.inv(np.dot(X.T, X) + mu*np.eye(3)), X.T)
beta2 = np.dot(X_dagger, y)
print "Unconstrained solution + regularization: " + str(beta2)
print "Error: ", la.norm(X.dot(beta2) - y)
print "Sum of coeffs: ", sum(beta2)
print

# constrained ------------------------------------------------------------
mu = 1e-6

## min_x ||Xbeta - y||_2^2 s.t. 1^T x = 1
e = np.ones(3).reshape(1,3)
K = np.block([[2.0*X.T.dot(X), e.T], [e, 0.0]])
rhs = np.block([2.0*X.T.dot(y), 1.0])
beta3 = la.inv(K).dot(rhs)[0:3]
print "Constrained solution: " + str(beta3)
print "Error: ", la.norm(X.dot(beta3) - y)
print "Sum of coeffs: ", sum(beta3)
print

## min_x ||(A + muI)x - P||_2^2 s.t. 1^T x = 1
e = np.ones(3).reshape(1,3)
K = np.block([[2.0*(X.T.dot(X) + mu*np.eye(3)), e.T], [e, 0.0]])
rhs = np.block([2.0*X.T.dot(y), 1.0])
beta4 = la.inv(K).dot(rhs)[0:3]
print "Constrained solution + regularization: " + str(beta4)
print "Error: ", la.norm(X.dot(beta4) - y)
print "Sum of coeffs: ", sum(beta4)
print

# predict and plot ------------------------------------------------------
# predict
yhat1 = np.zeros(N)
for i in range(N): yhat1[i] = model(x[i], beta1)
yhat2 = np.zeros(N)
for i in range(N): yhat2[i] = model(x[i], beta2)
yhat3 = np.zeros(N)
for i in range(N): yhat3[i] = model(x[i], beta3)
yhat4 = np.zeros(N)
for i in range(N): yhat4[i] = model(x[i], beta4)


# plot
plt.figure(figsize=(17, 5))
plt.plot(y, label="y")
plt.plot(yhat1, label="fit1: unconstr {:0.3e}".format(la.norm(yhat1 - y)))
plt.plot(yhat2, label="fit2: unconstr + reg {:0.3e}".format(la.norm(yhat2 - y)))
plt.plot(yhat3, label="fit3: constr {:0.3e}".format(la.norm(yhat3 - y)))
plt.plot(yhat4, label="fit4: constr + reg {:0.3e}".format(la.norm(yhat4 - y)))
plt.legend()
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...