سلام.
کسی از دوستان در مورد احتمال پیش بینی SVM اطلاعی دارن؟
فکر می کنم با svmPredicste این پیش بینی انجام میشه ولی در مورد ورودی و خروجی برنامه ی من خطا داره.
ممکن هست راهنمایی بفرمایید؟
سلام.
کسی از دوستان در مورد احتمال پیش بینی SVM اطلاعی دارن؟
فکر می کنم با svmPredicste این پیش بینی انجام میشه ولی در مورد ورودی و خروجی برنامه ی من خطا داره.
ممکن هست راهنمایی بفرمایید؟
سلام.
من تابع زیر رو برای تعیین میزان پیش بینی 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 از ورودی اصلی رو به تست و ترین تقسیم کنیم چطور این تصمیم گیری انجام میشه؟!
ممکنه راهنمایی بفرمایید؟
سلام
ظاهرا شما یک فایل از یه کتابخانه را گرفتید
معمولا خود کتابخونه ها نحوه استفاده را داخلشون دارند
الان اینجا predict هست که یه چیزی به نام model می خواد که باید قبلا با دستورات دیگه ای از این کتابخونه ای که شما گرفتید ایجاد شده باشه
سلام.
ممنون.
از این سایت دو تابع svmTrain و svmPredict رو دانلود کردم:
https://github.com/jcgillespie/Cours...ree/master/ex6
و به این صورت ازش اجرا گرفتم:
البته نمیدونم درست هست یا نه:
model = svmTrain(Ytrain, Traininglabel, C, @linearKernel, 1, 20);
svmPredict(model,Ytest);
اما نتیجه فقط صفر رو نشون میده.یعنی به اندازه ی Ytest صفر پیش بینی شده!
آخرین ویرایش به وسیله hhamidy : سه شنبه 01 اردیبهشت 1394 در 11:51 صبح
ذر همون آدرس توی سه تا فایل
ex6_spam.m
ex6.m
dataset3Params.m
مثالهایی زده که می تونید از اونها استفاده کنید
در کل هر تولباکس یا برنامه ای که باشه استفاده از مثالهای خودش خیلی راهگشا می تونه باشه
ممنونم.
دیتای تصویری که استفاده می کنم رو وقتی با svmclassify و یا تولباکس متلب یا همون libsvm استفاده می کنم دقت پایینی بعد از اجرای برنامه حاصل میشه.(نهایتا 37%).
اما وقتی از کد خودم استفاده می کنم دقت بالای 95% هست.
اما برای مقایسه ی این طبقه بند با یه طبقه بند دیگه نیاز به این دارم که میزان احتمالی که این دو طبقه بند برای تخمین داده ها داشتن رو هم بدست بیارم تا هر کدوم احتمالش بالاتر بود اون داده به عنوان برچسب خروجی انتخاب بشه.(مثلا یه طبقه بند svm هست و یکی دیگه bayes که هر دو تصمیم میگیرن روی دیتامون و لیبل میزنن و بعد این دوتا نتیجه رو مقایسه می کنیم).
وقتی از کد خودم استفاده می کنم چون روال کار پیش بینی svm رو نمیدونم، نمیدونم به چه صورت میشه احتمال پیش بینی svm رو بدست آورد بخاطر همون خواستم با کمک این تابع در انتهای کد خودم میزان احتمال پاسخ رو هم پیش بینی کنم اما متاسفانه نمیدونم چطور میشه بکار گرفتش.
مطلب دیگه ای به ذهنتون نمی رسه یا فایل دیگه ای که جدا باشه و از توابع آماده ی متلب مثل svmpredicate نباشه؟
یه سری مطالب داخل یه پست گذاشته بودم در مورد نحوه استفاده از libsvm
درسته.
پیدا که نکردم(سرچ کردم این کلمه رو در سایت).
فقط اینو میشه بفرمایید:
من با libsvm و همین کد آماده که ازشون به صورت امتحانی استفاده کردم، predict_label_L ای که بدست آوردم شامل 0و1 هست(پروژه ی منم دو کلاسه هست یا 0 یا 1)و این predict_label_L احتمال بدست آوردن این نتیجه رو برنمیگردونه.
مثلا اینکه بگه با احتمال 0.9 این جواب حاصل شده.
در واقع این هم داره لیبل میزنه.
ببینید این libsvm یک خروجی داره به نام probability_estimates که باید این گزینه را فعال کنید تا احتمال را برای خروجی به شما بده
این را به عنوان تمرین انجام بدید :)
راهنمایی: در مستندات و راهنمای libsvm جستجو کنید ( همچنین فایلهای m )
نتیجه را گزارش کنید ببینیم چیکار کردید
[predLabels, classAccuracy, probEstimates]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 بود.
چرا؟ میدونید؟
منظورم اینه که b 0 بذارید برای محاسبه احتمال دیگه
ببخشید 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% جواب میده.
میدونید علت اینا چیه؟
ببخشید خیلی سوال می پرسم.
سلام.
داده های من داده های عددی ساره ای هستن با یه ستون خروجیه 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
مهم نیست به نظرتون؟
چون دو تا کلاسه شاید اولی مربوط به احتمال کلاس اول و دومی مربوط به کلاس دومی باشه در غیر اینصورت همون ستون دومی را در نظر بگیرید
بله فکر می کنم درسته.چون برای داده های فیشر امتحان کردم و سه ستون بدست اومد.
فقط الان یه بار دیگه اجرا گرفتم و این شد خروج:
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 داشته باشیم و یه ستون شامل احتمال پیش بینی همینا.
آخرین ویرایش به وسیله hhamidy : پنج شنبه 03 اردیبهشت 1394 در 11:25 صبح دلیل: 111
احتمالا مشکل از داده ها باشه یا ...
مگه واسه فیشر همه صفر یا یک شد؟
ببخشید واین منظورم بود(اونم سه کلاسه هست):
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 بیام با احتمالی که یه طبقه یند دیگه میده مقایسه کنم و هر کدوم احتمالش بالاتر شده بود اون بشه لیبل کلاسم.
خب خروجی که میگیرم از این داده های خودم میشه:
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 هست.
چطوری همه رو این شکلی احتمال میده.
ثابت؟
من خیلی وقت پیش از این سایت یک سری تابع دانلود کرده بودم(svmTrain,svmPredicate,...) اون موقع یادمه که اجرا گرفتم و خطایی نداشت یعنی در نهایت مقدار احتمال رو به اندازه ی ورودیها نتیجه میگرفتم منتها برای هر ستون جدا احتمال محاسبه میشد برای svm.
الان متاسفانه برای همون دیتا ها امتحان میکنم و مدام خطا داره :Wrong number of arguments.
نمیدونم مشکل کجاست!