Advertisement
Guest User

Untitled

a guest
May 20th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.48 KB | None | 0 0
  1. def p_y_x_knn(y, k):
  2. """
  3. Funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla
  4. kazdej z klas dla obiektow ze zbioru testowego wykorzystujac
  5. klasfikator KNN wyuczony na danych trenningowych
  6. :param y: macierz posortowanych etykiet dla danych treningowych N1xN2
  7. :param k: liczba najblizszuch sasiadow dla KNN
  8. :return: macierz prawdopodobienstw dla obiektow z X
  9. """
  10. points_number = 4
  11. result_matrix = []
  12. for i in range(np.shape(y)[0]):
  13. helper = []
  14. for j in range(k):
  15. helper.append(y[i][j])
  16. line = np.bincount(helper, None, points_number)
  17. result_matrix.append([line[0] / k, line[1] / k, line[2] / k, line[3] / k])
  18. return result_matrix
  19.  
  20.  
  21. def classification_error(p_y_x, y_true):
  22. """
  23. Wyznacz blad klasyfikacji.
  24. :param p_y_x: macierz przewidywanych prawdopodobienstw
  25. :param y_true: zbior rzeczywistych etykiet klas 1xN.
  26. Kazdy wiersz macierzy reprezentuje rozklad p(y|x)
  27. :return: blad klasyfikacji
  28. """
  29.  
  30. points_number = 4
  31. errors_number = 0
  32. n_val = np.shape(y_true)[0]
  33. for i in range(0, n_val):
  34. reverse = (p_y_x[i])[::-1]
  35. index = points_number - np.argmax(reverse) - 1
  36. if index != y_true[i]:
  37. errors_number += 1
  38. return errors_number / n_val
  39.  
  40.  
  41. def model_selection_knn(Xval, Xtrain, yval, ytrain, k_values):
  42. """
  43. :param Xval: zbior danych walidacyjnych N1xD
  44. :param Xtrain: zbior danych treningowych N2xD
  45. :param yval: etykiety klas dla danych walidacyjnych 1xN1
  46. :param ytrain: etykiety klas dla danych treningowych 1xN2
  47. :param k_values: wartosci parametru k, ktore maja zostac sprawdzone
  48. :return: funkcja wykonuje selekcje modelu knn i zwraca krotke (best_error,best_k,errors), gdzie best_error to najnizszy
  49. osiagniety blad, best_k - k dla ktorego blad byl najnizszy, errors - lista wartosci bledow dla kolejnych k z k_values
  50. """
  51.  
  52. errors = np.zeros(len(k_values))
  53. distancesSorted = sort_train_labels_knn(hamming_distance(Xval, Xtrain), ytrain)
  54. for i in range(len(errors)):
  55. errors[i] = classification_error(p_y_x_knn(distancesSorted, k_values[i]), yval)
  56. best_index = 0
  57. for i in range(len(k_values)):
  58. if errors[i] < errors[best_index]:
  59. best_index = i
  60. return min(errors), k_values[best_index], errors
  61.  
  62.  
  63. def estimate_a_priori_nb(ytrain):
  64. """
  65. :param ytrain: etykiety dla dla danych treningowych 1xN
  66. :return: funkcja wyznacza rozklad a priori p(y) i zwraca p_y - wektor prawdopodobienstw a priori 1xM
  67. """
  68. vector = np.bincount(ytrain)
  69. vector = vector / (np.shape(ytrain)[0])
  70. return vector
  71.  
  72.  
  73. def estimate_p_x_y_nb(Xtrain, ytrain, a, b):
  74. """
  75. n = 50, d = 20 k = 4
  76. :param Xtrain: dane treningowe NxD
  77. :param ytrain: etykiety klas dla danych treningowych 1xN
  78. :param a: parametr a rozkladu Beta
  79. :param b: parametr b rozkladu Beta
  80. :return: funkcja wyznacza rozklad prawdopodobienstwa p(x|y) zakladajac, ze x przyjmuje wartosci binarne i ze elementy
  81. x sa niezalezne od siebie. Funkcja zwraca macierz p_x_y o wymiarach MxD.
  82. """
  83. points_number = 4
  84. result_matrix = []
  85. vector = np.bincount(ytrain)
  86. denominator = (vector + a + b - 2)
  87.  
  88. def numerator(Xtrain, ytrain, d):
  89. Xtrain = Xtrain.toarray()
  90. occurences = [0, 0, 0, 0]
  91. for i in range(np.shape(ytrain)[0]):
  92. if Xtrain[i][d] == 1:
  93. occurences[ytrain[i]] += 1
  94. occurences_add = [(x + (a - 1)) for x in occurences]
  95. return np.squeeze(occurences_add)
  96.  
  97. for k in range(points_number):
  98. line = []
  99. for d in range(np.shape(Xtrain)[1]):
  100. line.append((numerator(Xtrain, ytrain, d)[k]) / denominator[k])
  101. result_matrix.append(line)
  102.  
  103. return np.array(result_matrix)
  104.  
  105.  
  106. def p_y_x_nb(p_y, p_x_1_y, X):
  107. """
  108. N = 40, M = 4, D = 20
  109. return 40 x 4
  110. :param p_y: wektor prawdopodobienstw a priori o wymiarach 1xM
  111. :param p_x_1_y: rozklad prawdopodobienstw p(x=1|y) - macierz MxD
  112. :param X: dane dla ktorych beda wyznaczone prawdopodobienstwa, macierz NxD
  113. :return: funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla kazdej z klas z wykorzystaniem klasyfikatora Naiwnego
  114. Bayesa. Funkcja zwraca macierz p_y_x o wymiarach NxM.
  115. """
  116.  
  117. X = X.toarray()
  118.  
  119. def helper(line):
  120. result = X * line
  121. result += np.logical_not(X) - np.logical_not(X) * line
  122. result = np.apply_along_axis(np.prod, arr=result, axis=1)
  123. return result
  124.  
  125. def helper2(line, x):
  126. result = np.multiply(line, x)
  127. return result
  128.  
  129. def helper3(line):
  130. result = 1 / np.sum(line)
  131. return np.multiply(line, result)
  132.  
  133. result_matrix = np.apply_along_axis(helper, axis=0, arr=np.transpose(p_x_1_y))
  134. result_matrix = np.apply_along_axis(helper2, axis=1, arr=result_matrix, x=p_y)
  135. result_matrix = np.apply_along_axis(helper3, axis=1, arr=result_matrix)
  136.  
  137. return result_matrix
  138.  
  139.  
  140. def model_selection_nb(Xtrain, Xval, ytrain, yval, a_values, b_values):
  141. """
  142. :param Xtrain: zbior danych treningowych N2xD
  143. :param Xval: zbior danych walidacyjnych N1xD
  144. :param ytrain: etykiety klas dla danych treningowych 1xN2
  145. :param yval: etykiety klas dla danych walidacyjnych 1xN1
  146. :param a_values: lista parametrow a do sprawdzenia
  147. :param b_values: lista parametrow b do sprawdzenia
  148. :return: funkcja wykonuje selekcje modelu Naive Bayes - wybiera najlepsze wartosci parametrow a i b. Funkcja zwraca
  149. krotke (error_best, best_a, best_b, errors) gdzie best_error to najnizszy
  150. osiagniety blad, best_a - a dla ktorego blad byl najnizszy, best_b - b dla ktorego blad byl najnizszy,
  151. errors - macierz wartosci bledow dla wszystkich par (a,b)
  152. """
  153. errors = np.zeros((len(a_values), len(b_values)))
  154. p_y = estimate_a_priori_nb(ytrain)
  155. for i in range(len(a_values)):
  156. for j in range(len(b_values)):
  157. p_x_y = estimate_p_x_y_nb(Xtrain, ytrain, a_values[i], b_values[j])
  158. errors[i, j] = classification_error(p_y_x_nb(p_y, p_x_y, Xval), yval)
  159.  
  160. error_best = errors[0, 0]
  161. best_a = a_values[0]
  162. best_b = b_values[0]
  163. for i in range(len(errors)):
  164. for j in range(len(errors[i])):
  165. if errors[i, j] < error_best:
  166. error_best = errors[i, j]
  167. best_a = a_values[i]
  168. best_b = b_values[j]
  169.  
  170. return error_best, best_a, best_b, errors
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement