View Full Version : svm
hhamidy
پنج شنبه 21 اسفند 1393, 14:02 عصر
سلام.
کسی از دوستان در مورد احتمال پیش بینی SVM اطلاعی دارن؟
فکر می کنم با svmPredicste این پیش بینی انجام میشه ولی در مورد ورودی و خروجی برنامه ی من خطا داره.
ممکن هست راهنمایی بفرمایید؟
hhamidy
دوشنبه 31 فروردین 1394, 13:34 عصر
سلام.
من تابع زیر رو برای تعیین میزان پیش بینی svm از نت برداشتم:
function pred = svmPredict(model, X)
%SVMPREDICT returns a vector of predictions using a trained SVM model
%(svmTrain).
% pred = SVMPREDICT(model, X) returns a vector of predictions using a
% trained SVM model (svmTrain). X is a mxn matrix where there each
% example is a row. model is a svm model returned from svmTrain.
% predictions pred is a m x 1 column of predictions of {0, 1} values.
%
% Check if we are getting a column vector, if so, then assume that we only
% need to do prediction for a single example
if (size(X, 2) == 1)
% Examples should be in rows
X = X';
end
% Dataset
m = size(X, 1);
p = zeros(m, 1);
pred = zeros(m, 1);
if strcmp(func2str(model.kernelFunction), 'linearKernel')
% We can use the weights and bias directly if working with the
% linear kernel
p = X * model.w + model.b;
elseif strfind(func2str(model.kernelFunction), 'gaussianKernel')
% Vectorized RBF Kernel
% This is equivalent to computing the kernel on every pair of examples
X1 = sum(X.^2, 2);
X2 = sum(model.X.^2, 2)';
K = bsxfun(@plus, X1, bsxfun(@plus, X2, - 2 * X * model.X'));
K = model.kernelFunction(1, 0) .^ K;
K = bsxfun(@times, model.y', K);
K = bsxfun(@times, model.alphas', K);
p = sum(K, 2);
else
% Other Non-linear kernel
for i = 1:m
prediction = 0;
for j = 1:size(model.X, 1)
prediction = prediction + ...
model.alphas(j) * model.y(j) * ...
model.kernelFunction(X(i,:)', model.X(j,:)');
end
p(i) = prediction + model.b;
end
end
% Convert predictions into 0 / 1
pred(p >= 0) = 1;
pred(p < 0) = 0;
end
منتهای مراتب روال کارش رو متوجه نشدم که اگر بخوایم به جای X از ورودی اصلی رو به تست و ترین تقسیم کنیم چطور این تصمیم گیری انجام میشه؟!
ممکنه راهنمایی بفرمایید؟
rahnema1
دوشنبه 31 فروردین 1394, 22:34 عصر
سلام
ظاهرا شما یک فایل از یه کتابخانه را گرفتید
معمولا خود کتابخونه ها نحوه استفاده را داخلشون دارند
الان اینجا predict هست که یه چیزی به نام model می خواد که باید قبلا با دستورات دیگه ای از این کتابخونه ای که شما گرفتید ایجاد شده باشه
hhamidy
دوشنبه 31 فروردین 1394, 23:46 عصر
سلام
ظاهرا شما یک فایل از یه کتابخانه را گرفتید
معمولا خود کتابخونه ها نحوه استفاده را داخلشون دارند
الان اینجا predict هست که یه چیزی به نام model می خواد که باید قبلا با دستورات دیگه ای از این کتابخونه ای که شما گرفتید ایجاد شده باشه
سلام.
ممنون.
از این سایت دو تابع svmTrain و svmPredict رو دانلود کردم:
https://github.com/jcgillespie/Coursera-Machine-Learning/tree/master/ex6
و به این صورت ازش اجرا گرفتم:
البته نمیدونم درست هست یا نه:
model = svmTrain(Ytrain, Traininglabel, C, @linearKernel, 1, 20);
svmPredict(model,Ytest);
اما نتیجه فقط صفر رو نشون میده.یعنی به اندازه ی Ytest صفر پیش بینی شده!
rahnema1
سه شنبه 01 اردیبهشت 1394, 21:53 عصر
ذر همون آدرس توی سه تا فایل
ex6_spam.m
ex6.m
dataset3Params.m
مثالهایی زده که می تونید از اونها استفاده کنید
در کل هر تولباکس یا برنامه ای که باشه استفاده از مثالهای خودش خیلی راهگشا می تونه باشه
hhamidy
سه شنبه 01 اردیبهشت 1394, 22:19 عصر
ذر همون آدرس توی سه تا فایل
ex6_spam.m
ex6.m
dataset3Params.m
مثالهایی زده که می تونید از اونها استفاده کنید
در کل هر تولباکس یا برنامه ای که باشه استفاده از مثالهای خودش خیلی راهگشا می تونه باشه
ممنونم.
دیتای تصویری که استفاده می کنم رو وقتی با svmclassify و یا تولباکس متلب یا همون libsvm استفاده می کنم دقت پایینی بعد از اجرای برنامه حاصل میشه.(نهایتا 37%).
اما وقتی از کد خودم استفاده می کنم دقت بالای 95% هست.
اما برای مقایسه ی این طبقه بند با یه طبقه بند دیگه نیاز به این دارم که میزان احتمالی که این دو طبقه بند برای تخمین داده ها داشتن رو هم بدست بیارم تا هر کدوم احتمالش بالاتر بود اون داده به عنوان برچسب خروجی انتخاب بشه.(مثلا یه طبقه بند svm هست و یکی دیگه bayes که هر دو تصمیم میگیرن روی دیتامون و لیبل میزنن و بعد این دوتا نتیجه رو مقایسه می کنیم).
وقتی از کد خودم استفاده می کنم چون روال کار پیش بینی svm رو نمیدونم، نمیدونم به چه صورت میشه احتمال پیش بینی svm رو بدست آورد بخاطر همون خواستم با کمک این تابع در انتهای کد خودم میزان احتمال پاسخ رو هم پیش بینی کنم اما متاسفانه نمیدونم چطور میشه بکار گرفتش.
مطلب دیگه ای به ذهنتون نمی رسه یا فایل دیگه ای که جدا باشه و از توابع آماده ی متلب مثل svmpredicate نباشه؟
rahnema1
سه شنبه 01 اردیبهشت 1394, 22:50 عصر
یه سری مطالب داخل یه پست گذاشته بودم در مورد نحوه استفاده از libsvm
hhamidy
چهارشنبه 02 اردیبهشت 1394, 12:01 عصر
یه سری مطالب داخل یه پست گذاشته بودم در مورد نحوه استفاده از libsvm
درسته.
پیدا که نکردم(سرچ کردم این کلمه رو در سایت).
فقط اینو میشه بفرمایید:
من با libsvm و همین کد آماده که ازشون به صورت امتحانی استفاده کردم، predict_label_L ای که بدست آوردم شامل 0و1 هست(پروژه ی منم دو کلاسه هست یا 0 یا 1)و این predict_label_L احتمال بدست آوردن این نتیجه رو برنمیگردونه.
مثلا اینکه بگه با احتمال 0.9 این جواب حاصل شده.
در واقع این هم داره لیبل میزنه.
rahnema1
چهارشنبه 02 اردیبهشت 1394, 15:10 عصر
ببینید این libsvm یک خروجی داره به نام probability_estimates که باید این گزینه را فعال کنید تا احتمال را برای خروجی به شما بده
hhamidy
چهارشنبه 02 اردیبهشت 1394, 17:47 عصر
ببینید این libsvm یک خروجی داره به نام probability_estimates که باید این گزینه را فعال کنید تا احتمال را برای خروجی به شما بده
نمیدونم چطور باید فعالش کنم؟
توضیح دادین داخل لینکی که گذاشتین روی سایت؟
میفرمایید کدوم قسمته؟
rahnema1
چهارشنبه 02 اردیبهشت 1394, 20:38 عصر
این را به عنوان تمرین انجام بدید :)
راهنمایی: در مستندات و راهنمای libsvm جستجو کنید ( همچنین فایلهای m )
نتیجه را گزارش کنید ببینیم چیکار کردید
hhamidy
چهارشنبه 02 اردیبهشت 1394, 21:26 عصر
این را به عنوان تمرین انجام بدید :)
راهنمایی: در مستندات و راهنمای libsvm جستجو کنید ( همچنین فایلهای m )
نتیجه را گزارش کنید ببینیم چیکار کردید
یه همچین کدی منظورتونه؟:
svmtrain(Trainingsample, Traininglabel, '-b 1 -c <someCValue> -g <someGammaValue>');
[predLabels, classAccuracy, probEstimates] = svmpredict(Testingsample, Testinglabel, '-b 1');
................................
:
model file should be a struct array
rahnema1
چهارشنبه 02 اردیبهشت 1394, 22:19 عصر
یه همچین کدی منظورتونه؟:
svmtrain(Trainingsample, Traininglabel, '-b 1 -c <someCValue> -g <someGammaValue>');
[predLabels, classAccuracy, probEstimates] = svmpredict(Testingsample, Testinglabel, '-b 1');
................................
:
model file should be a struct array
آفرین!
فقط 1 را بردارید یا اینکه به جای اون 0 بذارید چون می خواهید طبقه بندی انجام بدید
hhamidy
چهارشنبه 02 اردیبهشت 1394, 22:52 عصر
[predLabels, classAccuracy, probEstimates]
آفرین!
فقط 1 را بردارید یا اینکه به جای اون 0 بذارید چون می خواهید طبقه بندی انجام بدید
1 پس چیکار می کنه؟
خطاشو بالا نوشتم دیگه:
model file should be a struct array
الان تمام این خروجیا خالین!:
[predLabels, classAccuracy, probEstimates]
قبلا این شکلی مینوشتم:
model_linear = svmtrain(train_label, train_data, '-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);
اون وقت تمام predict_label_L فقط یک نشون میداد و صفر اصلا نداشت.
dec_values_L هم تماما NaN بود.
چرا؟ میدونید؟
rahnema1
چهارشنبه 02 اردیبهشت 1394, 22:55 عصر
منظورم اینه که b 0 بذارید برای محاسبه احتمال دیگه
hhamidy
چهارشنبه 02 اردیبهشت 1394, 23:20 عصر
منظورم اینه که b 0 بذارید برای محاسبه احتمال دیگه
ممنون.
میگم که این خطا رو داره:
model file should be a struct array
همه ی خروجیام خالیه.
نمیدونید از چیه؟
rahnema1
چهارشنبه 02 اردیبهشت 1394, 23:30 عصر
ببخشید b 1 باید باشه
model = svmtrain(train_label, train_data, '-b 1');
[predict_label_L, accuracy_L, prob_estimates] = svmpredict(test_label, test_data, model,'-b 1');
hhamidy
چهارشنبه 02 اردیبهشت 1394, 23:38 عصر
ببخشید b 1 باید باشه
model = svmtrain(train_label, train_data, '-b 1');
[predict_label_L, accuracy_L, prob_estimates] = svmpredict(test_label, test_data, model,'-b 1');
بله ممنون.
فقط یکی اینکه چرا دو تا ستونه(منظورم پارامتر prob_estimates هست):
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
و...
و دیگه اینکه این پارامتر اول مربوط به چیه؟لیبل زدن؟چرا همش یک شده؟صفر نداره اصلا!
acc هم شده 17% خیلی کمه.در صورتیکه با کد من 95% جواب میده.
میدونید علت اینا چیه؟
ببخشید خیلی سوال می پرسم.
rahnema1
پنج شنبه 03 اردیبهشت 1394, 00:06 صبح
بله ممنون.
فقط یکی اینکه چرا دو تا ستونه(منظورم پارامتر prob_estimates هست):
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
و...
و دیگه اینکه این پارامتر اول مربوط به چیه؟لیبل زدن؟چرا همش یک شده؟صفر نداره اصلا!
acc هم شده 17% خیلی کمه.در صورتیکه با کد من 95% جواب میده.
میدونید علت اینا چیه؟
ببخشید خیلی سوال می پرسم.
الان من نمیدونم شما چه داده هایی استفاده می کنید
hhamidy
پنج شنبه 03 اردیبهشت 1394, 04:52 صبح
الان من نمیدونم شما چه داده هایی استفاده می کنید
سلام.
داده های من داده های عددی ساره ای هستن با یه ستون خروجیه 0 و1.
من سوالم اینه که چرا libsvm تو دوتا ستون پیش بینی میکنه.
خی مگه نباید تو یه ستون احتمال پیش بینیش رو بده مثلا بگه با احتمال 0.8 این بر چسب گذاری صورت گرفته.
دیگه اون ستون اولی چیه:
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
مهم نیست به نظرتون؟
rahnema1
پنج شنبه 03 اردیبهشت 1394, 11:07 صبح
چون دو تا کلاسه شاید اولی مربوط به احتمال کلاس اول و دومی مربوط به کلاس دومی باشه در غیر اینصورت همون ستون دومی را در نظر بگیرید
hhamidy
پنج شنبه 03 اردیبهشت 1394, 11:18 صبح
چون دو تا کلاسه شاید اولی مربوط به احتمال کلاس اول و دومی مربوط به کلاس دومی باشه در غیر اینصورت همون ستون دومی را در نظر بگیرید
بله فکر می کنم درسته.چون برای داده های فیشر امتحان کردم و سه ستون بدست اومد.
فقط الان یه بار دیگه اجرا گرفتم و این شد خروج:
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
و...
چطور میشه که تو تمام موارد احتمال بدست آوردن کلاس 0اش :
3.00000089999998e-14
واحتمال بدست آوردن کلاس1اش :
0.999999999999970 هست!
svm طبیعتا یه لیبل میزنه دیگه مثلا یه ستون خروجی داره که میگه داده ی اول مثلا للیبل اش 0 هست.
خب اینم با یه احتمالی گفته مثلا با احتمال 0.9 اون احتمال تک رو چطور بدست بیارم برای هر داده؟
یعنی یه ستون خروجی شامی 0 و1 داشته باشیم و یه ستون شامل احتمال پیش بینی همینا.
rahnema1
پنج شنبه 03 اردیبهشت 1394, 11:23 صبح
احتمالا مشکل از داده ها باشه یا ...
مگه واسه فیشر همه صفر یا یک شد؟
hhamidy
پنج شنبه 03 اردیبهشت 1394, 11:26 صبح
احتمالا مشکل از داده ها باشه یا ...
مگه واسه فیشر همه صفر یا یک شد؟
ببخشید واین منظورم بود(اونم سه کلاسه هست):
0.357898879749317 0.375239601471654 0.266861518779029
0.339190166259851 0.389998817554401 0.270811016185747
0.339190166246844 0.389998817569218 0.270811016183938
0.339190166283324 0.389998817536476 0.270811016180200
این احتمالش شده.
چرا این عددا تقریبا ثابتن برای هر ستون؟
با یه احتمال ثابت برای هر فیچر مثلا میگه مربوط به کلاسه 0 و...؟!
اگه بخوام یه ستون باشه که بگه با این احتمال مثلا جواب صفر رو نتیجه دادم باید چیکار کنم؟
میدونید من باید عددی که از این احتما بدست اومده رو مثلا برای یه فیچیر شده 0.9 بیام با احتمالی که یه طبقه یند دیگه میده مقایسه کنم و هر کدوم احتمالش بالاتر شده بود اون بشه لیبل کلاسم.
rahnema1
پنج شنبه 03 اردیبهشت 1394, 12:01 عصر
خب اینم با یه احتمالی گفته مثلا با احتمال 0.9 اون احتمال تک رو چطور بدست بیارم برای هر داده؟
یعنی یه ستون خروجی شامی 0 و1 داشته باشیم و یه ستون شامل احتمال پیش بینی همینا.
خب همین احتمال داده دیگه.
گفته مثلا داده مورد نظر به احتمال فلان به کلاس 1 تعلق داره به احتمال فلان به کلاس 2 و به احتمال فلان به کلاس 3 تعلق داره
hhamidy
پنج شنبه 03 اردیبهشت 1394, 12:33 عصر
خب همین احتمال داده دیگه.
گفته مثلا داده مورد نظر به احتمال فلان به کلاس 1 تعلق داره به احتمال فلان به کلاس 2 و به احتمال فلان به کلاس 3 تعلق داره
خب خروجی که میگیرم از این داده های خودم میشه:
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
3.00000089999998e-14 0.999999999999970
برای تمام سطر و ستونا همینه مثلا هر 113000 تا.
3.00000089999998e=0و 0.999999999999970=1 هست.
چطوری همه رو این شکلی احتمال میده.
ثابت؟
rahnema1
پنج شنبه 03 اردیبهشت 1394, 20:24 عصر
شاید لازم باشه داده ها اصلاح یا نرمال بشه
hhamidy
چهارشنبه 11 شهریور 1394, 19:25 عصر
سلام.
ممنون.
از این سایت دو تابع svmTrain و svmPredict رو دانلود کردم:
https://github.com/jcgillespie/Coursera-Machine-Learning/tree/master/ex6
و به این صورت ازش اجرا گرفتم:
البته نمیدونم درست هست یا نه:
model = svmTrain(Ytrain, Traininglabel, C, @linearKernel, 1, 20);
svmPredict(model,Ytest);
اما نتیجه فقط صفر رو نشون میده.یعنی به اندازه ی Ytest صفر پیش بینی شده!
من خیلی وقت پیش از این سایت یک سری تابع دانلود کرده بودم(svmTrain,svmPredicate,...) اون موقع یادمه که اجرا گرفتم و خطایی نداشت یعنی در نهایت مقدار احتمال رو به اندازه ی ورودیها نتیجه میگرفتم منتها برای هر ستون جدا احتمال محاسبه میشد برای svm.
الان متاسفانه برای همون دیتا ها امتحان میکنم و مدام خطا داره :Wrong number of arguments.
نمیدونم مشکل کجاست!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.