Facebook
From Anorexic Prairie Dog, 6 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 202
  1. # --------------------------------------------------------------------------
  2. # -----------------------  Rozpoznawanie Obrazow  --------------------------
  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.  
  21.     return np.sum((y - polynomial(x, w))**2)/x.shape[0]
  22.  
  23. def design_matrix(x_train,M):
  24.     '''
  25.    :param x_train: ciag treningowy Nx1
  26.    :param M: stopien wielomianu 0,1,2,...
  27.    :return: funkcja wylicza Design Matrix Nx(M+1) dla wielomianu rzedu M
  28.    '''
  29.     return [np.concatenate([x_train[i] ** j for j in range(M+1)]) for i in range(x_train.shape[0])]
  30.  
  31.  
  32. def least_squares(x_train, y_train, M):
  33.     '''
  34.    :param x_train: ciag treningowy wejscia Nx1
  35.    :param y_train: ciag treningowy wyjscia Nx1
  36.    :param M: rzad wielomianu
  37.    :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu, a err blad sredniokwadratowy
  38.    dopasowania
  39.    '''
  40.     dm = np.array(design_matrix(x_train, M))
  41.     w = np.linalg.inv(dm.transpose() @ dm) @ (dm.transpose() @ y_train)
  42.  
  43.     return (w, mean_squared_error(x_train, y_train, w))
  44.  
  45.  
  46. def regularized_least_squares(x_train, y_train, M, regularization_lambda):
  47.     '''/media/Programowanie/Zrodla/Python/Lab2
  48.    :param x_train: ciag treningowy wejscia Nx1
  49.    :param y_train: ciag treningowy wyjscia Nx1
  50.    :param M: rzad wielomianu
  51.    :param regularization_lambda: parametr regularyzacji
  52.    :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu zgodnie z kryterium z regularyzacja l2,
  53.    a err blad sredniokwadratowy dopasowania
  54.    '''
  55.     dm = np.array(design_matrix(x_train, M))
  56.     w = np.linalg.inv(dm.transpose() @ dm + regularization_lambda * np.eye(M+1)) @ (dm.transpose() @ y_train)
  57.  
  58.     return (w, mean_squared_error(x_train, y_train, w))
  59.  
  60.  
  61. def model_selection(x_train, y_train, x_val, y_val, M_values):
  62.     '''
  63.    :param x_train: ciag treningowy wejscia Nx1
  64.    :param y_train: ciag treningowy wyjscia Nx1
  65.    :param x_val: ciag walidacyjny wejscia Nx1
  66.    :param y_val: ciag walidacyjny wyjscia Nx1
  67.    :param M_values: tablica stopni wielomianu, ktore maja byc sprawdzone
  68.    :return: funkcja zwraca krotke (w,train_err,val_err), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  69.    tj. daje najmniejszy blad na ciagu walidacyjnym, train_err i val_err to bledy na sredniokwadratowe na ciagach treningowym
  70.    i walidacyjnym
  71.    '''
  72.     tuple_list = []
  73.     min_index = 0
  74.  
  75.     for i in range(len(M_values)):
  76.         pair = least_squares(x_train, y_train, M_values[i])
  77.         ver_MSE = mean_squared_error(x_val, y_val, pair[0])
  78.         tuple_list.append((pair[0], pair[1], ver_MSE))
  79.  
  80.         if (tuple_list[min_index][2] > ver_MSE):
  81.             min_index = i
  82.  
  83.     return tuple_list[min_index]
  84.  
  85.  
  86. def regularized_model_selection(x_train, y_train, x_val, y_val, M, lambda_values):
  87.     '''
  88.    :param x_train: ciag treningowy wejscia Nx1
  89.    :param y_train: ciag treningowy wyjscia Nx1
  90.    :param x_val: ciag walidacyjny wejscia Nx1
  91.    :param y_val: ciag walidacyjny wyjscia Nx1
  92.    :param M: stopien wielomianu
  93.    :param lambda_values: lista ze wartosciami roznych parametrow regularyzacji
  94.    :return: funkcja zwraca krotke (w,train_err,val_err,regularization_lambda), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  95.    tj. daje najmniejszy blad na ciagu walidacyjnym. Wielomian dopasowany jest wg kryterium z regularyzacja. train_err i val_err to
  96.    bledy na sredniokwadratowe na ciagach treningowym i walidacyjnym. regularization_lambda to najlepsza wartosc parametru regularyzacji
  97.    '''
  98.     tuple_list = []
  99.     min_index = 0
  100.  
  101.     for i in range(len(lambda_values)):
  102.         pair = regularized_least_squares(x_train, y_train, M, lambda_values[i])
  103.         ver_MSE = mean_squared_error(x_val, y_val, pair[0])
  104.         tuple_list.append((pair[0], pair[1], ver_MSE, lambda_values[i]))
  105.  
  106.         if (tuple_list[min_index][2] > ver_MSE):
  107.             min_index = i
  108.  
  109.     return tuple_list[min_index]