human
1. Линейная регрессия
Задача 1. По шаблону напишите класс, реализующий линейную регрессию. Интерфейс этого класса в некоторой степени соответствует классу <a href="http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression">LinearRegression</a> из библиотеки sklearn.
assistant
#Here is the Python code you requested.
from scipy.linalg import inv
from numpy.linalg import norm

class LinearRegression:
    def __init__(self):
        super()
        
    def fit(self, X, Y, alpha=0.95):
        ''' Обучение модели. Предполагается модель Y = X * theta + epsilon, 
            где X --- регрессор, Y --- отклик,
            а epsilon имеет нормальное распределение с параметрами (0, sigma^2 * I_n).
            alpha --- уровень доверия для доверительного интервала.
        '''
        
        # Размер выборки и число признаков
        self.n, self.k = X.shape
        
        # Оценки на параметры
        self.theta = inv(X.T @ X) @ X.T @ Y 
        self.sigma_sq = norm(Y - X @ self.theta) ** 2 / (self.n - self.k)
        
        
        # Считаем доверительные интервалы
        l_quant = sps.t.ppf((1 - alpha) / 2, df=self.n - self.k)
        r_quant = sps.t.ppf((1 + alpha) / 2, df=self.n - self.k)
        diag = inv(X.T @ X).diagonal()
        coeff = np.sqrt(self.sigma_sq * diag)
        self.conf_int = np.array([self.theta + l_quant * coeff, self.theta + r_quant * coeff]).T
        
        return self
    
    def summary(self):
        print('Linear regression on %d features and %d examples' % (self.k, self.n))
        print('Sigma: %.6f' % self.sigma_sq)
        print('\t\tLower\t\tEstimation\tUpper')
        for j in range(self.k):
            print('theta_%d:\t%.6f\t%.6f\t%.6f' % (j, self.conf_int[j, 0], 
                                                   self.theta[j], self.conf_int[j, 1]))
        
    def predict(self, X):
        ''' Возвращает предсказание отклика на новых объектах X. '''
        
        Y_pred = X @ self.theta
        return Y_pred