نمايش پست تنها
قديمي ۰۳-۲۶-۱۳۹۵, ۰۱:۲۹ قبل از ظهر   #1 (لینک دائم)
maryam2013 Male
عضو جدید
 
آواتار maryam2013
 
تاريخ عضويت: ارديبهشت ۱۳۹۵
پست ها: 3
تشكرها: 0
0 تشكر در 0 پست
Question سورس کد الگوریتم knn

سلام
من کد الگوریتم knn را دارم ولی خطا می دهد،درضمن می خواهم این الگوریتم برای دسته بندی دیتای دوکلاسه باشد
پیاپیش از همکاری شما صمیمانه سپاس گذارم.اگر کد کوتاه تری دارید ممنون میشوم بنویسید.در ضمن خطایی که این الگوریتم پایینی می دهد این چنین است:
Undefined function or variable 'trlabel'. چگونه این خطا را باید برطرف کنم؟؟یا در صورت امکان کد دیگری از knn بریپایم بفرستید
%================================================= ====================
% Filename: knn.m
%
% Version: 0.9.0 (testing)
% Author: LI, Wei <kuantkid<at>gmail.com>
%
% Modified at: Mon Sep 3 1105 2012
% Created at: Mon Sep 3 1155 2012
%
% Description: Kmeans with
% 1. parallel(TODO)/chunking distance calculatation
% for large dataset
% 2. simple posterior estimation using distance
% 3. class weight assignment
% Input:
% train: n_features x n_data
% trlabel: training labels, should be 1 - n_label
% probe: n_features x n_data
% k: number of k_nearest neighbor
% opt: options
% cache_num: number of chunks to be used
% trans : transform the score from squared distance using any rbf fuction, standard knn can have trans = @(x) ones(size(x));
% pad : using the pad+ nearest neighbor, useful when doing cross validation
%
% Copyright Wei LI (@kuantkid) Released Under Create Common BY-SA
%================================================= ====================
function [label, voting, prob_est] = knn(train, trlabel ,probe, k ,opt)
% make sure that label is 1 - numel(unique(trlabel))
if ~exist('opt','var')
opt = struct();
end

if ~isfield(opt,'tran')
opt.tran = @(x, sigma) exp(-x ./ (2*sigma) );
end

if ~isfield(opt,'cache_num')
opt.cache_num = 1;
end

if ~isfield(opt,'pad')
opt.pad = 0;
end

% probe may be too big
n_tr = size(train, 2);
dim = size(train, 1);
n_pr = size(probe, 2);

u_label = unique(trlabel);
n_label = length(u_label);

if ~isfield(opt,'labelweight')
opt.labelweight = ones(1, n_label);
end
opt.labelweight = opt.labelweight(';

ll = sparse(1:n_tr, trlabel, 1, n_tr, n_label, n_tr);

k_group = kgroup(1:n_pr, opt.cache_num);

result = zeros(n_pr, n_label);
for i = 1pt.cache_num
fprintf('Batch %d of %d', i, opt.cache_num);
% calculate the training set
% TIP: we can use the distance to get the ranking then apply the exp
M = (sqdist(train, probe(:,k_group{i})));
[D,M] = sort(M,1,'ascend');
% construct a ll matrix, by the labels from the first
M = (M((1:k) + opt.pad,);
D = opt.tran(D((1:k) + opt.pad,, median(M());

% convert M into labels
M = trlabel(M();
% tVoter = full(sparse(repmat(k_group{i}(', [1 k]) ,M(, D( , k * numel(k_group{i}) ,n_label));
tVoter = full(sparse(1: k * numel(k_group{i}) ,M(, D( , k * numel(k_group{i}) ,n_label));
% fold the k-trials into the first dimension, the n_probe into the
% second and n_label into the third
tVoter = reshape(tVoter,[k numel(k_group{i}) n_label]);

% using the label weight.
tSize = size(tVoter);
tVoter = reshape(bsxfun(@times,...
reshape(tVoter,[prod(tSize(1:end-1)) tSize(end)]),...
opt.labelweight),...
tSize);

tVoter = squeeze(sum(tVoter, 1));

% pack into the result
result(k_group{i}, = tVoter;

% memory clear
clear tVoter M D
end

% calculate the label, largest affinity
% result should be a n_probe x n_label matrix, distance is transformed
[~,l] = max(result,[],2);
label = u_label(l(:,1));

if(nargout >= 2)
voting = result;
end

% calculate probability output
if(nargout >= 3)
prob_est = bsxfun(@times, voting,1./sum(voting,2));
end

end

function [M] = sqdist(X1, X2)
M = bsxfun(@plus, sum(X1 .* X1, 1)', (-2) * X1' * X2);
M = bsxfun(@plus, sum(X2 .* X2, 1), M);
end

function [grp] = kgroup(idx, k, opt)
% make the indexes into K-Disjoint Groups
if ~exist('opt','var')
opt.rand = false;
end

if isfield(opt,'rand')
opt.rand = false;
end

n = length(idx);

if(opt.rand)
ridx = randperm(length(idx));
idx = idx(ridx);
end

% the last one is the largest.
grp = cell(1,k);
gnum = floor(n / k);

% grp indexes
for i = 1k-1)
grp{i} = idx( (1 + (i-1) * gnum) : i * gnum);
end

% the kth group
grp{k} = idx((gnum * (k-1)+1): n);
end
maryam2013 آفلاين است   پاسخ با نقل قول

  #ADS
نشان دهنده تبلیغات
تبليغگر
 
 
 
تاريخ عضويت: -
محل سكونت: -
سن: 2010
پست ها: -
 

نشان دهنده تبلیغات is online