ورود

View Full Version : راهنمايي براي انديس گذاري براي داده ها در knn



m3.moghadam
دوشنبه 03 آذر 1393, 00:12 صبح
سلام
من دارم سعي ميكنم روش knn رو توي متلب پياده سازي كنم. هدفم هم اينه كه دو سري كلاس داده اي دارم كه قراره بعنوان train باشند و دو سري نمونه داده هم بعنوان test دارم!
حالا من الگوريتم knn رو هم تايه جاهايي پيش بردم وقراره داده هاي test با روش knn كلاس بندي بشوند و بعدش خطا رو محاسبه كنم و اينا..
حالا به مشكلي خوردم، اونم اين كه نمي تونم براي داده هاي هر كلاسم ليبل بزارم!!!:عصبانی++: كه نمايانگر كلاس داده ها باشه تا موقعي كه k نزديكترين همسايه رو بدست ميارم بفهمم داده test متعلق به كدوم كلاس بدست اومده! كه بعدش خطا رو حساب كنم..

ممنون ميشم اگه زود كمكم كنيد..
باتشكر

rahnema1
دوشنبه 03 آذر 1393, 06:03 صبح
سلاملطفا کد متلب و نحوه ایجاد داده ها را بذارید اینجا بینیم چیکار کردید

m3.moghadam
دوشنبه 03 آذر 1393, 10:07 صبح
سلام
روش توليد داده با استفاده از يك توزيع احتمال نمونه ها توليد شدند..بخشي از knn موجوده كه فقط بايد قسمت تعيين k و نوع كلاس مشخص بشه مونده!:متفکر:
clc;
close all;
clear all;

trainnum=100;
testnum=20;
mu1=[2 0];
mu2=[-1 0];
sigma1=[1 0.5;0.5 1];
sigma2=[1 0.5;0.5 1.5];
classnum=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
trainclass1=mvnrnd(mu1,sigma1,20);
trainclass2=mvnrnd(mu2,sigma2,100);
testclass1=mvnrnd(mu1,sigma1,20);
testclass2=mvnrnd(mu2,sigma2,20);
% trainclass3=mvnrnd(mu3,sigma3,trainnum);
figure(1),
plot(trainclass1(:,1),trainclass1(:,2),'b+');hold on
plot(trainclass2(:,1),trainclass2(:,2),'r*');

train12= cat(1,trainclass1, trainclass2);

%% mohasebee Fasele %%
tic
for i=1:20
for j=1:120
fasele(i,j)=sqrt(sum((train12(j)-train12(i)).^2));
end
end
[sorted, idx] = sort(fasele,'ascend');
pos = sort(min(fasele));
hold on

rahnema1
دوشنبه 03 آذر 1393, 11:21 صبح
دوسوم داده ها برای آموزش و یک سوم برای آزمایش بنابراین صد تا برای train و 50 تا برای تست میذاریم و لیبل هر کدوم هم به صورت زیر

trainclass1=mvnrnd(mu1,sigma1,100);
trainclass2=mvnrnd(mu2,sigma2,100);
testclass1=mvnrnd(mu1,sigma1,50);
testclass2=mvnrnd(mu2,sigma2,50);
labeltrain = [ones(100,1);zeros(100,1)];
labeltest = [ones(50,1);zeros(50,1)];
...

m3.moghadam
دوشنبه 03 آذر 1393, 12:47 عصر
سلام ممنون..آرره درسته همين طوري ميشه..:لبخندساده: فقط تآكيد استاد بر روي 20 تا Train كلاس 1 و 100 تا Trainكلاس 2 بود و همچنين از هر كلاس 20 تا تست داشته باشيم!!:متفکر:
فقط الان يه مشكلي هست و اونم اينكه وقتي من فاصله رو بدست ميارم يه ماتريس 20*120 دارم كه نسبت به قطر اصلي قرينه است! حالا من ميخوام روي هر كدوم از اين فاصله ها انديسي بزارم تا متوجه بشم كه فاصله براي كدام دو نقطه است(كدام نقطه در Trainها) تا بعد از sort كردن و كمترين مقدار را بدست آوردن بتوانم از اين انديس براي يافتن كلاس ورودي استفاده كنم! چيكارش كنم؟؟؟

rahnema1
دوشنبه 03 آذر 1393, 14:33 عصر
در واقع یک ماتریس 200 در 200 باید بشه
با روش زیر اندیس دو تا نمونه ای که به هم نزدیکترند چاپ میشه

clc;
close all;
clear all;

trainnum=100;
testnum=20;
mu1=[2 0];
mu2=[-1 0];
sigma1=[1 0.5;0.5 1];
sigma2=[1 0.5;0.5 1.5];
classnum=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

trainclass1=mvnrnd(mu1,sigma1,trainnum);
trainclass2=mvnrnd(mu2,sigma2,trainnum);
testclass1=mvnrnd(mu1,sigma1,testnum);
testclass2=mvnrnd(mu2,sigma2,testnum);
labeltrain = [ones(trainnum,1);zeros(trainnum,1)];
labeltest = [ones(testnum,1);zeros(testnum,1)];

% trainclass3=mvnrnd(mu3,sigma3,trainnum);
figure(1),
plot(trainclass1(:,1),trainclass1(:,2),'b+');hold on
plot(trainclass2(:,1),trainclass2(:,2),'r*');

train12= cat(1,trainclass1, trainclass2);

order = nchoosek(1:size(train12, 1), 2);
Xi = order(:, 1);
Yi = order(:, 2);
d = train12(Xi, 1:2) - train12(Yi, 1:2);
dist = sqrt(sum (d .^ 2, 2));
minindex = find(dist == min(dist));
disp([Xi(minindex), Yi(minindex)])
hold on

m3.moghadam
دوشنبه 03 آذر 1393, 17:15 عصر
ممنون از راهنمايي تون و اينكه وقت ميزارين، فقط چند تا سوال !!
من منظور و دليل گذاشتن خطوط 28-29-30 رو در برنامه بالا رو متوجه نشدم!؟؟:متفکر: چرا تمام جايگشت هاي ترين رو بدست آوردين؟؟ آخه نقاط train در فضا ثابت در نظر گرفته مي شوند و بعد testها كلاس خودشونو از طريق همين train ها بدست ميارند!!
در خط 31 هم در حال انداز گيري اختلاف مقادير train از هم هستش نه مقادير test از train ؟؟؟درسته؟؟؟!!

rahnema1
دوشنبه 03 آذر 1393, 17:46 عصر
چون ماتریس فاصله قرینه هست ما لازم داریم اندیس یکی از مثلثهای اون را داشته باشیم که تمام جایگشت ها در واقع اندیس یکی از مثلثهای ماتریس را به دست میاره
و ما هم فاصله تمام نمونه های train از همدیگه را به دست آوردیم. مگه چه طور باید باشه؟

m3.moghadam
دوشنبه 03 آذر 1393, 17:54 عصر
چون ماتریس فاصله قرینه هست ما لازم داریم اندیس یکی از مثلثهای اون را داشته باشیم که تمام جایگشت ها در واقع اندیس یکی از مثلثهای ماتریس را به دست میاره
و ما هم فاصله تمام نمونه های train از همدیگه را به دست آوردیم. مگه چه طور باید باشه؟

ممنون از توضيحتون ولي خب اين انديس ها خيلي بيشتر از نمونه هاي train نيست؟؟؟!!:متفکر:
نه ديگه فاصله نمونه هاي train از هم رو نمي خواهيم، بلكه فاصله نمونه هاي تست رو از train مي خواهيم كه با k تا از نمونه هاي train كه كوچكترين فاصله از نمونه آزمايشي رو دارند بايد پيدا كرد كه كلاس اون نمونه ها تعيين كننده نوع كلاس نمونه هاي تست ما هستند!!

rahnema1
دوشنبه 03 آذر 1393, 18:41 عصر
این را ببینید
knn که k نزدیکترین داده را میده
knnIndex که k اندیس نزدیکترین داده را میده

clc;
close all;
clear all;

trainnum=100;
testnum=20;
mu1=[2 0];
mu2=[-1 0];
sigma1=[1 0.5;0.5 1];
sigma2=[1 0.5;0.5 1.5];
classnum=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

trainclass1=mvnrnd(mu1,sigma1,trainnum);
trainclass2=mvnrnd(mu2,sigma2,trainnum);
testclass1=mvnrnd(mu1,sigma1,testnum);
testclass2=mvnrnd(mu2,sigma2,testnum);
labeltrain = [ones(trainnum,1);zeros(trainnum,1)];
labeltest = [ones(testnum,1);zeros(testnum,1)];

% trainclass3=mvnrnd(mu3,sigma3,trainnum);
figure(1),
plot(trainclass1(:,1),trainclass1(:,2),'b+');hold on
plot(trainclass2(:,1),trainclass2(:,2),'r*');

train12= cat(1,trainclass1, trainclass2);
test12= cat(1,testclass1, testclass2);

dist = sqrt((train12(:,1) * (-test12(:,1)')) .^ 2 + (train12(:,2) * (-test12(:,2)')).^ 2);
k = 5;
knn = zeros(size(test12,1) , k);
knnIndex = zeros(size(test12,1) , k);
for i =1:size(test12,1)
[S I] = sortrows(dist, i);
knn(i,:) = S(i,1:k);
knnIndex(i,:) = I(1:k);
end

hold on

m3.moghadam
دوشنبه 03 آذر 1393, 21:10 عصر
واقعآ ممنون از كدهاتون..درسته هموني شد كه ميخواستم:تشویق::لبخندساده:
حالا ميخوام اون داده هاي تست رو با داده ها ترين رسم كنم و همينطور بفهمم داده تست درست طبقه بندي شده يا نه!! يه سوال الان ادامه كد بالا مي هوام داده هاي تست رو بهمراه نوع كلاسي كه در نهايت بدست ميارند رو نشون بدم.
كد زير براي تعيين نهايي نوع كلاس داده هاي تست نوشتم ولي با توجه به شكل خروجي در اين كدها..نتايج حاصل از دسته بندي تست ها اشتباهه!!:گریه:

sum1=0;
sum2=0;
class1=zeros(size(test12,1) , 1);
class2=zeros(size(test12,1) , 1);

for k=1:size(test12,1)
for l=1:kk
if (knnIndex(k,l)<20)
class1(k)=knnIndex(k,l);
sum1=sum1+1; % baraye kelasse 1
else
sum2=sum2+1; % baraye kelass 2
class2(k)=knnIndex(k,l);
end
end
end

m3.moghadam
دوشنبه 03 آذر 1393, 22:31 عصر
بهتره تمام كد رو بزارم تا با اجراش منظورمو بهتر درك كنيد:

clc;
close all;
clear all;

trainnum=120;
testnum=20;
mu1=[2 0];
mu2=[-1 0];
sigma1=[1 0.5;0.5 1];
sigma2=[1 0.5;0.5 1.5];
classnum=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

trainclass1=mvnrnd(mu1,sigma1,20);
trainclass2=mvnrnd(mu2,sigma2,100);
testclass1=mvnrnd(mu1,sigma1,testnum);
testclass2=mvnrnd(mu2,sigma2,testnum);
labeltrain = [ones(trainnum,1);zeros(trainnum,1)];
labeltest = [ones(testnum,1);zeros(testnum,1)];

% trainclass3=mvnrnd(mu3,sigma3,trainnum);
figure(1),
plot(trainclass1(:,1),trainclass1(:,2),'b+');hold on
plot(trainclass2(:,1),trainclass2(:,2),'r*');

hold on
train12= cat(1,trainclass1, trainclass2);
test12= cat(1,testclass1, testclass2);
plot(test12(1:20,1),test12(1:20,2),'bo');hold on
plot(test12(21:40,1),test12(21:40,2),'ro');


dist = sqrt((train12(:,1) * (-test12(:,1)')) .^ 2 + (train12(:,2) * (-test12(:,2)')).^ 2);
kk = 5;
knn = zeros(size(test12,1) , kk);
knnIndex = zeros(size(test12,1) , kk);
for i =1:size(test12,1)
[S I] = sortrows(dist, i);
knn(i,:) = S(i,1:kk);
knnIndex(i,:) = I(1:kk);
end
hold on

sum1=0;
sum2=0;
class1=zeros(size(test12,1) , 1);
class2=zeros(size(test12,1) , 1);

for k=1:size(test12,1)
for l=1:kk
if (knnIndex(k,l)<20)
class1(k)=knnIndex(k,l);
sum1=sum1+1; % baraye kelasse 1
else
sum2=sum2+1; % baraye kelass 2
class2(k)=knnIndex(k,l);
end
end
end

m3.moghadam
دوشنبه 03 آذر 1393, 22:35 عصر
يه مشكل ديگه هم كه دارم اينه كه مي خوام دقيق بدونم كدوم داده تست رقته توي كدوم كلاس!!:متفکر:
دارم ديوونه ميشم از دست اين ترم:گریه:اصلآ فك نمي كردم اينقدر پيچيده باشه...:عصبانی++:تازه اين قسمت اول تمرينه همين نمونه ها رو بايد با k-d treeهم كلاس بندي هاشون و دقت كار دوباره انجام بشه:گریه::ناراحت:

rahnema1
دوشنبه 03 آذر 1393, 22:40 عصر
ببخشید dist را اشتباه نوشته بودم confusionmatrix , perfcurve هم برای بررسی کارایی مدل هست

clc;
close all;
clear all;

trainnum=100;
testnum=20;
mu1=[2 0];
mu2=[-1 0];
sigma1=[1 0.5;0.5 1];
sigma2=[1 0.5;0.5 1.5];
classnum=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

trainclass1=mvnrnd(mu1,sigma1,trainnum);
trainclass2=mvnrnd(mu2,sigma2,trainnum);
testclass1=mvnrnd(mu1,sigma1,testnum);
testclass2=mvnrnd(mu2,sigma2,testnum);
labeltrain = [ones(trainnum,1);zeros(trainnum,1)];
labeltest = [ones(testnum,1);zeros(testnum,1)];

% trainclass3=mvnrnd(mu3,sigma3,trainnum);
figure(1),
plot(trainclass1(:,1),trainclass1(:,2),'b+');hold on
plot(trainclass2(:,1),trainclass2(:,2),'r*');


train12= cat(1,trainclass1, trainclass2);
test12= cat(1,testclass1, testclass2);

[col row] = meshgrid(1:size(test12, 1), 1:size(train12, 1));
dist = sqrt((train12(:,1)(row) - test12(:,1)(col)) .^ 2 + (train12(:,2)(row) - test12(:,2)(col)) .^ 2);
k = 5;
knn = zeros(size(test12,1) , k);
knnIndex = zeros(size(test12,1) , k);
for i =1:size(test12,1)
[S I] = sortrows(dist, i);
knn(i,:) = S(i,1:k);
knnIndex(i,:) = I(1:k);
end
figure

C = confusionmat(labeltest, labeltrain(knnIndex(:,1)))
[x,y,T,auc]=perfcurve(labeltest, labeltrain(knnIndex(:,1)),1)
hold on

mohsen6570
چهارشنبه 12 آذر 1393, 22:59 عصر
با سلام
دوستان خواهشا هرکی میتونه کمک کنه اخه متلب اصلا کار نکردم
استاد از ما برنامه خواسته:یکسری فایل دست نوشته اسامی شهرها هستن و orl کفته اینارو استخراج ویژگی انجام بدین و با روش knn -bayse-parzen جواب بدست بیارین مقایسه کنید performanso خواهشا هر کی کدشو داره کمک کنه
ممنونم