Advertisement
Guest User

msid1

a guest
Mar 24th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1.  
  2. import numpy as np
  3. from utils import polynomial
  4.  
  5.  
  6. def mean_squared_error(x, y, w):
  7. '''
  8. :param x: ciag wejsciowy Nx1
  9. :param y: ciag wyjsciowy Nx1
  10. :param w: parametry modelu (M+1)x1
  11. :return: blad sredniokwadratowy pomiedzy wyjsciami y
  12. oraz wyjsciami uzyskanymi z wielowamiu o parametrach w dla wejsc x
  13. '''
  14. y_pred = polynomial(x, w)
  15. N = x.shape[0]
  16. return np.sum((y-y_pred)**2)/N
  17. pass
  18.  
  19.  
  20. def design_matrix(x_train, M):
  21. '''
  22. :param x_train: ciag treningowy Nx1
  23. :param M: stopien wielomianu 0,1,2,...
  24. :return: funkcja wylicza Design Matrix Nx(M+1) dla wielomianu rzedu M
  25. '''
  26. N = x_train.shape[0]
  27. my_matrix = np.zeros((N, M+1))
  28. for i in range(x_train.shape[0]):
  29. for j in range(M+1):
  30. my_matrix[i][j] = (x_train[i]**j)
  31. return my_matrix
  32. pass
  33.  
  34. def least_squares(x_train, y_train, M):
  35. '''
  36. :param x_train: ciag treningowy wejscia Nx1
  37. :param y_train: ciag treningowy wyjscia Nx1
  38. :param M: rzad wielomianu
  39. :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu, a err blad sredniokwadratowy
  40. dopasowania
  41. '''
  42. my_matrix = design_matrix(x_train,M)
  43. w = np.linalg.inv((my_matrix.transpose())@my_matrix)@(my_matrix.transpose())@y_train
  44. err = mean_squared_error(x_train,y_train,w)
  45. return w, err
  46. pass
  47.  
  48.  
  49.  
  50. def regularized_least_squares(x_train, y_train, M, regularization_lambda):
  51. '''
  52. :param x_train: ciag treningowy wejscia Nx1
  53. :param y_train: ciag treningowy wyjscia Nx1
  54. :param M: rzad wielomianu
  55. :param regularization_lambda: parametr regularyzacji
  56. :return: funkcja zwraca krotke (w,err), gdzie w sa parametrami dopasowanego wielomianu zgodnie z kryterium z regularyzacja l2,
  57. a err blad sredniokwadratowy dopasowania
  58. '''
  59. my_matrix = design_matrix(x_train,M)
  60. unit_matrix = np.eye(M+1)
  61. lambda_matrix = unit_matrix * regularization_lambda
  62. w = np.linalg.inv(((my_matrix.transpose())@ my_matrix) + lambda_matrix)@(my_matrix.transpose())@y_train
  63. err = mean_squared_error(x_train, y_train, w)
  64. return w, err
  65. pass
  66.  
  67.  
  68. def model_selection(x_train, y_train, x_val, y_val, M_values):
  69. '''
  70. :param x_train: ciag treningowy wejscia Nx1
  71. :param y_train: ciag treningowy wyjscia Nx1
  72. :param x_val: ciag walidacyjny wejscia Nx1
  73. :param y_val: ciag walidacyjny wyjscia Nx1
  74. :param M_values: tablica stopni wielomianu, ktore maja byc sprawdzone
  75. :return: funkcja zwraca krotke (w,train_err,val_err), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  76. tj. daje najmniejszy blad na ciagu walidacyjnym, train_err i val_err to bledy na sredniokwadratowe na ciagach treningowym
  77. i walidacyjnym
  78. '''
  79. w_err_train = least_squares(x_train,y_train,0)
  80. val_err = mean_squared_error(x_val,y_val,w_err_train[0])
  81. for i in M_values:
  82. w_i_train = least_squares(x_train,y_train,i)
  83. w_i_val = mean_squared_error(x_val,y_val,w_i_train[0])
  84. if w_i_val < val_err:
  85. w_err_train = w_i_train
  86. val_err = w_i_val
  87.  
  88. w = w_err_train[0]
  89. train_err = w_err_train[1]
  90. return w, train_err, val_err
  91. pass
  92.  
  93.  
  94. def regularized_model_selection(x_train, y_train, x_val, y_val, M, lambda_values):
  95. '''
  96. :param x_train: ciag treningowy wejscia Nx1
  97. :param y_train: ciag treningowy wyjscia Nx1
  98. :param x_val: ciag walidacyjny wejscia Nx1
  99. :param y_val: ciag walidacyjny wyjscia Nx1
  100. :param M: stopien wielomianu
  101. :param lambda_values: lista ze wartosciami roznych parametrow regularyzacji
  102. :return: funkcja zwraca krotke (w,train_err,val_err,regularization_lambda), gdzie w sa parametrami modelu, ktory najlepiej generalizuje dane,
  103. tj. daje najmniejszy blad na ciagu walidacyjnym. Wielomian dopasowany jest wg kryterium z regularyzacja. train_err i val_err to
  104. bledy na sredniokwadratowe na ciagach treningowym i walidacyjnym. regularization_lambda to najlepsza wartosc parametru regularyzacji
  105. '''
  106. w_err_train = regularized_least_squares(x_train, y_train, M,0)
  107. val_err = mean_squared_error(x_val, y_val, w_err_train[0])
  108. regularization_lambda = 0
  109. for i in lambda_values:
  110. w_i_train = regularized_least_squares(x_train,y_train,M,i)
  111. val_i = mean_squared_error(x_val,y_val,w_i_train[0])
  112. if val_i < val_err:
  113. w_err_train = w_i_train
  114. val_err = val_i
  115. regularization_lambda = i
  116. w = w_err_train[0]
  117. train_err = w_err_train[1]
  118. return w, train_err, val_err, regularization_lambda
  119. pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement