توی تولباکس متلب نداره؟؟
توی تولباکس متلب نداره؟؟
lotfan mishe komakam konid????????
شما ابتدا باید یه برنامه svm را گیر بیارید و داده ها را مانند سایر روشها در اون آموزش بدید
من این برنامه رو پیداکردم چجوری باید ازش استفاده کنمfunction [D, a_star] = SVM(train_features, train_targets, params, region)
% Classify using (a very simple implementation of) the support vector machine algorithm
%
% Inputs:
% features- Train features
% targets - Train targets
% params - [kernel, kernel parameter, solver type, Slack]
% Kernel can be one of: Gauss, RBF (Same as Gauss), Poly, Sigmoid, or Linear
% The kernel parameters are:
% RBF kernel - Gaussian width (One parameter)
% Poly kernel - Polynomial degree
% Sigmoid - The slope and constant of the sigmoid (in the format [1 2], with no separating commas)
% Linear - None needed
% Solver type can be one of: Perceptron, Quadprog
% region - Decision region vector: [-x x -y y number_of_points]
%
% Outputs
% D - Decision sufrace
% a - SVM coeficients
%
% Note: The number of support vectors found will usually be larger than is actually
% needed because both solvers are approximate.
[Dim, Nf] = size(train_features);
Dim = Dim + 1;
train_features(Dim,:) = ones(1,Nf);
z = 2*(train_targets>0) - 1;
%Get kernel parameters
[kernel, ker_param, solver, slack] = process_params(params);
%Transform the input features
y = zeros(Nf);
switch kernel,
case {'Gauss','RBF'},
for i = 1:Nf,
y(:,i) = exp(-sum((train_features-train_features(:,i)*ones(1,Nf)).^2)'/(2*ker_param^2));
end
case {'Poly', 'Linear'}
if strcmp(kernel, 'Linear')
ker_param = 1;
end
for i = 1:Nf,
y(:,i) = (train_features'*train_features(:,i) + 1).^ker_param;
end
case 'Sigmoid'
if (length(ker_param) ~= 2)
error('This kernel needs two parameters to operate!')
end
for i = 1:Nf,
y(:,i) = tanh(train_features'*train_features(:,i)*ker_param (1)+ker_param(2));
end
otherwise
error('Unknown kernel. Can be Gauss, Linear, Poly, or Sigmoid.')
end
%Find the SVM coefficients
switch solver
case 'Quadprog'
%Quadratic programming
if ~isfinite(slack)
alpha_star = quadprog((z'*z).*(y'*y), -ones(1, Nf), [], [], z, 0, 0)';
else
alpha_star = quadprog((z'*z).*(y'*y), -ones(1, Nf), [], [], z, 0, 0, slack)';
end
a_star = (alpha_star.*z)*y';
%Find the bias
in = find((alpha_star > 0) & (alpha_star < slack));
if isempty(in),
bias = 0;
else
B = z(in) - a_star * y(:,in);
bias = mean(B(in));
end
case 'Perceptron'
max_iter = 1e5;
iter = 0;
rate = 0.01;
xi = ones(1,Nf)/Nf*slack;
if ~isfinite(slack),
slack = 0;
end
%Find a start point
processed_y = [y; ones(1,Nf)] .* (ones(Nf+1,1)*z);
a_star = mean(processed_y')';
while ((sum(sign(a_star'*processed_y+xi)~=1)>0) & (iter < max_iter))
iter = iter + 1;
if (iter/5000 == floor(iter/5000)),
disp(['Working on iteration number ' num2str(iter)])
end
%Find the worse classified sample (That farthest from the border)
dist = a_star'*processed_y+xi;
[m, indice] = min(dist);
a_star = a_star + rate*processed_y(:,indice);
%Calculate the new slack vector
xi(indice) = xi(indice) + rate;
xi = xi / sum(xi) * slack;
end
if (iter == max_iter),
disp(['Maximum iteration (' num2str(max_iter) ') reached']);
else
disp(['Converged after ' num2str(iter) ' iterations.'])
end
bias = 0;
a_star = a_star(1:Nf)';
case 'Lagrangian'
%Lagrangian SVM (See Mangasarian & Musicant, Lagrangian Support Vector Machines)
tol = 1e-5;
max_iter = 1e5;
nu = 1/Nf;
iter = 0;
D = diag(z);
alpha = 1.9/nu;
e = ones(Nf,1);
I = speye(Nf);
Q = I/nu + D*y'*D;
P = inv(Q);
u = P*e;
oldu = u + 1;
while ((iter<max_iter) & (sum(sum((oldu-u).^2)) > tol)),
iter = iter + 1;
if (iter/5000 == floor(iter/5000)),
disp(['Working on iteration number ' num2str(iter)])
end
oldu = u;
f = Q*u-1-alpha*u;
u = P*(1+(abs(f)+f)/2);
end
a_star = y*D*u(1:Nf);
bias = -e'*D*u;
otherwise
error('Unknown solver. Can be either Quadprog or Perceptron')
end
%Find support verctors
sv = find(abs(a_star) > 1e-10);
Nsv = length(sv);
if isempty(sv),
error('No support vectors found');
else
disp(['Found ' num2str(Nsv) ' support vectors'])
end
%Margin
b = 1/sqrt(sum(a_star.^2));
disp(['The margin is ' num2str(b)])
%Now build the decision region
N = region(5);
xx = linspace (region(1),region(2),N);
yy = linspace (region(3),region(4),N);
D = zeros(N);
for j = 1:N,
y = zeros(N,1);
for i = 1:Nsv,
data = [xx(j)*ones(1,N); yy; ones(1,N)];
switch kernel,
case {'Gauss','RBF'},
y = y + a_star(i) * exp(-sum((data-train_features(:,sv(i))*ones(1,N)).^2)'/(2*ker_param^2));
case {'Poly', 'Linear'}
y = y + a_star(i) * (data'*train_features(:,sv(i))+1).^ker_param;
case 'Sigmoid'
y = y + a_star(i) * tanh(data'*train_features(:,sv(i))*ker_param(1)+ke r_param(2));
end
end
D(:,j) = (y + bias);
end
D = D>0;
توی ابتدای فایل نحوه استفاده را نوشته بسته به داده شما داره
بهتره در مورد svm مطالعه کنید تا بدونید چه ورودی هایی را باید بدید
حالا بگردید شاید از این راحت تر هم باشه که فقط داده ها رابهش بدید و خروجی بگیرید چون تو اینجا پارامترهای پیش فرض نداره حتما باید بدونید چی می خواهید بهش بدید
یه سری تصاویر داشتم ،ازشون lbp گرفتم hلان میخوام ایناروبه یک svm بدم
آخرین ویرایش به وسیله sama.66 : یک شنبه 12 مرداد 1393 در 13:51 عصر
توی همون کدهایی که فرستاده بودم این فایل برای کلاسیفایربودازاین میتونم استفاده کنم؟؟function [final_accu,PreLabel] = NNClassifier(Samples_Train,Samples_Test,Labels_Tra in,Labels_Test)
Train_Model = Samples_Train;
Test_Model = Samples_Test;
numTest = size(Test_Model,2);
numTrain = size(Train_Model,2);
current_test = [];
current_comp = [];
PreLabel = [];
current_value = 0;
min_value = 99999;
class_index = 1;
for index2 = 1:numTest
current_test = Test_Model(:,index2);
for index3 = 1:numTrain
current_comp = Train_Model(:,index3);
current_value = sum(abs(current_test - current_comp));
if(current_value<min_value)
min_value = current_value;
class_index = Labels_Train(1,index3);
end
end
PreLabel = [PreLabel,class_index];
min_value = 99999;
class_index = 1;
end
Comp_Label = PreLabel - Labels_Test;
Comp_Label = Comp_Label;
accu_count = 0;
for index3 = 1:size(Comp_Label,2)
if(Comp_Label(1,index3)==0)
accu_count = accu_count+1;
end
end
final_accu = (accu_count/double(size(Comp_Label,2)))*100;
که به عنوان یه ویژگی ازش استفاده کنم
svmتومطلب دستورداره ولی نمیدونم چجوری استفاده کنم لطفا راهنماییم کنید
svmtrainبرای اموزش
و svmclassifyبرای ازمایش
آخرین ویرایش به وسیله sama.66 : یک شنبه 12 مرداد 1393 در 13:52 عصر
helpe matlabo k mikhunam yekami gij misham kasi hast betune komakam kone?????
ببینید الان توی اینترنت این صفحه هلپ svclassify هست (فکر کنم هلپ متلب هم همین طوره )آخر صفحه را نگاه کنید یک نمونه کد برای اجرا گذاشته شده همون را اجرا کنید
بعد داده های خودتون را مطابق همین بذارید داخل کد
اشکال کجاشت؟
http://www.mathworks.com/help/stats/svmclassify.html
(درکل 660 تا پلاک و 1200تا غیرپلاک دارم،ابعاد یک در479هستن)
من میخوام مثلا دوتادرمیان دوتا غیرپلاک و یکی پلاک روبدم بهsvm،
یعنی باید هردفعه دوتاغیرپلاک و یکی پلاک رو بهم بچسبونم؟؟( که ابعادش میشه 3در479)بعدیک ماتریس به ابعاد3در479ایجادکنم که 2تاغیرپلاک روصفربزارم اون یه دونه پلاک رو هم یک بزارم،به این شکل درسته؟؟؟
شما باید ابتدا از پلاک و غیر پلاک هر کدومشون دو سوم اونها را واسه آموزش و یک سوم را برای آزمایش جدا کنید یعنی 440 پلاک به همراه 800 غیر پلاک ( جمعا 1240) را برای آموزش و مابقی (220 پلاک و 400 غیر پلاک جمعا 620 ) را برای آزمایش نگه دارید
اینکه دو در میون باشن ترتیبشون مهم نیست همون بهتره که مثلا ماتریس که 1240 در 479 هست، تعداد 440 تای اولی پلاک و مابقی غیر پلاک باشن یعنی لازم نیست یک در میون بذارید چون وارد برنامه که میشه اصلا ربطی به ترتیب نداره
بنابراین شما در ابتدا یک اتریس 1240 در 479 به نام xdata برای svmtrain ایجاد می کنید سپس یک ماتریس 1240 در یک به نام group ایجاد می کنید که 440 تای اولی یک باشه و بقیه صفر باشه
سپس با svmclassify داده هایی که برای آزمایش نگه داشته بودید را طبقه بندی می کنید و کارآیی روش را به دست می آورید
manzuretun in code?
load fisheriris
xdata = meas(51:end,3:4);
group = species(51:end);
svmStruct = svmtrain(xdata,group,'ShowPlot',true);
dadamo k mizaram tuye workspace vali chejuri ouno mikhune?
شما تعدادی هیستوگرام برای پلاکها داریدمثلا 50 تا هر کدوم به ابعاد یک در 512
حالا تمام اینها را بچسبونید به هم تا یک ماتریس 50 در 512 ایجاد بشه
و برای غیر پلاکها هم مثلا 30 تا هیستوگرام غیر پلاک دارید اونها را هم به انتهای اون قبلی اضافه کنید تا نهایتا یک ماتریس 80 در 512 ایجاد بشه
که این در دستور svmtrain تشکیل پارامتر xdataرا میده
بعد باید یک ماتریس به ابعاد 80 در یک ایجاد کنید که 50 تا عضو اول اون یک و مابقی صفر باشن و اسم ماتریس را هم بذارید group
بعد مانند کدی که گذاشتید اجرا کنید به همین راحتی
اتصال مثلا 2تا ماتریس به این شکله؟
C=cat(1,A,B)
چجوری ایناروبهم بچسبونم
آخرین ویرایش به وسیله sama.66 : دوشنبه 13 مرداد 1393 در 20:28 عصر
نه منظورم اینه E=cat(1,A,B)
نمیدونم چرا به اون شکل نمایش داده شد
مثلا شما یه ماتریس a,b دارید می خواهید به هم بچسبونید
که اگه بخواهید ستون به ستون باشه میشه c اگه بخواهید سطر به سطر باشه میشه d
a=[1 2 3];
b=[4 5 6];
c=[a b];
d=[a; b];
یه مثال دیگه من یک ماتریس خالی به ابعاد 10 در سه میسازم و می خوام سطرهای اون را با ماتریس های یک در سه پر کنم
توجه: دستور rand یه سری عدد تصادفی میسازه که برای این مثال به کار بردم
a= zeros(10,3);
for i=1:10
b=rand(1,3);
a(i,:)=b;
end
من توی فایل دارم این داده هارو،نمیدونم باید بیارم توی workspace یا نه؟؟؟؟؟؟
خب 1240تارو چجوری بهم بچسبونم متوجه نمیشم
فقط اولی رو میخونه
Error using cd
Cannot CD to nonpelak (Name is nonexistent or not a directory).
Error in Untitled (line 9)
cd nonpelak;
من فرض کردم دو تا فولدر هست به نام pelak و nonpelak و پسوند فایلها هم txt هست
اطلاعات هر کدوم را می ریزه داخل دو تا ماتریس
حالا کاری که شما می کنید اینکه که به همون ترتیبی که گفتم داده ها را از این ماتریس ها استخراج کرده و در ماتریس xdata میذارید اگه به مشکل برخوردید اطلاع بدید
cd pelak;
fil=dir('*.txt');
for i=1:numel(fil)
pelakdata(i,:)=dlmread(fil(i).name);
end
cd nonpelak;
fil=dir('*.txt');
for i=1:numel(fil)
nonpelakdata(i,:)=dlmread(fil(i).name);
end
قبلا تو یه فایلی به همون ترتیبی که فرمودید برای ازمایش و یه فایلم برای اموزش جدا کردم،ولی الان چجوری باید ازتوی ماتریس واسه اموزش و ازمایش جداکنم؟
متوجه نشدم،ببینید من فایلامو جداکردم ولی به ماتریس تبدیل نکردم،نمیدونم میشه بگید مراحلش به چه صورت باید باشه دقیقا؟اول باید پلاک و نان پلاک رو به ماتریس تبدیل کنم طبق کدی که دادید و ازتوش واسه اموزش و ازمایش جداکنم؟؟؟؟یا اینکه فایلایی رو که ازقبل جداکردم به عنوان ازمایش و اموزش رو بزارم تو این کد وبه ماتریس تبدیل کنم ؟؟؟
ببینید همون طور که گفتم باید فایلها را به ماتریس تبدیل کنید تا بتونید وارد svm کنید
طبق همون کدی که گذاشتم فرض کنید فایلهای شما در دو فولدر باشه شما دو تا ماتریس درست کنید و اسم اون ماتریسها را هر چه دلتون خواست بذارید و نهایتا به من بگید این ماتریسهایی که ایجاد شده هر کدوم شامل چه داده هایی هست و تعداد سطر و ستون اون را بگویید تا برسیم به مرحله بعدی
دقیقا بگید در فولدرها چی گذاشتید در هر فولدری چه تعداد فایل هست
ok chejuri bayad vase amuzesho azmayesh az tu matrisa joda konam??
من دوتا فولدر دارم
از کدوم دسته استفاده کنم؟؟؟؟
آخرین ویرایش به وسیله sama.66 : شنبه 22 فروردین 1394 در 22:06 عصر
xdataamoozesh=[pelakdata(1:440,:);nonpelakdata(1:800,:)];
xdataazmayesh=[pelakdata(441:end,:);nonpelakdata(801:end,:)];
groupamoozesh=[ones(440,1);zeros(800,1)];
groupazmayesh=[ones(220,1);zeros(400,1)];
بعدش بایداینطور نوشت؟؟svmStruct = svmtrain(xdataamoozesh,groupamoozesh,'showplot',tr ue);
groupazmayesh = svmclassify(SVMStruct,Sample,'Showplot',true)
آخرین ویرایش به وسیله sama.66 : چهارشنبه 15 مرداد 1393 در 21:14 عصر
بله همین روش
به علاوه اینها
azmayesh=svmclassify(svmStruct,xdataazmayesh ,'ShowPlot',true);
[x,y,auc]=perfcurve(azmayesh,groupazmayesh,1);
plot(x,y)
xlabel('False positive rate'); ylabel('True positive rate')
title('ROC for classification by SVM')
disp(auc)
اگه شاخص auc از 80 درصد بیشتر بود معلومه کارایی روش خوب بوده
الان من حلقه رو چجوری بنویسم؟؟a= zeros(1240,1);
for i=1:440
b=rand( ,);
a(i,:)=b;
end