Basis Expansions & Regularization
Last updated
Last updated
class spline:
def __init__(self, x, y):
x = np.array([[1]*x.shape[0], x, np.power(x,2), np.power(x,3)])
b1 = min(x[1]) + (max(x[1])-min(x[1]))/3
b2 = min(x[1]) + 2*(max(x[1])-min(x[1]))/3
x1 = np.append(x, [np.power(x[1],3), np.power(x[1],3)], axis=0)
x1 = np.transpose(x1)[x[1]<b1]
x2 = np.append(x, [np.power(x[1],3)], axis=0)
x2 = np.transpose(x2)[(b1<=x[1])&(x[1]<b2)]
self.x = np.transpose(x)
self.y = y
self.x1 = x1
self.x2 = x2
def training(self):
x = self.x # col vec expression
y = self.y
x1 = self.x1
x2 = self.x2
xt = np.transpose(x)
beta = np.linalg.inv(xt@x)@xt@y
# 잔차에다가 또 피팅해주는 방식이에요. y값만 바뀌는 거겠죠
y_fit = y-(x@beta)
x1t = np.transpose(x1)
beta1= np.linalg.inv(x1t@x1 + np.diag([0.01]*x1.shape[1]))@x1t@y_fit
x2t = np.transpose(x2)
beta2 = (1/(x2t@x2))*(x2t@y_fit)
return(np.array([beta1,beta2]))
def prediction(self, X_test):
X_test = np.insert(X_test,0,1,axis=1)
y_pred = (X_test@self.beta > 0).astype('uint8')
return(y_pred)