Я построил линейный регрессионный классификатор.
import numpy as np
np.seterr(all='ignore');
def normalize(X):
X = np.array(X)
mean = X.mean(axis=0)
std = X.std(axis=0)
return (np.nan_to_num(np.divide(np.subtract(X, mean), std)), mean, std)
class LinearModel():
def fit(self, X=[[]], y=[], alpha=0, lambda_=0, tol=0):
try:
X = np.array(X)
X, self.mean, self.std = normalize(X)
m = X.shape[0]
X = np.concatenate([np.ones((m, 1)), X], axis=1)
n = X.shape[1]
theta = np.zeros((n, 1))
J_hist = np.array([-1, 0])
y = np.array(y).reshape(-1, 1)
except ValueError:
self.theta = theta
return theta, J_hist[2:]
while not np.isclose(J_hist[-1], J_hist[-2], rtol=tol):
pred = np.matmul(X, theta)
J = 1/(2*m) * np.sum((pred - y) ** 2) + lambda_/(2*m) * np.sum(theta ** 2)
grad = 1/m * np.matmul(X.T, pred - y)
grad[2:] += lambda_/m * theta[2:]
theta -= alpha * grad
J_hist = np.append(J_hist, J)
self.J_hist_ = J_hist[2:]
self.theta_ = theta
return self
def predict(self, X=[[]]):
X = np.array(X)
X = np.nan_to_num((X - self.mean) / self.std)
m = X.shape[0]
return np.matmul(np.concatenate([np.ones((m, 1)), X], axis=1), self.theta_)
в питоне.В модели я попытался построить функцию стоимости
(1/(2*#of_training_examples)*sum((prediction - target)^2))
на наборе проверки для различных параметров лямбда регуляризации.Сюжет о стоимости выглядел так:
![(y axis cost, x axis lambda)](https://i.stack.imgur.com/IxEkm.png)
Почему он ведет себя так странно и прыгает повсюду?Есть ли ошибка в коде?или это какое-то логическое / математическое свойство функции стоимости?Кстати, я попробовал это для другого набора, и функция стоимости вела себя так же ...