示例#1
0
def knn_train_test(k, xTrain, yTrain, xTest, yTest):
    """
    Given a specified k, train the knn model and predict
    the labels of the test data. Returns the accuracy of
    the resulting model.

    Parameters
    ----------
    k : int
        The number of neighbors
    xTrain : nd-array with shape n x d
        Training data 
    yTrain : 1d array with shape n
        Array of labels associated with training data.
    xTest : nd-array with shape m x d
        Test data 
    yTest : 1d array with shape m
        Array of labels associated with test data.

    Returns
    -------
    acc : float
        The accuracy of the trained knn model on the test data
    """
    model = Knn(k)
    model.train(xTrain, yTrain['label'])
    # predict the test dataset
    yHatTest = model.predict(xTest)
    return accuracy(yHatTest, yTest['label'])
示例#2
0
class PublicApi():
        def __init__(self):
                self.app = flask.Flask(__name__)
                CORS(self.app)
                self.app.config["DEBUG"] = True
                self.knn = Knn(3)                

        def start(self):
                @self.app.route('/api/predict', methods=['POST'])
                def api_id():    
                        logging.info(request.args)
                        if 'radiant_score' in request.args and 'dire_score' in request.args and 'duration' in request.args:
                                radiant_score = int(request.args['radiant_score'])
                                dire_score = int(request.args['dire_score'])
                                duration = int(request.args['duration'])
                                self.knn.set_k(int(request.args['k']))
                                result = self.knn.predict([[radiant_score,dire_score,duration]])
                                logging.info(result[0])
                                text_result = ''
                                logging.error(self.knn.k)
                                if result[0] == 1:
                                        text_result = 'Radiant wins!'
                                else:
                                        text_result = 'Dire wins!'                                        
                                        
                                self.knn.plot2D(radiant_score-dire_score,duration,text_result)
                                return str('{"result": \"'+text_result+'\"}')
                        else:
                                return "Missed a field"
                self.app.run(host='0.0.0.0', port=8080)
示例#3
0
def main():
    col_names = [
        'sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'
    ]
    iris = pd.read_csv('./iris.data', header=None, names=col_names)
    iris_class = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
    iris['species_num'] = [iris_class[i] for i in iris.species]
    X = iris.drop(['species', 'species_num'], axis=1).to_numpy()
    y = iris.species_num.to_numpy()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    kr = Knn(3)
    # knn = KNeighborsClassifier(3)

    # model = knn.fit(X_train, y_train)
    kr.fit(X_train, y_train)

    # p = model.predict(X_test)
    p2 = kr.predict(X_test)
    correct = 0
    total = 0
    for pred in zip(p2, y_test):
        if pred[0] == pred[1]:
            correct += 1
        total += 1
    print("acc :", correct / total)
def main():

    # getting data
    # returning set of features and set of labels
    # for each 4-elements set of features there is one label assigned
    # label is assgined based on characteristic resulting from features
    iris = datasets.load_iris()
    iris_df = pd.DataFrame(iris['data'], columns=iris['feature_names'])
    X = iris_df.to_numpy()
    y = iris['target']
    iris_df['species'] = iris['target']
    # print(X)  # [[5.9 3.  4.2 1.5],...,[6.  2.2 4.  1. ],...,[6.1 2.9 4.7 1.4]]
    # print(y)  # [0,0,0,....,1,1,1,....,2,2,2,...]
    plot_chart(iris_df)

    # splitting data into training and testing subsets
    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.2,
                                                        random_state=1234)

    clf = Knn(k=3)
    clf.fit(X_train,
            y_train)  # fitting model with features and corresponding labels
    predictions = clf.predict(X_test)

    print('Test samples shape: ' + str(X_test.shape))  # 120 features
    print(X_test)
    print('')
    print('Predictions shape: ' + str(predictions.shape))  # 30 lables
    print(predictions)

    print('')
    calculate_accuracy(predictions,
                       y_test)  # comparing predicitons outcome with y_test

    new_features = np.asarray([[6.2, 2.8, 5.7, 1.8]])
    predicted_label = clf.predict(np.asarray(new_features))

    print('')
    print('New Features: ' + str(new_features))
    print('Predicted label: ' + str(predicted_label))
    print('Predicted speices: ' + str(species[int(predicted_label[0])]))
示例#5
0
    def test_k_5(self):
        """Test to compare our knn with Sklearn knn when k=5 and distance is euclidean"""
        knn = KNeighborsClassifier(n_neighbors=5)
        knn.fit(X_train, y_train)
        prediction = knn.predict(X_test)

        knn2 = Knn(n_neighbors=5)
        knn2.fit(X_train, y_train)
        prediction2 = knn2.predict(X_test)

        assert np.alltrue(
            prediction == prediction2), "Error testing knn with k=5"
示例#6
0
    def test_distance_weight_2(self):
        """Test to compare our knn with Sklearn when k=5 and weights are the inverse of distance"""
        knn = KNeighborsClassifier(n_neighbors=5, weights='distance')
        knn.fit(X_train, y_train)
        prediction = knn.predict(X_test)

        knn2 = Knn(n_neighbors=5, weights='distance')
        knn2.fit(X_train, y_train)
        prediction2 = knn2.predict(X_test)

        assert np.alltrue(prediction == prediction2
                          ), "Error testing knn with k=5 and weights=distance"
示例#7
0
    def test_k_5_distance_minkowski(self):
        """Test to compare our knn with Sklearn knn when k=5 and distance is minkowski with p=3"""
        knn = KNeighborsClassifier(n_neighbors=5, metric="minkowski", p=3)
        knn.fit(X_train, y_train)
        prediction = knn.predict(X_test)

        knn2 = Knn(n_neighbors=5, metric="minkowski", p=3)
        knn2.fit(X_train, y_train)
        prediction2 = knn2.predict(X_test)

        assert np.alltrue(prediction == prediction2
                          ), "Error testing knn (minkowski) with k=5 and p=3"
示例#8
0
def main():
    X_train, y_train, X_test, y_test = load_mnist()

    # data binarization
    # for i in tqdm(range(len(x_train))):
    #     for j in range(28):
    #         for k in range(28):
    #             x_train[i][j][k] = 1 if x_train[i][j][k] > 177 else 0
    # for i in tqdm(range(len(x_test))):
    #     for j in range(28):
    #         x_test[i][j].squeeze()
    #         for k in range(28):
    #             x_test[i][j][k] = 1 if x_test[i][j][k] > 177 else 0

    # plot data samples
    # plot = plt.subplots(nrows=4, ncols=5, sharex='all', sharey='all')[1].flatten()
    # for i in range(20):
    #     img = x_train[i]
    #     plot[i].set_title(y_train[i])
    #     plot[i].imshow(img, cmap='Greys', interpolation='nearest')
    # plot[0].set_xticks([])
    # plot[0].set_yticks([])
    # plt.tight_layout()
    # plt.show()

    knn = Knn()
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    correct = sum((y_test - y_pred) == 0)

    print('==> correct:', correct)
    print('==> total:', len(X_test))
    print('==> acc:', correct / len(X_test))

    # plot pred samples
    fig = plt.subplots(nrows=4, ncols=5, sharex='all',
                       sharey='all')[1].flatten()
    for i in range(20):
        img = X_test[i]
        fig[i].set_title(y_pred[i])
        fig[i].imshow(img, cmap='Greys', interpolation='nearest')
    fig[0].set_xticks([])
    fig[0].set_yticks([])
    plt.tight_layout()
    plt.show()
示例#9
0
def main():
    X_train, y_train, X_test, y_test = load_mnist()

    knn = Knn()
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    correct = sum((y_test - y_pred) == 0)

    print('==> correct:', correct)
    print('==> total:', len(X_test))
    print('==> acc:', correct / len(X_test))

    # plot pred samples
    fig = plt.subplots(nrows=4, ncols=5, sharex='all',
                       sharey='all')[1].flatten()
    for i in range(20):
        img = X_test[i]
        fig[i].set_title(y_pred[i])
        fig[i].imshow(img, cmap='Greys', interpolation='nearest')
    fig[0].set_xticks([])
    fig[0].set_yticks([])
    plt.tight_layout()
    plt.show()
示例#10
0
im = cv2.imread('6.png')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# (2) threshold-inv and morph-open 
th, threshed = cv2.threshold(gray, 100, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)
morphed = cv2.morphologyEx(threshed, cv2.MORPH_OPEN, np.ones((2,2)))
# (3) find and filter contours, then draw on src 
cnts = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]


for cnt in cnts:
    x,y,w,h = bbox = cv2.boundingRect(cnt)
    if  h>28:
        cv2.rectangle(cnt, (x,y), (x+w, y+h), (255, 0, 255), 1, cv2.LINE_AA)
        roi = threshed[y:y+h,x:x+w]
        cv2.imshow( "Display window", roi )
        cv2.waitKey(0)
        cv2.waitKey(0)
        roi = center_image(roi)
        cv2.imshow( "Display window", roi )
        cv2.waitKey(0)
        cv2.waitKey(0)
        
        roismall = cv2.resize(roi,(28,28))
        cv2.imshow( "Display window", roismall )
        cv2.waitKey(0)
        cv2.waitKey(0)
        roismall = roismall.flatten()
        print(knn.predict(roismall))
        
示例#11
0
def get_accuracy(k, trainx, trainy, testx, testy):
    knn = Knn(k)
    knn.fit(trainx, trainy)
    hyp = knn.predict(testx)
    return accuracy_score(hyp, testy)
示例#12
0
from knn import Knn
from vector import Vector

model = Knn()

with open('data/train.csv') as f:
    for line in f:
        data = line.strip().split(',')
        vector = Vector(*map(float, data[:4]))
        species = data[-1]
        model.train(vector, species)

experiments = []
with open('data/test.csv') as f:
    for line in f:
        data = line.strip().split(',')
        vector = Vector(*map(float, data[:4]))
        species = data[-1]
        prediction = model.predict(vector, 3)
        experiments.append(species == prediction)

accuracy = sum(experiments) / len(experiments)
print('accuracy:', accuracy)
示例#13
0
    x_train_folds = []
    y_train_folds = []
    indices = np.array_split(np.arange(num_training),
                             indices_or_sections=num_folds)
    for i in indices:
        x_train_folds.append(x_train[i])
        y_train_folds.append(y_train[i])
    k_to_accuracies = {}
    for k in k_choices:
        acc = []
        for i in range(num_folds):
            x = x_train_folds[0:i] + x_train_folds[i + 1:]
            x = np.concatenate(x, axis=0)

            y = y_train_folds[0:i] + y_train_folds[i + 1:]
            y = np.concatenate(y, axis=0)

            test_x = np.array(x_train_folds[i])
            test_y = np.array(y_train_folds[i])

            classifier = Knn()
            print(x)
            classifier.fit(np.array(x), np.array(y))

            y_pred = classifier.predict(k, 'M', test_x)
            accuracy = np.mean(y_pred == test_y)
            acc.append(accuracy)
    k_to_accuracies[k] = acc
    for k in sorted(k_to_accuracies):
        for accuracy in k_to_accuracies[k]:
            print('k=%d,accuracy=%f' % (k, accuracy))
示例#14
0
class KnnDemoApp():
    SIZE = 3
    MARKS = ['X', 'O']
    MODES = ['DATASET', 'PREDICCION']

    def __init__(self):
        self.points = []
        self.labels = []
        self.lines = []
        self.knn = Knn()

        self.root = Tk()
        self.root.title("KNN Demo")
        self.root.geometry('800x520')
        self.root.resizable(False, False)

        self.axis = Canvas(self.root, width=720, height=370)
        self.axis.grid(column=0, row=0, columnspan=5)
        self.axis.configure(bg='white')
        self.axis.bind('<Button 1>', self.clickCallback)
        self.axis_points = []
        self.axis_predictions = []

        self.debug_lbl = Label(self.root, text='Mensaje ==>')
        self.debug_lbl.grid(column=0, row=1)

        self.debug_msg = Label(self.root, text='-')
        self.debug_msg.grid(column=0, row=1, columnspan=5)

        self.init_btn = Button(self.root,
                               text='Reiniciar',
                               command=self.cleanHandler)
        self.init_btn.grid(column=5, row=2)

        self.class_lbl = Label(self.root, text='Clase ==>')
        self.class_lbl.grid(column=0, row=2)

        self.current_mark = self.MARKS[0]
        self.class_btn = Button(self.root,
                                text=self.current_mark,
                                command=self.classButtonHandler)
        self.class_btn.grid(column=1, row=2)

        self.mode_lbl = Label(self.root, text='MODO ==>')
        self.mode_lbl.grid(column=2, row=2)

        self.current_mode = self.MODES[0]
        self.mode_btn = Button(self.root,
                               text=self.current_mode,
                               command=self.modeButtonHandler)
        self.mode_btn.grid(column=3, row=2)

        self.k_lbl = Label(self.root, text='K ==>')
        self.k_lbl.grid(column=2, row=3)

        self.k_txt = Entry(self.root, width=2, text='3')
        self.k_txt.grid(column=3, row=3)

        self.root.mainloop()

    def modeButtonHandler(self):
        if self.mode_btn['text'] == self.MODES[0]:
            self.mode_btn.config(text=self.MODES[1])
            self.class_btn['state'] = DISABLED
            self.current_mode = self.MODES[1]
        else:
            self.mode_btn.config(text=self.MODES[0])
            self.class_btn['state'] = NORMAL
            self.current_mode = self.MODES[0]

    def classButtonHandler(self):
        if self.class_btn['text'][-1] == self.MARKS[0]:
            self.class_btn.config(text=self.MARKS[1])
            self.current_mark = self.MARKS[1]
        else:
            self.class_btn.config(text=self.MARKS[0])
            self.current_mark = self.MARKS[0]

    def cleanHandler(self):
        for p in self.axis_points:
            self.axis.delete(p)
        del self.axis_points[:]
        for pr in self.axis_predictions:
            self.axis.delete(pr)
        del self.axis_predictions[:]
        for l in self.lines:
            self.axis.delete(l)
        del self.lines[:]
        self.points = []
        self.labels = []

    def clickCallback(self, event):
        x = event.x
        y = event.y
        if self.current_mode == 'DATASET':
            self.points.append((x, y))
            self.labels.append(1 if self.current_mark == 'X' else 0)
            self.axis_points.append(
                self.axis.create_text(
                    x,
                    y,
                    text=self.current_mark,
                    fill='red' if self.current_mark == 'X' else 'dark green'))
        else:
            # predict knn
            self.predictKnn(x, y)
        print(event.x, event.y)

    def predictKnn(self, x_ex, y_ex):
        # clean previous lines
        for l in self.lines:
            self.axis.delete(l)
        self.lines = []
        # set up dataset
        X = np.array(self.points)
        y = np.array(self.labels)
        example = np.array([x_ex, y_ex])
        k = int(self.k_txt.get())
        print(f'k: {k}')
        # call Knn class
        pred_label, neighbors, labels = self.knn.predict(X, y, example, k)
        prediction = 'X' if pred_label == 1 else 'O'
        # draw knn lines
        for n, label in zip(neighbors, labels):
            print(n, label)
            line = self.axis.create_line(
                n[0],
                n[1],
                x_ex,
                y_ex,
                fill='coral' if label == 1 else 'lime green')
            self.lines.append(line)

        # draw prediction
        self.axis_predictions.append(
            self.axis.create_text(
                x_ex,
                y_ex,
                text=prediction,
                fill='indian red' if pred_label == 1 else 'OliveDrab4',
                font=('freemono', 14, 'bold')))