Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.43 KB | None | 0 0
  1. # --------------------------------------------------------------------------
  2. # ------------  Metody Systemowe i Decyzyjne w Informatyce  ----------------
  3. # --------------------------------------------------------------------------
  4. #  Zadanie 3: Regresja logistyczna
  5. #  autorzy: A. Gonczarek, J. Kaczmar, S. Zareba
  6. #  2017
  7. # --------------------------------------------------------------------------
  8.  
  9. import numpy as np
  10. from scipy.special import expit
  11.  
  12. # def sigmoid(x):
  13. #     '''
  14. #     :param x: wektor wejsciowych wartosci Nx1
  15. #     :return: wektor wyjściowych wartości funkcji sigmoidalnej dla wejścia x, Nx1
  16. #     '''
  17. #     return expit(x)
  18. sigmoid = expit
  19.  
  20.  
  21. def logistic_cost_function(w, x_train, y_train):
  22.     '''
  23.    :param w: parametry modelu Mx1
  24.    :param x_train: ciag treningowy - wejscia NxM
  25.    :param y_train: ciag treningowy - wyjscia Nx1
  26.    :return: funkcja zwraca krotke (val, grad), gdzie val oznacza wartosc funkcji logistycznej, a grad jej gradient po w
  27.    '''
  28.     # prod = np.abs(sigma + y_train - 1)
  29.     # prod = (sigma ** y_train) * ((1 - sigma) ** (1 - y_train))
  30.     # np.abs(sigma + y_train - 1) === (sigma ** y_train) * ((1 - sigma) ** (1 - y_train))
  31.     sigma = sigmoid(x_train @ w)
  32.     cost = -np.log(np.prod(np.abs(sigma + y_train - 1)))
  33.     return cost / y_train.shape[0], - (x_train.transpose() @ (y_train - sigma)) / y_train.shape[0]
  34.  
  35.  
  36. def gradient_descent(obj_fun, w0, epochs, eta):
  37.     '''
  38.    :param obj_fun: funkcja celu, ktora ma byc optymalizowana. Wywolanie val,grad = obj_fun(w).
  39.    :param w0: punkt startowy Mx1
  40.    :param epochs: liczba epok / iteracji algorytmu
  41.    :param eta: krok uczenia
  42.    :return: funkcja wykonuje optymalizacje metoda gradientu prostego dla funkcji obj_fun. Zwraca krotke (w,func_values),
  43.    gdzie w oznacza znaleziony optymalny punkt w, a func_values jest wektorem wartosci funkcji [epochs x 1] we wszystkich krokach algorytmu
  44.    '''
  45.     w = w0
  46.     wA = []
  47.     _, grad = obj_fun(w0)
  48.     for i in range(epochs):
  49.         w = w - eta * grad
  50.         val, grad = obj_fun(w)
  51.         wA.append(val)
  52.     return w, np.array(wA).reshape(epochs, 1)
  53.  
  54.  
  55. def stochastic_gradient_descent(obj_fun, x_train, y_train, w0, epochs, eta, mini_batch):
  56.     '''
  57.    :param obj_fun: funkcja celu, ktora ma byc optymalizowana. Wywolanie val,grad = obj_fun(w,x,y), gdzie x,y oznaczaja podane
  58.    podzbiory zbioru treningowego (mini-batche)
  59.    :param x_train: dane treningowe wejsciowe NxM
  60.    :param y_train: dane treningowe wyjsciowe Nx1
  61.    :param w0: punkt startowy Mx1
  62.    :param epochs: liczba epok
  63.    :param eta: krok uczenia
  64.    :param mini_batch: wielkosc mini-batcha
  65.    :return: funkcja wykonuje optymalizacje metoda stochastycznego gradientu prostego dla funkcji obj_fun. Zwraca krotke (w,func_values),
  66.    gdzie w oznacza znaleziony optymalny punkt w, a func_values jest wektorem wartosci funkcji [epochs x 1] we wszystkich krokach algorytmu. Wartosci
  67.    funkcji do func_values sa wyliczane dla calego zbioru treningowego!
  68.    '''
  69.     M = int(y_train.shape[0] / mini_batch)
  70.     x_mini_batch = np.vsplit(x_train, M)
  71.     y_mini_batch = np.vsplit(y_train, M)
  72.  
  73.     w = w0
  74.     wA = []
  75.     for i in range(epochs):
  76.         for x, y in zip(x_mini_batch, y_mini_batch):
  77.             grad = obj_fun(w, x, y)[1]
  78.             w = w - eta * grad
  79.         wA.append(obj_fun(w, x_train, y_train)[0])
  80.     return w, np.array(wA).reshape(epochs, 1)
  81.  
  82.  
  83. def regularized_logistic_cost_function(w, x_train, y_train, regularization_lambda):
  84.     '''
  85.    :param w: parametry modelu Mx1
  86.    :param x_train: ciag treningowy - wejscia NxM
  87.    :param y_train: ciag treningowy - wyjscia Nx1
  88.    :param regularization_lambda: parametr regularyzacji
  89.    :return: funkcja zwraca krotke (val, grad), gdzie val oznacza wartosc funkcji logistycznej z regularyzacja l2,
  90.    a grad jej gradient po w
  91.    '''
  92.     val, grad = logistic_cost_function(w, x_train, y_train)
  93.     w_0 = np.array(w, copy=True)
  94.     w_0[0] = 0
  95.     return val + regularization_lambda / 2 * np.linalg.norm(w_0) ** 2, grad + regularization_lambda * w_0
  96.  
  97.  
  98. def prediction(x, w, theta):
  99.     '''
  100.    :param x: macierz obserwacji NxM
  101.    :param w: wektor parametrow modelu Mx1
  102.    :param theta: prog klasyfikacji z przedzialu [0,1]
  103.    :return: funkcja wylicza wektor y o wymiarach Nx1. Wektor zawiera wartosci etykiet ze zbioru {0,1} dla obserwacji z x
  104.     bazujac na modelu z parametrami w oraz progu klasyfikacji theta
  105.    '''
  106.     return np.vectorize(lambda s: s >= theta)(sigmoid(x @ w))
  107.  
  108.  
  109. def f_measure(y_true, y_pred):
  110.     '''
  111.    :param y_true: wektor rzeczywistych etykiet Nx1
  112.    :param y_pred: wektor etykiet przewidzianych przed model Nx1
  113.    :return: funkcja wylicza wartosc miary F
  114.    '''
  115.     TP = np.sum(y_true & y_pred)
  116.     FP_plus_FN = np.sum(y_true ^ y_pred) / 2
  117.     return TP / (TP + FP_plus_FN)
  118.  
  119.  
  120. def model_selection(x_train, y_train, x_val, y_val, w0, epochs, eta, mini_batch, lambdas, thetas):
  121.     '''
  122.    :param x_train: ciag treningowy wejsciowy NxM
  123.    :param y_train: ciag treningowy wyjsciowy Nx1
  124.    :param x_val: ciag walidacyjny wejsciowy Nval x M
  125.    :param y_val: ciag walidacyjny wyjsciowy Nval x 1
  126.    :param w0: wektor poczatkowych wartosci parametrow
  127.    :param epochs: liczba epok dla SGD
  128.    :param eta: krok uczenia
  129.    :param mini_batch: wielkosc mini batcha
  130.    :param lambdas: lista wartosci parametru regularyzacji lambda, ktore maja byc sprawdzone
  131.    :param thetas: lista wartosci progow klasyfikacji theta, ktore maja byc sprawdzone
  132.    :return: funckja wykonuje selekcje modelu. Zwraca krotke (regularization_lambda, theta, w, F), gdzie regularization_lambda
  133.    to najlpszy parametr regularyzacji, theta to najlepszy prog klasyfikacji, a w to najlepszy wektor parametrow modelu.
  134.    Dodatkowo funkcja zwraca macierz F, ktora zawiera wartosci miary F dla wszystkich par (lambda, theta). Do uczenia nalezy
  135.    korzystac z algorytmu SGD oraz kryterium uczenia z regularyzacja l2.
  136.    '''
  137.     F = np.zeros(shape=(len(lambdas), len(thetas)))
  138.     max_f = [0, 0, 0, -1]
  139.     for i, λ in enumerate(lambdas):
  140.         obj_fun = lambda w, x, y: regularized_logistic_cost_function(w, x, y, λ)
  141.         w, func_values = stochastic_gradient_descent(obj_fun, x_train, y_train, w0, epochs, eta, mini_batch)
  142.         for j, θ in enumerate(thetas):
  143.             f = f_measure(y_val, prediction(x_val, w, θ))
  144.             F[i, j] = f
  145.             if f > max_f[3]: max_f = [λ, θ, w, f]
  146.     max_f[3] = F
  147.     return tuple(max_f)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement