-
Notifications
You must be signed in to change notification settings - Fork 0
/
BIRCH.m
52 lines (40 loc) · 1.25 KB
/
BIRCH.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%% Remove the border instances
function [ IA ] = BIRCH( X, Y, varargin )
narginchk(2, 3);
if nargin == 2
param = struct;
param = setDefaultValues(param);
elseif nargin == 3
if ~isstruct(varargin{1})
error('The param must be a struct');
end
param = setDefaultValues(varargin{1});
end
[idx, ~] = knnsearch(X, X, 'Distance', param.DistanceMetric, 'K', param.NumOfNeighbors + 1);
neighbours = Y(idx);
% Set 1 if neighbors are in different classes, otherwise 0
nn = (neighbours(:,1) ~= neighbours(:,2:end));
% Different class
[r, c] = find(nn==1);
b = [r c];
[~, ia, ~] = unique(b(:,1));
B = b(ia, :);
% The same class
[r, c] = find(nn==0);
b = [r c];
[~, ia, ~] = unique(b(:,1));
A = b(ia, :);
% The difference of two sets
IA = setdiff(A(:,1), B(:,1));
end
%% Set the parameters to their default values
function [ param ] = setDefaultValues( param )
field = {'DistanceMetric', 'NumOfNeighbors'};
TF = isfield(param, field);
if TF(1) == 0
param.DistanceMetric = 'cityblock';
end
if TF(2) == 0
param.NumOfNeighbors = 1;
end
end