Facebook
From Emerald Lizard, 8 Months ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 151
  1. # --------------------------------------------------------------------------
  2. # ------------  Metody Systemowe i Decyzyjne w Informatyce  ----------------
  3. # --------------------------------------------------------------------------
  4. #  Zadanie 1: Regresja liniowa
  5. #  autorzy: A. Gonczarek, J. Kaczmar, S. Zareba
  6. #  2017
  7. # --------------------------------------------------------------------------
  8.  
  9. import numpy as np
  10. from utils import polynomial
  11.  
  12. def mean_squared_error(x, y, w):
  13.     '''
  14.     :param x: ciag wejsciowy Nx1
  15.     :param y: ciag wyjsciowy Nx1
  16.     :param w: parametry modelu (M+1)x1
  17.     :return: blad sredniokwadratowy pomiedzy wyjsciami y
  18.     oraz wyjsciami uzyskanymi z wielowamiu o parametrach w dla wejsc x
  19.     '''
  20.     return (sum(pow(y - polynomial(x, w), 2))/y.shape[0])[0]
  21.  
  22.  
  23.  
  24. def design_matrix(x_train, M):
  25.     '''
  26.     :param x_train: ciag treningowy Nx1
  27.     :param M: stopien wielomianu 0,1,2,...
  28.     :return: funkcja wylicza Design Matrix Nx(M+1) dla wielomianu rzedu M
  29.     matrix = np.ones(shape=(x_train.shape[0], M+1))
  30.     for col in range(M + 1):
  31.         for row in range(matrix.shape[0]):
  32.             matrix[row][col] = pow(x_train[row][0], col)
  33.     '''
  34.     return np.array([[pow(x_train[row][0], col) for col in range(M+1)] for row in range(x_train.shape[0])])
  35.  
  36.  
  37.  
  38.  
  39. def least_squares(x_train, y_train, M):
  40.     '''
  41.     :param x_train: ciag treningowy wejscia Nx1
  42.     :param y_train: ciag treningowy wyjscia Nx1
  43.     :param M: rzad wielomianu
  44.     :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu, a err blad sredniokwadratowy
  45.     dopasowania
  46.     '''
  47.     #pass
  48.     matrix = design_matrix(x_train, M)
  49.     w = np.linalg.inv(matrix.transpose()@matrix)@matrix.transpose()@y_train
  50.     return w, mean_squared_error(x_train, y_train, w)
  51.  
  52.  
  53. def regularized_least_squares(x_train, y_train, M, regularization_lambda):
  54.     '''
  55.     :param x_train: ciag treningowy wejscia Nx1
  56.     :param y_train: ciag treningowy wyjscia Nx1
  57.     :param M: rzad wielomianu
  58.     :param regularization_lambda: parametr regularyzacji
  59.     :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu zgodnie z kryterium z regularyzacja l2,
  60.     a err blad sredniokwadratowy dopasowania
  61.     '''
  62.     #pass
  63.  
  64.     matrix = design_matrix(x_train, M)
  65.     w = np.linalg.inv(matrix.transpose()@matrix+regularization_lambda*np.identity(matrix.shape[1]))@matrix.transpose()@y_train
  66.     return w, mean_squared_error(x_train, y_train, w)
  67.  
  68.  
  69. def model_selection(x_train, y_train, x_val, y_val, M_values):
  70.     '''
  71.     :param x_train: ciag treningowy wejscia Nx1
  72.     :param y_train: ciag treningowy wyjscia Nx1
  73.     :param x_val: ciag walidacyjny wejscia Nx1
  74.     :param y_val: ciag walidacyjny wyjscia Nx1
  75.     :param M_values: tablica stopni wielomianu, ktore maja byc sprawdzone
  76.     :return: funkcja zwraca krotke (w,train_err,val_err), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  77.     tj. daje najmniejszy blad na ciagu walidacyjnym, train_err i val_err to bledy na sredniokwadratowe na ciagach treningowym
  78.     i walidacyjnym
  79.     '''
  80.  
  81.     w, train_err = least_squares(x_train, y_train, 0)
  82.     val_err = mean_squared_error(x_val, y_val, w)
  83.  
  84.     for m in M_values:
  85.         w_temp, train_err_temp = least_squares(x_train, y_train, m)
  86.         if mean_squared_error(x_val, y_val, w_temp) < val_err:
  87.             w, train_err, val_err = w_temp, train_err_temp, mean_squared_error(x_val, y_val, w_temp)
  88.     return w, train_err, val_err
  89.  
  90.  
  91. def regularized_model_selection(x_train, y_train, x_val, y_val, M, lambda_values):
  92.     '''
  93.     :param x_train: ciag treningowy wejscia Nx1
  94.     :param y_train: ciag treningowy wyjscia Nx1
  95.     :param x_val: ciag walidacyjny wejscia Nx1
  96.     :param y_val: ciag walidacyjny wyjscia Nx1
  97.     :param M: stopien wielomianu
  98.     :param lambda_values: lista ze wartosciami roznych parametrow regularyzacji
  99.     :return: funkcja zwraca krotke (w,train_err,val_err,regularization_lambda), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  100.     tj. daje najmniejszy blad na ciagu walidacyjnym. Wielomian dopasowany jest wg kryterium z regularyzacja. train_err i val_err to
  101.     bledy na sredniokwadratowe na ciagach treningowym i walidacyjnym. regularization_lambda to najlepsza wartosc parametru regularyzacji
  102.     '''
  103.  
  104.     w, train_err = regularized_least_squares(x_train, y_train, M, lambda_values[0])
  105.     val_err, lmbd = mean_squared_error(x_val, y_val, w), lambda_values[0]
  106.  
  107.     for rlambda in lambda_values:
  108.         w_temp, train_err_temp = regularized_least_squares(x_train, y_train, M, rlambda)
  109.         if mean_squared_error(x_val, y_val, w_temp) < val_err:
  110.             w, train_err, val_err, lmbd = w_temp, train_err_temp, mean_squared_error(x_val, y_val, w_temp), rlambda
  111.  
  112.     return w, train_err, val_err, lmbd