میشه کاری کرد که داده ها بین صفر تا یک قرار بگیرن یا مثلا بین -1 و 1 قرار بگیرن
طبقه بندی ترکیبی چیه؟
Printable View
میشه کاری کرد که داده ها بین صفر تا یک قرار بگیرن یا مثلا بین -1 و 1 قرار بگیرن
طبقه بندی ترکیبی چیه؟
من یه دستوی رو اجرا میکنم به این صورت :
[IDX,c,sumD]= kmeans(Train,numnode);
که که هیچ موقع c نباید تهی بشه.
میخوام یه شرط بذارم که اگه c تهی بود یا صفر بود دوباره این دستور رو اجرا کن وگرنه ادامه بده.
باید چیکار کنم؟
c=[];
while (numel(c)==0 || c==0)
[IDX,c,sumD]= kmeans(Train,numnode);
end
فکر نکنم خالی بمونه این را اجرا کنید تا مشخص بشه که سایزش خالی نیست
c=[];
while (numel(c)==0 || c==0)
[IDX,c,sumD]= kmeans(Train,numnode);
end
disp(c)
توی راهنمای متلب نگاه کنید یک گزینه وجود داره به نام emptyaction که اگه اون را روی drop تنظیم کنید کلاسترهای اضافی حذف میشن در غیر این صورت گزینه پیش فرض روی error تنظیم شده که خطا میده
IDX=[];
while (numel(unique(IDX))<numnode)
[IDX,c,sumD]= kmeans(Train,numnode, 'emptyaction','drop' );
end
من هم به شما ایمان دارم
اول به این آدرس یه نگاهی بیندازید. اگه به طور عادی نشد مجبورید با روشهای دیگه برید شاید تو هلپ متلب هم باشه
http://www.mathworks.com/help/stats/k-means-clustering.html
با تکرار میشه بهترین حالت را پیدا کرد. یعنی چند بار ( مثلا اینجا 5 بار) اجرا می کنیم و بهترین انتخاب می کنیم
sumD=[];
c={};
IDX={};
for i=1:5
IDX=[];
while (numel(unique(IDX))<numnode)
[IDX{i},c{i},sumD(i)]= kmeans(Train,numnode, 'emptyaction','drop' );
end
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};
میگه اون پیج وجود نداره.
برنامه رو اجرا میکنم این پیغام رو میده :
??? Comma separated list expansion has cell syntax for an array that
is not a cell.
Error in ==> rb12 at 48
[IDX{i},c{i},sumD(i)]= kmeans(Train,numnode,
'emptyaction','drop' );
به جای کاما، سمیکالن هم گذاشتم نشد.
sumD=[];
c={};
IDX={};
IDX0=[];
for i=1:5
IDX=[];
while (numel(unique(IDX0))<numnode)
[IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
end
IDX{i}=IDX0;
c{i}=c0;
sumD(i)=sumD0;
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};
c با numnode در ارتباطه.
پس اگه بخوام بهترین c رو انتخاب کنم باید numnode هم در بهترین حالت قرار داشته باشه دیگه.
درسته؟
sumD=[];
c={};
IDX={};
IDX0=[];
for i=1:5
IDX=[];
while (numel(unique(IDX0))<numnode)
[IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
end
IDX{i}=IDX0;
c{i}=c0;
sumD(i)=sum(sumD0);
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};
مرسی جواب داد.
تعداد centerها کمتر شد ولی انگار درصد specificity پایین تر اومد!
ربطی به numnode داره؟
اینو چطوری باید بهینه انتخاب کنم؟
ظاهرن تعداد numnode با cBest برابره.
خب اینطوری هرچی ما numnode رئ انتخاب کنیم همون میشه تعداد centerهامون دیگه!
اونوقت چطوری بهترین انتخاب میشه؟
حالا اگه بخوام سنترها رو پلات کنم یه مشکلی پیش میاد.
IDX بصورت سلول هست.
این دستور رو واسه پلات میدم :
plot(Train(IDX==1,1),Train(IDX==1,2),'.','Color',[1 0 0]);
hold on;
plot(Train(IDX==2,1),Train(IDX==2,2),'.','Color',[0 0.7 0]);
plot(Train(IDX==3,1),Train(IDX==3,2),'.','Color',[0 0 1]);
plot(c(:,1),c(:,2),'kx','MarkerSize',12,'LineWidth ',2);
plot(c(:,1),c(:,2),'ko','MarkerSize',12,'LineWidth ',2);
این پیغام رو میده :
??? Undefined function or method 'eq' for input arguments of type
'cell'.
Error in ==> rb12 at 61
plot(Train(IDX==1,1),Train(IDX==1,2),'.','Color',[1 0 0]);
تست نکردم اما مقادیر بهینه را پیدا می کنه
cBest={};
IDXBest={};
SumDbest=[];
for j=1:40
sumD=[];
c={};
IDX={};
IDX0=[];
numnode=j;
for i=1:5
IDX=[];
while (numel(unique(IDX0))<numnode)
[IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
end
IDX{i}=IDX0;
c{i}=c0;
sumD(i)=sum(sumD0);
end
SumDbest[j]=min(sumD);
indexbest=find(sumD==bestSum[j]);
cBest{j}=c{indexbest};
IDXBest{j}=IDX{indexbest};
end
indexbest=find(SumDbest==min(SumDbest));
c=cBest{indexbest};
IDX=IDXBest{indexbest};
numnode=indexbest;
disp(numnode)
برای این خط خطا میده :
SumDbest[j]=min(sumD);
خطا :
??? Error: File: rb13.m Line: 59 Column: 9
Unbalanced or unexpected parenthesis or bracket.
درصدهایی که میگیرم بطور میانگین به این صورته :
Mean of Sensitivity = 85.882353
Mean of specificity = 44.193548
Mean of accuracy = 66.000000
هنوز روی کلاس صفر مشکل دارم. خوب تشخیص نمیده!
یعنی چی روی کلاس صفر مشکل دارین؟
همون چیزی که توی پیام خصوصی گفتم. تعداد 65 نمونه داده ی تست دارم. وقتی شبکه آموزش دید حالا باید این داده های تست روی شبکه تست بشه. یه سری کلاس یک هستن یه سری کلاس صفر. وقتی تست شد باید این نمونه ها رو طبقه بندی کنه دیگه. ینی اونایی که به کلاس 1 تعلق دارند قرار بده در کلاس 1 و همچنین برای کلاس صفر.برنامه ی من به تعداد داده ای که در کلاس صفر قرار دارند فقط 40 درصدش رو درست تشخیص میده. بقیه رو اشتباهی میبره کلاس 1واسه همین sensitivity بالاست همش ولی specificity پایینه.منظورم رو رسوندم؟
من همزمان دارم رو دوتا برنامه RBF کار میکنم تا ببینم کدوم جواب بهتری میده.
اون برعکسه. تمام داده های تست رو میبره به کلاس صفر.
یعنی کلاً test output رو صفر میکنه.
مشکل اول اینه که شما داده های آموزش (TRR) و تست (TEE) رو تصادفی انتخاب کردین.
داده های آموزش و تست من همونی هستن که فراخونی میشن. نباید دست بخورن. چون از قبل تقسیم بندی شدن.
فقط موقعی که میخوایم کل داده ها رو یکجا به شبکه بدیم با هم توی یه ماتریسی به اسم inputs قرار میدیم.
من بر اساس B.5.xlsx و M.5.xlsx عمل کردم حالا داخل TrainData%d.xlsx و TestData%d.xlsx چی هست خدا می دونه
دستور roc رو کجای برنامه باید بنویسم؟
من B.5 و M.5 رو از قبل گرفتم با هم قاطی کردم. طوری که 60 درصد داده های B و M در TRR قرار گرفتن و بقیه در TEE که به ترتیب داده های آموزش و تست هستن. پس من الآن باید randperm رو حذف کنم دیگه! درسته؟
به همون صورت قبلی باید باشه :
TrInd=randperm(98);
TR=[TRR(TrInd(1:98),:)];
TeInd=randperm(65);
TE=[TEE(TeInd(1:65),:)];
inputs=[ TR(:,1:end-1); TE(:,1:end-1)]';
targets=[ TR(:,end); TE(:,end)]';
trainInputs = TR(:,1:end-1)';
trainTargets = TR(:,end)';
testInputs = TE(:,1:end-1)';
testTargets = TE(:,end)';
بقیه ی برنامه مشکل داره.
همون کدی که گذاشتم را روی b , m اعمال کن دیگه خیلی تغییر نده
این دستور هم وجود داره
[X,Y,T,AUC] = perfcurve(testTargets,testOutputs',1);
خب اینو میده. حالا منظورش چیه از این؟
من باید sensitivity و ... رو در بیارم.
area under curve= 0.532336
این مقدار از 0.5 شروع میشه تا 1
مقدار نیم یعنی طبقه بندی داغونه
اگه بالای 0.8 باشه خوبه
Input را فراموش کرده بودم
inputs=data(Indx,1:end-1);
نه . متاسفانه این به دردم نمیخوره.
معیار ارزیابی نتایج شبکه من باید همون سه تا پارامتر باشه.
مهندس! مشکل من همون testoutputs هست که همه رو صفر میده. یعنی همه در کلاس صفر قرار میگیرن و دلیلش اینه که اندیس هایی که برای داده های تست انتخاب کردیم اشتباست. ینی 99:163 نباید باشه. باید بگیم در ماتریس inputs اندیسهایی که برای داده های تست هستن.
من اینو نمیدونم چطوری بهش بفهمونم.
testOutputs = round(((outputs(:,99:163))));
این هم یک آموزش خوب
http://lab.fs.uni-lj.si/lasin/wp/IMI...eminar8.pdf
سلام مهندس. شرمنده. باز یه سوال :
چطوری میتونم بین سطرها همبستگی ایجاد کنم؟
وقتی جواب بهتری میگیرم ینی داره خوب تشخیص میده. در ضمن ، من که نمیخوام نرمالیزه کنم!
فقط میخوام تعداد سطرهایی که 95 درصد شبیه هم هستن رو حذف کنم.
حالا شما کدشو بگین چطوری میشه. امتحان کردنش ضرر نداره!
این حرف کاملا اشتباهه. اگه باور نمی کنی از استادت بپرس. عزیز من یه کم دقت کن می خواهی چی کار کنی. می خواهی داده ها را تغییر بدی تا مطابق میل شما جواب بده؟
اصلا چرا این کار می کنی؟ یه سری داده های الکی درست کن که جواب خوب بده. اگه بلد نیستی راهش را بلدم. بعدش این را به جای داده های اصلی جا بزن:)