Enginius/Matlab

KNN-regression

해리s 2017. 3. 1. 19:47

Super simple K-NN regression algorithm in MATLAB

main.m

range = 1;

xall = [1 3 5 7 9 11 13 20 21 23 24 25 30]'*range;

yall = [0 3 2 6 1 0  2  4  5  6  10  5 0]';

xs   = linspace(0, 30*range, 100)';

k    = 5;

func = @(X)(get_knnregression(X, xall, yall, k));

outs = func(xs);


figure(1); clf; hold on;

plot(xall, yall, 'ko', 'MarkerSize', 15, 'LineWidth', 2);

plot(xs, outs, 'b-', 'LineWidth', 2);

title(sprintf('KNN REGRESSION [k:%d]', k), 'FontSize', 14);


get_knnregression.m

function outs = get_knnregression(xs, xall, yall, k)

% KNN REGRESSION

nx = size(xs, 1);

dy = size(yall, 2);

outs = zeros(nx, dy);

for xidx = 1:nx % FOR ALL TRAINING DATA

    x = xs(xidx, :);

    % FIRST FIND K CLOSEST INDICES

    [n, d]  = size(xall);

    xdiffs  = xall - repmat(x, n, 1);

    dsq     = zeros(n, 1);

    for i = 1:d

        dsq = dsq + xdiffs(:, i).^2;

    end

    ds = sqrt(dsq);

    [~, indices] = sort(ds, 'ascend');

    selidx  = indices(1:k);

    % COMPUTE WEIGHTS

    weights = ds(selidx);

    weights = exp(- 5 * weights / max(weights));

    weights = weights / sum(weights);

    % THEN, SIMPLY AVERAGE THEM 

    outs(xidx, :) = weights'*yall(selidx, :);

end