fknn
function test_out = fknn(sample_in, sample_out, test_in, k, m)
% FKNN Fuzzy k-nearest neighbor classification rule
%
% Usage:
% TEST_OUT = FKNNR(SAMPLE_IN, SAMPLE_OUT, TEST_IN, K)
%
% SAMPLE_IN: Input part of the sample data
% SAMPLE_OUT: Output part of the sample data
% TEST_IN: Input part of the test data
% K: The "k" in "K-NNR"
% TEST_OUT: Output of the test data according to fuzzy KNNR
%
% The dimensions of the above matrices is
%
% SAMPLE_IN: M1xN
% SAMPLE_OUT: M1xF
% TEST_IN: M2xN
% TEST_OUT: M2xF
%
% where
%
% M1 = the no. of sample data
% N = no. of features
% F = no. of classes (or categories)
% M2 = no. of test data
%
% For more technical details, please refer to the paper:
%
% J. M. Keller, M. R. Gray, and J. A. Givens, Jr., "A Fuzzy K-Nearest
% Neighbor Algorithm", IEEE Transactions on Systems, Man, and Cybernetics,
% Vol. 15, No. 4, pp. 580-585.
%
% For selfdemo, type "fknn" with no arguments.
%
% See also INITFKNN for obtaining a fuzzy version of SAMPLE_OUT.
% Roger Jang, 990805
if nargin == 0, selfdemo; return; end
if nargin < 5, m = 2; end
if nargin < 4, k = 3; end
sample_n = size(sample_in, 1);
test_n = size(test_in, 1);
feature_n = size(sample_in, 2);
class_n = size(sample_out, 2);
% Euclidean distance matrix
distmat = vecdist(sample_in, test_in);
% knnmat(i,j) = class of i-th nearest point of j-th input vector
% (The size of knnmat is k times test_n.)
[junk, index] = sort(distmat);
% knnmat = reshape(sample_out(index(1:k,:)), k, test_n);
test_out = zeros(test_n, class_n);
for i = 1:test_n,
neighbor_index = index(1:k, i);
weight = distmat(neighbor_index, i)'.^(-2/(m-1));
test_out(i,:) = weight*sample_out(neighbor_index,:)/(sum(weight));
end
% ========== Self demo ==========
function selfdemo
data_n = 50;
data = rand(data_n, 2);
x = data(:, 1);
y = data(:, 2);
class = zeros(data_n, 1);
index = find(y > x);
class(index) = 1;
index = find(y<=x & y>=-x+1);
class(index) = 2;
class(find(class==0)) = 3;
sampledata = [x y class];
colordef black;
figure;
axis([0 1 0 1]);
box on;
axis equal square
color = {'r', 'g', 'c'};
for i = 1:3,
index = find(class==i);
line(x(index), y(index), 'linestyle', 'none', 'marker', '.', ...
'color', color{i});
end
k = 3;
fuz_sample_out = initfknn(sampledata, k);
index = find(sum(fuz_sample_out.^0.5, 2)~=1);
%line(x(index), y(index), 'linestyle', 'none', 'marker', 'o', 'color', 'w');
test_in = rand(50, 2);
test_out = fknn([x y], fuz_sample_out, test_in, k);
% Plot test data
line(test_in(:,1), test_in(:,2), 'linestyle', 'none', 'marker', '.', 'color', 'w');
% Plot desired boundaries
line([0 1], [0 1], 'linestyle', ':');
line([0.5 1], [0.5 0], 'linestyle', ':');
legend('Sample data: Class 1', 'Sample data: Class 2',...
'Sample data: Class 3', 'Test data', -1);
% Plot classification result of the test data
[junk, max_index] = max(test_out');
for i = 1:3,
index = find(max_index==i);
line(test_in(index,1), test_in(index,2), 'linestyle', 'none', ...
'marker', 'o', 'color', color{i});
end
title('The circle color of a sample point shows its predicted class via FKNN.');
%for i = index(:)',
% text(x(i), y(i), mat2str(fuz_sample_out(i, :), 2));
%end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.