zoukankan      html  css  js  c++  java
  • 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
    

  • 相关阅读:
    PAT甲级1018Public Bike Management
    PAT甲级1003Emergency
    android的AIDL
    View的滑动冲突和解决方案
    弹性滑动原理
    View的滑动原理和多种滑动方法
    Android的Activity的生命周期
    Android获取App版本号和版本名
    转:Android检查设备是否联网
    androidstudio实现增量更新步骤
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2095342.html
Copyright © 2011-2022 走看看