Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PASTEBINnew pastetrends API tools faq
- search...
- Guest User
- -
- Public Pastes
- LMS
- 2 sec ago
- Knocks out a secur...
- 26 sec ago
- Untitled
- 29 sec ago
- Draw 3 (Owlveeluti...
- 31 sec ago
- Untitled
- 40 sec ago
- Untitled
- 1 min ago
- Untitled
- 1 min ago
- Untitled
- 1 min ago
- SHARE
- TWEET
- Lab2
- A GUEST APR 26TH, 2017 251 IN 29 DAYS
- Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
- rawdownloadcloneembedreportprint Python 8.41 KB
- from __future__ import division
- import scipy.spatial
- import numpy as np
- # MATRIX + ProcessPoolExecutor
- def calc_distance(X, X_train):
- X_train = X_train.transpose()
- outArr = X.astype(np.uint8) @ X_train.astype(np.uint8)
- outArr += (~X).astype(np.uint8) @ (~X_train).astype(np.uint8)
- return np.subtract(np.uint8(X_train.shape[0]), outArr)
- def hamming_distance(X, X_train):
- """
- :param X: zbior porownwanych obiektow N1xD
- :param X_train: zbior obiektow do ktorych porownujemy N2xD
- Funkcja wyznacza odleglosci Hamminga obiektow ze zbioru X od
- obiektow X_train. ODleglosci obiektow z jednego i drugiego
- zbioru zwrocone zostana w postaci macierzy
- :return: macierz odleglosci pomiedzy obiektami z X i X_train N1xN2
- """
- X = X.toarray()
- X_train = X_train.toarray()
- #SCIPY
- # return scipy.spatial.distance.cdist(X, X_train, metric="hamming") * X.shape[1]
- #MATRIX (uwaga na uint8 overflow)
- X_train = X_train.transpose()
- outArr = X.astype(np.uint8) @ X_train.astype(np.uint8)
- outArr += (~X).astype(np.uint8) @ (~X_train).astype(np.uint8)
- return np.subtract(np.uint8(X_train.shape[0]), outArr)
- # MATRIX + ProcessPoolExecutor (mocno przyspiesza wykonywanie gdy duże macierze)
- # MAX_PROCESSES = 4
- #
- # futures = []
- # arrays = np.split(X, MAX_PROCESSES)
- #
- # from concurrent.futures import ProcessPoolExecutor, Future
- # with ProcessPoolExecutor(max_workers=MAX_PROCESSES) as executor:
- # for i in range(MAX_PROCESSES):
- # futures.append(executor.submit(calc_distance, arrays[i], X_train))
- #
- # futures = list(map(Future.result, futures))
- #
- # return np.vstack(futures)
- def sort_train_labels_knn(Dist, y):
- """
- Funkcja sortujaca etykiety klas danych treningowych y
- wzgledem prawdopodobienstw zawartych w macierzy Dist.
- Funkcja zwraca macierz o wymiarach N1xN2. W kazdym
- wierszu maja byc posortowane etykiety klas z y wzgledem
- wartosci podobienstw odpowiadajacego wiersza macierzy
- Dist
- :param Dist: macierz odleglosci pomiedzy obiektami z X
- i X_train N1xN2
- :param y: wektor etykiet o dlugosci N2
- :return: macierz etykiet klas posortowana wzgledem
- wartosci podobienstw odpowiadajacego wiersza macierzy
- Dist. Uzyc algorytmu mergesort.
- """
- w = Dist.argsort(kind='mergesort')
- return y[w]
- def p_y_x_knn(y, k):
- """
- Funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla
- kazdej z klas dla obiektow ze zbioru testowego wykorzystujac
- klasfikator KNN wyuczony na danych trenningowych
- :param y: macierz posortowanych etykiet dla danych treningowych N1xN2
- :param k: liczba najblizszuch sasiadow dla KNN
- :return: macierz prawdopodobienstw dla obiektow z X
- """
- NUMBER_OF_CLASSES = 4
- resized = np.delete(y, range(k, y.shape[1]), axis=1)
- output = np.vstack(np.apply_along_axis(np.bincount, axis=1, arr=resized, minlength=NUMBER_OF_CLASSES + 1))
- output = np.delete(output, 0, axis=1)
- output = np.divide(output, k)
- return output
- def classification_error(p_y_x, y_true):
- """
- Wyznacz blad klasyfikacji.
- :param p_y_x: macierz przewidywanych prawdopodobienstw
- :param y_true: zbior rzeczywistych etykiet klas 1xN.
- Kazdy wiersz macierzy reprezentuje rozklad p(y|x)
- :return: blad klasyfikacji
- """
- p_y_x = np.fliplr(p_y_x)
- y_truea = p_y_x.shape[1] - np.argmax(p_y_x, axis=1)
- y_truea = np.subtract(y_truea, y_true)
- diff = np.count_nonzero(y_truea)
- diff /= y_true.shape[0]
- return diff
- def model_selection_knn(Xval, Xtrain, yval, ytrain, k_values):
- """
- :param Xval: zbior danych walidacyjnych N1xD
- :param Xtrain: zbior danych treningowych N2xD
- :param yval: etykiety klas dla danych walidacyjnych 1xN1
- :param ytrain: etykiety klas dla danych treningowych 1xN2
- :param k_values: wartosci parametru k, ktore maja zostac sprawdzone
- :return: funkcja wykonuje selekcje modelu knn i zwraca krotke (best_error,best_k,errors), gdzie best_error to najnizszy
- osiagniety blad, best_k - k dla ktorego blad byl najnizszy, errors - lista wartosci bledow dla kolejnych k z k_values
- """
- bestKIndex = 0
- errors = []
- sorted = sort_train_labels_knn(hamming_distance(Xval, Xtrain), ytrain)
- for i in range(len(k_values)):
- error = classification_error(p_y_x_knn(sorted, k_values[i]), yval)
- errors.append(error)
- if (errors[bestKIndex] > error):
- bestKIndex = i
- return (errors[bestKIndex], k_values[bestKIndex], errors)
- def estimate_a_priori_nb(ytrain):
- """
- :param ytrain: etykiety dla dla danych treningowych 1xN
- :return: funkcja wyznacza rozklad a priori p(y) i zwraca p_y - wektor prawdopodobienstw a priori 1xM
- """
- NUMBER_OF_CLASSES = 4
- return np.divide(np.delete(np.bincount(ytrain, minlength=NUMBER_OF_CLASSES+1), 0), ytrain.shape[0])
- def estimate_p_x_y_nb(Xtrain, ytrain, a, b):
- """
- :param Xtrain: dane treningowe NxD
- :param ytrain: etykiety klas dla danych treningowych 1xN
- :param a: parametr a rozkladu Beta
- :param b: parametr b rozkladu Beta
- :return: funkcja wyznacza rozklad prawdopodobienstwa p(x|y) zakladajac, ze x przyjmuje wartosci binarne i ze elementy
- x sa niezalezne od siebie. Funkcja zwraca macierz p_x_y o wymiarach MxD.
- """
- Xtrain = Xtrain.toarray()
- NUMBER_OF_CLASSES = 4
- rows =[]
- def summ(row, yequalk):
- return np.sum(np.bitwise_and(row, yequalk))
- for i in range(1, NUMBER_OF_CLASSES+1):
- yk = np.equal(ytrain, i)
- yksum = np.sum(yk)
- row = np.apply_along_axis(summ, axis=0, arr=Xtrain, yequalk=yk)
- rows.append(np.divide(np.add(row, a - 1), yksum + a + b -2))
- return np.vstack(rows)
- def p_y_x_nb(p_y, p_x_1_y, X):
- """
- :param p_y: wektor prawdopodobienstw a priori o wymiarach 1xM
- :param p_x_1_y: rozklad prawdopodobienstw p(x=1|y) - macierz MxD
- :param X: dane dla ktorych beda wyznaczone prawdopodobienstwa, macierz NxD
- :return: funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla kazdej z klas z wykorzystaniem klasyfikatora Naiwnego
- Bayesa. Funkcja zwraca macierz p_y_x o wymiarach NxM.
- """
- X = X.toarray()
- def calc2(row, x2):
- out1 = np.multiply(row, x2)
- return out1
- def normalise(row):
- Z = 1/np.sum(row)
- return np.multiply(row, Z)
- def calc(row):
- out = X * row
- out += np.negative(X) - np.negative(X) * row
- out = np.apply_along_axis(np.prod, arr=out, axis=1)
- return out
- test = np.apply_along_axis(calc, axis=0, arr=p_x_1_y.transpose())
- test = np.apply_along_axis(calc2, axis=1, arr=test, x2=p_y)
- test = np.apply_along_axis(normalise, axis=1, arr=test)
- return test
- def model_selection_nb(Xtrain, Xval, ytrain, yval, a_values, b_values):
- """
- :param Xtrain: zbior danych treningowych N2xD
- :param Xval: zbior danych walidacyjnych N1xD
- :param ytrain: etykiety klas dla danych treningowych 1xN2
- :param yval: etykiety klas dla danych walidacyjnych 1xN1
- :param a_values: lista parametrow a do sprawdzenia
- :param b_values: lista parametrow b do sprawdzenia
- :return: funkcja wykonuje selekcje modelu Naive Bayes - wybiera najlepsze wartosci parametrow a i b. Funkcja zwraca
- krotke (error_best, best_a, best_b, errors) gdzie best_error to najnizszy
- osiagniety blad, best_a - a dla ktorego blad byl najnizszy, best_b - b dla ktorego blad byl najnizszy,
- errors - macierz wartosci bledow dla wszystkich par (a,b)
- """
- bestErrorIndex = 0
- alen = int(len(a_values))
- blen = int(len(b_values))
- errors = []
- def test(index):
- nonlocal bestErrorIndex
- i = int(index / alen)
- j = int(index % blen)
- py = estimate_a_priori_nb(ytrain)
- p_x_y = estimate_p_x_y_nb(Xtrain, ytrain, a_values[i], b_values[j])
- p_y_x = p_y_x_nb(py, p_x_y, Xval)
- error = classification_error(p_y_x, yval)
- errors.append(error)
- if (errors[bestErrorIndex] > error):
- bestErrorIndex = index
- xx = map(test, range(alen * blen))
- xx = list(xx)
- return (errors[bestErrorIndex], a_values[int(round(bestErrorIndex / len(b_values)))], b_values[bestErrorIndex % len(b_values)], np.array(errors).reshape(len(a_values),len(b_values)))
- RAW Paste Data
- from __future__ import division
- import scipy.spatial
- import numpy as np
- # MATRIX + ProcessPoolExecutor
- def calc_distance(X, X_train):
- X_train = X_train.transpose()
- outArr = X.astype(np.uint8) @ X_train.astype(np.uint8)
- outArr += (~X).astype(np.uint8) @ (~X_train).astype(np.uint8)
- return np.subtract(np.uint8(X_train.shape[0]), outArr)
- def hamming_distance(X, X_train):
- """
- :param X: zbior porownwanych obiektow N1xD
- :param X_train: zbior obiektow do ktorych porownujemy N2xD
- Funkcja wyznacza odleglosci Hamminga obiektow ze zbioru X od
- obiektow X_train. ODleglosci obiektow z jednego i drugiego
- zbioru zwrocone zostana w postaci macierzy
- :return: macierz odleglosci pomiedzy obiektami z X i X_train N1xN2
- """
- X = X.toarray()
- X_train = X_train.toarray()
- #SCIPY
- # return scipy.spatial.distance.cdist(X, X_train, metric="hamming") * X.shape[1]
- #MATRIX (uwaga na uint8 overflow)
- X_train = X_train.transpose()
- outArr = X.astype(np.uint8) @ X_train.astype(np.uint8)
- outArr += (~X).astype(np.uint8) @ (~X_train).astype(np.uint8)
- return np.subtract(np.uint8(X_train.shape[0]), outArr)
- # MATRIX + ProcessPoolExecutor (mocno przyspiesza wykonywanie gdy duże macierze)
- # MAX_PROCESSES = 4
- #
- # futures = []
- # arrays = np.split(X, MAX_PROCESSES)
- #
- # from concurrent.futures import ProcessPoolExecutor, Future
- # with ProcessPoolExecutor(max_workers=MAX_PROCESSES) as executor:
- # for i in range(MAX_PROCESSES):
- # futures.append(executor.submit(calc_distance, arrays[i], X_train))
- #
- # futures = list(map(Future.result, futures))
- #
- # return np.vstack(futures)
- def sort_train_labels_knn(Dist, y):
- """
- Funkcja sortujaca etykiety klas danych treningowych y
- wzgledem prawdopodobienstw zawartych w macierzy Dist.
- Funkcja zwraca macierz o wymiarach N1xN2. W kazdym
- wierszu maja byc posortowane etykiety klas z y wzgledem
- wartosci podobienstw odpowiadajacego wiersza macierzy
- Dist
- :param Dist: macierz odleglosci pomiedzy obiektami z X
- i X_train N1xN2
- :param y: wektor etykiet o dlugosci N2
- :return: macierz etykiet klas posortowana wzgledem
- wartosci podobienstw odpowiadajacego wiersza macierzy
- Dist. Uzyc algorytmu mergesort.
- """
- w = Dist.argsort(kind='mergesort')
- return y[w]
- def p_y_x_knn(y, k):
- """
- Funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla
- kazdej z klas dla obiektow ze zbioru testowego wykorzystujac
- klasfikator KNN wyuczony na danych trenningowych
- :param y: macierz posortowanych etykiet dla danych treningowych N1xN2
- :param k: liczba najblizszuch sasiadow dla KNN
- :return: macierz prawdopodobienstw dla obiektow z X
- """
- NUMBER_OF_CLASSES = 4
- resized = np.delete(y, range(k, y.shape[1]), axis=1)
- output = np.vstack(np.apply_along_axis(np.bincount, axis=1, arr=resized, minlength=NUMBER_OF_CLASSES + 1))
- output = np.delete(output, 0, axis=1)
- output = np.divide(output, k)
- return output
- def classification_error(p_y_x, y_true):
- """
- Wyznacz blad klasyfikacji.
- :param p_y_x: macierz przewidywanych prawdopodobienstw
- :param y_true: zbior rzeczywistych etykiet klas 1xN.
- Kazdy wiersz macierzy reprezentuje rozklad p(y|x)
- :return: blad klasyfikacji
- """
- p_y_x = np.fliplr(p_y_x)
- y_truea = p_y_x.shape[1] - np.argmax(p_y_x, axis=1)
- y_truea = np.subtract(y_truea, y_true)
- diff = np.count_nonzero(y_truea)
- diff /= y_true.shape[0]
- return diff
- def model_selection_knn(Xval, Xtrain, yval, ytrain, k_values):
- """
- :param Xval: zbior danych walidacyjnych N1xD
- :param Xtrain: zbior danych treningowych N2xD
- :param yval: etykiety klas dla danych walidacyjnych 1xN1
- :param ytrain: etykiety klas dla danych treningowych 1xN2
- :param k_values: wartosci parametru k, ktore maja zostac sprawdzone
- :return: funkcja wykonuje selekcje modelu knn i zwraca krotke (best_error,best_k,errors), gdzie best_error to najnizszy
- osiagniety blad, best_k - k dla ktorego blad byl najnizszy, errors - lista wartosci bledow dla kolejnych k z k_values
- """
- bestKIndex = 0
- errors = []
- sorted = sort_train_labels_knn(hamming_distance(Xval, Xtrain), ytrain)
- for i in range(len(k_values)):
- error = classification_error(p_y_x_knn(sorted, k_values[i]), yval)
- errors.append(error)
- if (errors[bestKIndex] > error):
- bestKIndex = i
- return (errors[bestKIndex], k_values[bestKIndex], errors)
- def estimate_a_priori_nb(ytrain):
- """
- :param ytrain: etykiety dla dla danych treningowych 1xN
- :return: funkcja wyznacza rozklad a priori p(y) i zwraca p_y - wektor prawdopodobienstw a priori 1xM
- """
- NUMBER_OF_CLASSES = 4
- return np.divide(np.delete(np.bincount(ytrain, minlength=NUMBER_OF_CLASSES+1), 0), ytrain.shape[0])
- def estimate_p_x_y_nb(Xtrain, ytrain, a, b):
- """
- :param Xtrain: dane treningowe NxD
- :param ytrain: etykiety klas dla danych treningowych 1xN
- :param a: parametr a rozkladu Beta
- :param b: parametr b rozkladu Beta
- :return: funkcja wyznacza rozklad prawdopodobienstwa p(x|y) zakladajac, ze x przyjmuje wartosci binarne i ze elementy
- x sa niezalezne od siebie. Funkcja zwraca macierz p_x_y o wymiarach MxD.
- """
- Xtrain = Xtrain.toarray()
- NUMBER_OF_CLASSES = 4
- rows =[]
- def summ(row, yequalk):
- return np.sum(np.bitwise_and(row, yequalk))
- for i in range(1, NUMBER_OF_CLASSES+1):
- yk = np.equal(ytrain, i)
- yksum = np.sum(yk)
- row = np.apply_along_axis(summ, axis=0, arr=Xtrain, yequalk=yk)
- rows.append(np.divide(np.add(row, a - 1), yksum + a + b -2))
- return np.vstack(rows)
- def p_y_x_nb(p_y, p_x_1_y, X):
- """
- :param p_y: wektor prawdopodobienstw a priori o wymiarach 1xM
- :param p_x_1_y: rozklad prawdopodobienstw p(x=1|y) - macierz MxD
- :param X: dane dla ktorych beda wyznaczone prawdopodobienstwa, macierz NxD
- :return: funkcja wyznacza rozklad prawdopodobienstwa p(y|x) dla kazdej z klas z wykorzystaniem klasyfikatora Naiwnego
- Bayesa. Funkcja zwraca macierz p_y_x o wymiarach NxM.
- """
- X = X.toarray()
- def calc2(row, x2):
- out1 = np.multiply(row, x2)
- return out1
- def normalise(row):
- Z = 1/np.sum(row)
- return np.multiply(row, Z)
- def calc(row):
- out = X * row
- out += np.negative(X) - np.negative(X) * row
- out = np.apply_along_axis(np.prod, arr=out, axis=1)
- return out
- test = np.apply_along_axis(calc, axis=0, arr=p_x_1_y.transpose())
- test = np.apply_along_axis(calc2, axis=1, arr=test, x2=p_y)
- test = np.apply_along_axis(normalise, axis=1, arr=test)
- return test
- def model_selection_nb(Xtrain, Xval, ytrain, yval, a_values, b_values):
- """
- :param Xtrain: zbior danych treningowych N2xD
- :param Xval: zbior danych walidacyjnych N1xD
- :param ytrain: etykiety klas dla danych treningowych 1xN2
- :param yval: etykiety klas dla danych walidacyjnych 1xN1
- :param a_values: lista parametrow a do sprawdzenia
- :param b_values: lista parametrow b do sprawdzenia
- :return: funkcja wykonuje selekcje modelu Naive Bayes - wybiera najlepsze wartosci parametrow a i b. Funkcja zwraca
- krotke (error_best, best_a, best_b, errors) gdzie best_error to najnizszy
- osiagniety blad, best_a - a dla ktorego blad byl najnizszy, best_b - b dla ktorego blad byl najnizszy,
- errors - macierz wartosci bledow dla wszystkich par (a,b)
- """
- bestErrorIndex = 0
- alen = int(len(a_values))
- blen = int(len(b_values))
- errors = []
- def test(index):
- nonlocal bestErrorIndex
- i = int(index / alen)
- j = int(index % blen)
- py = estimate_a_priori_nb(ytrain)
- p_x_y = estimate_p_x_y_nb(Xtrain, ytrain, a_values[i], b_values[j])
- p_y_x = p_y_x_nb(py, p_x_y, Xval)
- error = classification_error(p_y_x, yval)
- errors.append(error)
- if (errors[bestErrorIndex] > error):
- bestErrorIndex = index
- xx = map(test, range(alen * blen))
- xx = list(xx)
- return (errors[bestErrorIndex], a_values[int(round(bestErrorIndex / len(b_values)))], b_values[bestErrorIndex % len(b_values)], np.array(errors).reshape(len(a_values),len(b_values)))
- create new paste / dealsnew! / api / trends / syntax languages / faq / tools / privacy / cookies / contact / dmca / scraping / go
- Site design & logo © 2017 Pastebin; user contributions (pastes) licensed under cc by-sa 3.0 -- Dedicated Server Hosting by Steadfast Top
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement