Понимание процесса стандартизации KNN - PullRequest
0 голосов
/ 11 января 2019

Так что у меня возникли проблемы с пониманием процессов стандартизации этого классификатора KNN. В основном мне нужно знать, что происходит в процессах стандартизации. Если кто-то может помочь, это будет с благодарностью. Я знаю, что есть переменная среднего и стандартного числа, из "примеров поезда", но что на самом деле происходит после этого, это то, с чем я испытываю трудности.

classdef myknn
methods(Static)

                %the function m calls the train examples, train labels
                %and the no. of nearest neighbours.
    function m = fit(train_examples, train_labels, k)

            % start of standardisation process
        m.mean = mean(train_examples{:,:});  %mean variable
        m.std = std(train_examples{:,:}); %standard deviation variable
        for i=1:size(train_examples,1)
            train_examples{i,:} = train_examples{i,:} - m.mean;
            train_examples{i,:} = train_examples{i,:} ./ m.std;
        end
            % end of standardisation process

        m.train_examples = train_examples;
        m.train_labels = train_labels;
        m.k = k;

    end

    function predictions = predict(m, test_examples)

        predictions = categorical;

        for i=1:size(test_examples,1)

            fprintf('classifying example example %i/%i\n', i, size(test_examples,1));

            this_test_example = test_examples{i,:};

            % start of standardisation process
            this_test_example = this_test_example - m.mean;
            this_test_example = this_test_example ./ m.std;
            % end of standardisation process

            this_prediction = myknn.predict_one(m, this_test_example);
            predictions(end+1) = this_prediction;

        end

    end

    function prediction = predict_one(m, this_test_example)

        distances = myknn.calculate_distances(m, this_test_example);
        neighbour_indices = myknn.find_nn_indices(m, distances);
        prediction = myknn.make_prediction(m, neighbour_indices);

    end

    function distances = calculate_distances(m, this_test_example)

        distances = [];

        for i=1:size(m.train_examples,1)

            this_training_example = m.train_examples{i,:};
            this_distance = myknn.calculate_distance(this_training_example, this_test_example);
            distances(end+1) = this_distance;
        end

    end

    function distance = calculate_distance(p, q)

        differences = q - p;
        squares = differences .^ 2;
        total = sum(squares);
        distance = sqrt(total);

    end

    function neighbour_indices = find_nn_indices(m, distances)

        [sorted, indices] = sort(distances);
        neighbour_indices = indices(1:m.k);

    end

    function prediction = make_prediction(m, neighbour_indices)

        neighbour_labels = m.train_labels(neighbour_indices);
        prediction = mode(neighbour_labels);

    end

end

конец

1 Ответ

0 голосов
/ 15 января 2019

Стандартизация - это процесс нормализации каждой функции в ваших учебных примерах, чтобы каждая функция имела среднее значение, равное нулю, и стандартное отклонение, равное единице. Процедура для этого должна была бы найти среднее значение каждого признака и стандартное отклонение каждого признака. После этого мы берем каждую особенность и вычитаем, но соответствующее ей среднее значение и делим на соответствующее стандартное отклонение.

Это хорошо видно по этому коду:

    m.mean = mean(train_examples{:,:});  %mean variable
    m.std = std(train_examples{:,:}); %standard deviation variable
    for i=1:size(train_examples,1)
        train_examples{i,:} = train_examples{i,:} - m.mean;
        train_examples{i,:} = train_examples{i,:} ./ m.std;
    end

m.mean запоминает среднее значение каждой функции, а m.std запоминает стандартное отклонение каждой функции. Обратите внимание, что вы должны запомнить оба из них, когда хотите выполнить классификацию во время теста. Это можно увидеть по имеющемуся у вас методу predict, где он берет тестовые характеристики и вычитает среднее и стандартное отклонение каждой функции из обучающих примеров.

function predictions = predict(m, test_examples)

    predictions = categorical;

    for i=1:size(test_examples,1)

        fprintf('classifying example example %i/%i\n', i, size(test_examples,1));

        this_test_example = test_examples{i,:};

        % start of standardisation process
        this_test_example = this_test_example - m.mean;
        this_test_example = this_test_example ./ m.std;
        % end of standardisation process

        this_prediction = myknn.predict_one(m, this_test_example);
        predictions(end+1) = this_prediction;

    end

Обратите внимание, что мы используем m.mean и m.std в тестовых примерах, и эти величины взяты из обучающих примеров.

Мой пост по стандартизации должен предоставить больше контекста. Кроме того, он достигает того же эффекта, что и код, который вы предоставили, но в более векторизованном виде: Как работает этот код для стандартизации данных?

...