ورود

View Full Version : اندازه گیری فاصله دو بردار



saeedheydari118
چهارشنبه 17 دی 1393, 14:41 عصر
سلام دوستان
ترور خدا کمک کنید
من میخوام اندازه بین دو بردار با استفاده از فاصله تکانه زمین EMD محاسبه کنم. فرمولش میدونم ولی نمیدو نم چطور تو متلب کدش کنم. خیلی سریع بهش نیاز دارم لطفا کمکم کنید. http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/RUBNER/img8.gif به این صورت که d برابر است با فاصله اقلیدسی و f هم 1- کسینوس بین دو بردار.

تروخدا دوستان سریع جواب بدین اگه بلدین

saeedheydari118
چهارشنبه 17 دی 1393, 14:55 عصر
راستی من یه کد واسه محاسبه emd تو اینترنت پیدا کردن از یه دانشکاه حارجی ولی هرچی نگاه میکنم نمیدونم چه ربطی به فورمل بالا داره.
کدش اینه:



function D = distEmd(X, Y)


Xcdf = cumsum(X,2);
Ycdf = cumsum(Y,2);


m = size(X,1); n = size(Y,1);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
ycdf = Ycdf(i,:);
ycdfRep = ycdf( mOnes, : );
D(:,i) = sum(abs(Xcdf - ycdfRep),2);
end

rahnema1
چهارشنبه 17 دی 1393, 18:35 عصر
سلام
اون فرمول که گذاشتید خودش چند تا مرحله قبلش داره برنامه اش طولانی میشه
این را ببینید:
http://www30.online-convert.com/download-file/73562d32433b31f81b35ba3c21642ca0/converted-ff1ae5dd.7z

saeedheydari118
چهارشنبه 17 دی 1393, 19:05 عصر
خیلی ممنون دوست عزیز.
این فایل دانلود کردم ولی باز نتونستم چیزی ازش در بیارم
حالا اون فرمول که اول دادم مگر چقدر طولانی میشه؟؟؟
کد دوم به نظر شما با فرمول اول مطابقت دارد؟

saeedheydari118
چهارشنبه 17 دی 1393, 19:14 عصر
کسی نیست جواب بده؟؟

rahnema1
چهارشنبه 17 دی 1393, 20:02 عصر
ببینید توضیحات و لینک برنامه در ویکی پدیا میتونید پیدا کنید
http://en.wikipedia.org/wiki/Earth_mover's_distance
داخل فایل زیپ برنامه ++c به فایل mex تبدیل شده که قابل استفاده در متلب هست
لطفا فایل readme.txt را بخونید که نحوه استفاده را توضیح داده
برنامه ++c هم شامل 850 خط کد میشه!

saeedheydari118
چهارشنبه 17 دی 1393, 21:05 عصر
ببینید توضیحات و لینک برنامه در ویکی پدیا میتونید پیدا کنید
http://en.wikipedia.org/wiki/Earth_mover's_distance
داخل فایل زیپ برنامه ++c به فایل mex تبدیل شده که قابل استفاده در متلب هست
لطفا فایل readme.txt را بخونید که نحوه استفاده را توضیح داده
برنامه ++c هم شامل 850 خط کد میشه!

ممنون دوست عزیز، من میخوام این معیار برای اندازه گیری تشابه بین اسناد متنی استفاده کنم و برای متن نحوه محاسبه اش مثل سوال اولی که مطرح کردم گفت. من فاصله کسینوسی و اقلیدسی دارم ولی نمیدونم چطور می شه تو متلب اون فورمل بنویسیم.

saeedheydari118
چهارشنبه 17 دی 1393, 22:03 عصر
دوستان هیچ کسی نیست به سوال من جواب بده؟؟؟؟؟
خواهش میکنم خیلی ضروریه؟؟

rahnema1
چهارشنبه 17 دی 1393, 22:10 عصر
فرمول شما اصلش اینجاست:
http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/RUBNER/emd.htm
این فایل زیپ هم بر اساس همینه که با برنامه ریزی خطی انجام شده
این لینک اصلی اون
www.mathworks.com/matlabcentral/fileexchange/downloads/6557
اگه دانلود نشد از اینجا:

http://www30.online-convert.com/download-file/292397c59156c0cb7e147223035ba2e5/converted-50dd407f.7z

saeedheydari118
چهارشنبه 17 دی 1393, 22:43 عصر
خیلی ازت مممنونم.
فایل دانلود کردم به نظر شما میشه این فایل برای اندازه گیری تشابه بین دو بردار به کار برد. چون برای اسناد متنی هر سند به یه بردار تبدیل می شه.

rahnema1
چهارشنبه 17 دی 1393, 22:51 عصر
من دقیقا نمیتونم نظر بدم واسه کاربرد شما اما توی مثالهایی که گذاشته به خوبی نشون داده فاصله بین دو بردار چطور محاسبه میشه
مثل فایل test

saeedheydari118
شنبه 27 دی 1393, 20:45 عصر
دوستان سلام
هنوز مشکلم حل نشده ترو خدا کمکم کنید:

دارم رو پیاده سازی پایان نامه ام کار میکنم و میخوام تشابه دو بردار با استفاده از معیار تکانه زمین محاسبه کنم emd.
دانشگاه کلمبیا یک کد واسه کحاسبه با استفاده از Emd ارائه کرده که هر چی مطالعه اش میکنم با فرمول اصلیش نمیخونه یا من متوجه نمی شم. خواهش میکنم کمکم کنید. سریع به جوابش نیاز دارم.
به پیوست فرمول براتون می فرستم و در پایین کد دانشگاه کلمبیا.
تروخدا اگه کسی میتونه کمکم کنه.
function D = distEmd( X, Y )Xcdf = cumsum(X,2);
Ycdf = cumsum(Y,2);m = size(X,1); n = size(Y,1);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
ycdf = Ycdf(i,:);
ycdfRep = ycdf( mOnes, : );
D(:,i) = sum(abs(Xcdf - ycdfRep),2);
endhttp://www.cs.columbia.edu/~mmerler/project/code/pdist2.m اینم آدرس سایت دانشگاه کلمبیا
فرمول اصلی بالا نوشتم

saeedheydari118
دوشنبه 29 دی 1393, 00:09 صبح
بچه ها ترو خدا کمکم کنید. کسی میتونه کد بالا چگونه به فرمول ربطش بدم؟؟؟؟؟

rahnema1
دوشنبه 29 دی 1393, 11:26 صبح
بچه ها ترو خدا کمکم کنید. کسی میتونه کد بالا چگونه به فرمول ربطش بدم؟؟؟؟؟

این مقاله را بخونید توی این توضیح داده https://www.math.ucdavis.edu/~saito/publications/saito_emdldb.pdf

saeedheydari118
دوشنبه 29 دی 1393, 23:25 عصر
ممنون دوست عزیزکه به سوالام پاسخ می دید. من از این کد متلبی که بالا آوردم استفاده کردم حالا مشکلم اینه که چطور به استادو توضیح بدم که این همون فرمول ؟؟؟؟
این کد رو هم از وب سایت دانشگاه کلمبیا آمریکا گرفتم فکر نکنم چیز الکی باشه. ممنون می شم اگه می تونید کمکم کنید.

rahnema1
سه شنبه 30 دی 1393, 06:06 صبح
ممنون دوست عزیزکه به سوالام پاسخ می دید. من از این کد متلبی که بالا آوردم استفاده کردم حالا مشکلم اینه که چطور به استادو توضیح بدم که این همون فرمول ؟؟؟؟
این کد رو هم از وب سایت دانشگاه کلمبیا آمریکا گرفتم فکر نکنم چیز الکی باشه. ممنون می شم اگه می تونید کمکم کنید.

ای عزیز من که نگفتم الکیه.ظاهرا مقاله را مطالعه نکردید!
شما تو همین pdf که فرستادم صفحه 5 را ببینید EMD را برای مواقعی که بعضی شرایط ( از جمله یک بعدی بودن هیستوگرام) برقرار باشه بدست آورده که فرمولش همینه که یک شکل ساده شده همون فرمول کلی هست که شما گذاشتید
البته اصل بدست آوردن EMD برای هیستوگرام یک بعدی در این منبع
ftp://cf.stanford.edu/cs/robotics/pub/rubner/thesis.pdf
در ص 29 قسمتی که نوشته one-dimensional EMD به همراه اثبات اومده که چطور فرمول کلی در حالت یک بعدی به این صورت در میاد

saeedheydari118
سه شنبه 30 دی 1393, 08:18 صبح
سلام خیلی ممنون که پیگیر هستید و به من کمک می کنید.
مقالات خوندم میدونم. ولی حرفم اینه که این کد که من استفاده کردم واسه محاسبه تشابه به نظر شما همین فرمول؟؟؟
این متوجه نمی شم که چهجوری بیام تطبیقش بدم با این توضیحات که تو فرمول اصلیش هستش؟؟

saeedheydari118
سه شنبه 30 دی 1393, 12:22 عصر
دوست عزیز اگه کمکم کنی یه دنیا ازت ممنون میشم. این مقالاتی که فرستادی مطالعه کردم که تو زمینه بازیابی تصاویر هستش ولی کار من محاسبه تشابه بین اسناد متنی هستش که وقتی پیش بردازش میشن هر سندی به یه بردار تبدیل میشن. من برای اندازه گیری اومدم اون کد متلبی که بالا آوردم استفاده کردم حالل چون زیاد متلب کار نکردم نمیدونم با این فرمول که تو مقالات آورده شده تطبیق میکنه.
درضمن من مقالاتی که برای متن بوده مطالعه کردم و لی مشکل الان این کد متلب که دقیقا چی گفته هستش؟؟؟؟
لطفا کمک کن که به جواب برسم. بی صبرانه منتظر جوابت هستم.
با تشکر

rahnema1
سه شنبه 30 دی 1393, 23:10 عصر
اون منبع دوم ( پایان نامه) که معرفی کردم نویسنده اش شخصی هست به نام Rubner که خودش مخترع emd هست. در واقع در این پایان نامه به معرفی این روش و کاربردش پرداخته . ص 29 هیچ ربطی به پردازش تصویر نداره همون مفهوم تئوری را گفته و بعدش اثبات را آورده که چه جوری اون دو تا به هم ربط پیدا می کنند
شما در تحقیقتون کافیه مطالب ص 29 را با ذکر منبع بیارید و لازم نیست خودتون در مقاله تون اون را اثبات کنید

saeedheydari118
چهارشنبه 01 بهمن 1393, 07:32 صبح
سلام
ممنون دوست عزیز.
یعنی این کد متلبی که استفاده کردم درسته؟؟؟ این برای من سوال شده؟ مطلبی که فرمودی مطالعه کردم مشکل اصلی ام با کد متلب هستش که آیا میشه گفت همین فرمول emd هستش یا نه؟؟

rahnema1
چهارشنبه 01 بهمن 1393, 07:39 صبح
سلام
ممنون دوست عزیز.
یعنی این کد متلبی که استفاده کردم درسته؟؟؟ این برای من سوال شده؟ مطلبی که فرمودی مطالعه کردم مشکل اصلی ام با کد متلب هستش که آیا میشه گفت همین فرمول emd هستش یا نه؟؟

درسته دیگه. این کد emd برای حالتیه که هیستوگرام یا singnature یک بعدی باشه

این فرمول emd می باشد

saeedheydari118
چهارشنبه 01 بهمن 1393, 21:37 عصر
خیلی ممنون دوست عزیز که بهم کمک کردی.
نمیدونم فکر کنم اشتباه کردم.آخه من یه ماتریس دارم که هر سطرش به عنوان یه سند و ستون هاش کلماتی که در سند هستن البته وزنشون که میشه همون تکرار کلمه در هر سند.
به نظرت میشه به عنوان یه بعدی در نظر گرفت؟؟؟؟

rahnema1
پنج شنبه 02 بهمن 1393, 07:43 صبح
خیلی ممنون دوست عزیز که بهم کمک کردی.
نمیدونم فکر کنم اشتباه کردم.آخه من یه ماتریس دارم که هر سطرش به عنوان یه سند و ستون هاش کلماتی که در سند هستن البته وزنشون که میشه همون تکرار کلمه در هر سند.
به نظرت میشه به عنوان یه بعدی در نظر گرفت؟؟؟؟

در واقع هر سطر از ماتریس شما یک هیستوگرام یک بعدی را تشکیل میده
مثلا اگه ماتریس شما X باشه ماتریس فاصله را اینطور بدست بیارید
D = distEmd( X, X );
یا
D = pdist2( X, X, 'emd' );

saeedheydari118
پنج شنبه 02 بهمن 1393, 07:59 صبح
سلام صبحتون بخیر
ماتریس من اینجوریه که هر سطرش یه سند که ستون هاش تکرار کلمات در سند شنان میده حالا من با این کد اومدم فاصله بین اسناد که میشه سطرهای ماتریس بدست آوردم.
پس یعنی الان یعنی ماتریس یه بعدی؟؟؟
پس استفاده از این تیکه کد و فرمولی که شما اشاره کردین بهش درسته؟؟

rahnema1
پنج شنبه 02 بهمن 1393, 08:06 صبح
سلام صبحتون بخیر
ماتریس من اینجوریه که هر سطرش یه سند که ستون هاش تکرار کلمات در سند شنان میده حالا من با این کد اومدم فاصله بین اسناد که میشه سطرهای ماتریس بدست آوردم.
پس یعنی الان یعنی ماتریس یه بعدی؟؟؟

سلام
فرمولش را که براتون نوشتم
هر سطر هیستوگرام یک بعدی هست



پس استفاده از این تیکه کد و فرمولی که شما اشاره کردین بهش درسته؟؟

با اجازه بزرگترا بـــــــــــــــــــــله

saeedheydari118
پنج شنبه 02 بهمن 1393, 08:13 صبح
خیلی ممنون دوست عزیز.
باور کن از هرکی که فکرش کنید پرسیدم ولی کسی جواب نداد. چه داخل چه خارج کشور. یک دنیا ازتون ممنونم.
تنها چیزی که برام ابهام بود اینه که وقتی یه سند ما به عنوان سطر ماتریس و ستون هاش کلمات موجود در سند که مثلا هر ستون به این صورت که کلمه 1 مثلا وزن 4 داره و همینطور تا کلمه آخر حالا چطور بگیم هر سطرش یه هیستوگرام یه بعدی؟؟

rahnema1
پنج شنبه 02 بهمن 1393, 08:39 صبح
ببینید این شکل یک هیستوگرام دو بعدیه:
http://www.sharefile.ir/uploads/1421986683.jpg
اما هیستوگرام یک بعدی به صورت یک منحنی نشون داده میشه

saeedheydari118
دوشنبه 06 بهمن 1393, 18:44 عصر
سلام راهنمای عزیز، اگه مزاحم نباشم یه سوال از خدمتت دارم.
تابع rng('default'); تو متلب دقیق کارش چیه؟؟
من وقتی با k-means خوشه بندی انجام میدم هر بار نتایج مختلفی میده و لی هر بار که قبلش از این تابع استفاده میکنم نتایج تو هر بار تکرار یکشان.
خواهش میکنم اگه کار تابع می دونید واضح برام توضیح بدی.
خیلی ممنون

rahnema1
دوشنبه 06 بهمن 1393, 20:44 عصر
سلام راهنمای عزیز، اگه مزاحم نباشم یه سوال از خدمتت دارم.
تابع rng('default'); تو متلب دقیق کارش چیه؟؟
من وقتی با k-means خوشه بندی انجام میدم هر بار نتایج مختلفی میده و لی هر بار که قبلش از این تابع استفاده میکنم نتایج تو هر بار تکرار یکشان.
خواهش میکنم اگه کار تابع می دونید واضح برام توضیح بدی.
خیلی ممنون

سلام
در الگوریتم k-means در ابتدا لازمه تعدادی از داده ها به عنوان مرکز خوشه انتخاب بشن که انتخاب اونها به صورت رندوم هست بنابراین الگوریتم k-means به تولید کننده اعداد تصادفی بستگی داره
تولید اعداد تصادفی با استفاده از یک سری الگوریتم انجام میشه که این الگوریتمها برای اینکه یک عدد تصادفی ایجاد کنند نیاز به یک ورودی به نام seed دارند
اگر در دو دفعه مختلف دو تا seed یکسان به الگوریتم تولید کننده عدد تصادفی بدهیم اعداد تصادفی تولید شده یکسان خواهند بود. در واقع وقتی شما از rng(default استفاده می کنید seed را برابر با صفر قرار می دهید
اما به طور معمول برای seed از «زمان سیستم» استفاده میشه بنابراین هر وقت الگوریتم اجرا میشه اعداد متفاوت تولید می کنه

saeedheydari118
دوشنبه 06 بهمن 1393, 22:45 عصر
خیلی ممنون دوست عزیز. پس نتایج الگوریتم k-meams خیلی بستگی به ایم seed اولیه داره. به نظر شما برای اینکه نتیجه مطلوب بگیرم درست بیام چند بار الگوریتم اجرا کنم و بعد میانگین نتایج بدست بیارم؟؟؟
اگر پیشنهادی دارین لطفا بهم بگین ممنون می شم!!!

rahnema1
سه شنبه 07 بهمن 1393, 07:03 صبح
همین طور که اشاره کردید تکرار میتونه راه حل خوبی باشه. برای تابع kmeans متلب گزینه Replicates گذاشته شده که چندین بار الگوریتم با مقادیر اولیه مختلف اجرا میشه و نهایتا بهترین نتیجه انتخاب میشه
اما یک روش دیگه که جواب یکتا میده اسمش هست( Single Pass Seed Selection (SPSS
که در این pdf توضیح داده شده:
http://thescipub.com/PDF/jcssp.2010.60.66.pdf

saeedheydari118
سه شنبه 07 بهمن 1393, 07:09 صبح
سلام صبح بخیر.
چطور می تونم از replicates که فرمودین استفاده کنم.

rahnema1
سه شنبه 07 بهمن 1393, 07:18 صبح
سلام
در هلپ متلب هم توضیح داده که مثلا 5 بار بخواد تکرار بشه این گزینه را هم به گزینه های تابع kmeans اضافه کنید
'Replicates',5

saeedheydari118
سه شنبه 07 بهمن 1393, 07:59 صبح
راهنمای عزیز من هر کاری کردم خطا میده.فایل کامل پروژه ام براتون می فرستم. خواهش میکنم کمکم کن. من تو پایان نامه ام معیار فاصله تکانه زمین با 3 معیار دیگه مقایسه کردم ولی هر بار یه نتیجه میده ولی طبق کارایی که خوندم گفته از معیارهای دیگه بهتره الان جواب نمیگیرم و یه هفته دیگه دفاع دارم خواهش میکنم کمک کن.
چطور فایل خصوصی برات بفرستم؟؟؟

rahnema1
سه شنبه 07 بهمن 1393, 08:21 صبح
راهنمای عزیز من هر کاری کردم خطا میده.فایل کامل پروژه ام براتون می فرستم. خواهش میکنم کمکم کن. من تو پایان نامه ام معیار فاصله تکانه زمین با 3 معیار دیگه مقایسه کردم ولی هر بار یه نتیجه میده ولی طبق کارایی که خوندم گفته از معیارهای دیگه بهتره الان جواب نمیگیرم و یه هفته دیگه دفاع دارم خواهش میکنم کمک کن.
چطور فایل خصوصی برات بفرستم؟؟؟

نمیدونم چه خطایی میده در هر صورت فایل را به صورت زیپ یه جایی مثل لینک زیر آپلود کنید و لینکش را پیام خصوصی کنید
http://www.sharefile.ir

saeedheydari118
سه شنبه 07 بهمن 1393, 18:14 عصر
سلام
فایل برات پیام خصوصی کردم. بیزحمت نگاه کن. بی صبرانه منتظر جوابت هستم

saeedheydari118
چهارشنبه 08 بهمن 1393, 07:13 صبح
سلام صبح بخیر
راهنمای عزیز فایل به دستت رسید؟؟؟

saeedheydari118
چهارشنبه 08 بهمن 1393, 07:42 صبح
اینم خروجی تا قبل از الگوریتم خوشه بندی.
فقط این فایل به عنوان ورودی به الگوریتم k-means بدید.
با تشکر
http://www.sharefile.ir/uploads/1422514079.zip

saeedheydari118
چهارشنبه 08 بهمن 1393, 07:44 صبح
دوست عزیز لطفا تو فایل K-MENS ببین موقعی که EMD فذاخوانی میشه دستورش درسته؟؟

saeedheydari118
چهارشنبه 08 بهمن 1393, 07:56 صبح
ببخشید من چون اسمت نمیدونم از لفظ راهنما استفاده میکنم.
دوست عزیز فکر کنم ایراد کار من اینه که فرمول emd برای یه بعدی بکار بردم. که اشتباه، به نظر شما ماتریس که الان داریم یه بعدی؟؟
یا باید از فرمول چند بعدی emd استفاده کنیم.

rahnema1
چهارشنبه 08 بهمن 1393, 09:02 صبح
لطفا فایل kmeans اصلی دستکاری نشده را بفرستید

rahnema1
چهارشنبه 08 بهمن 1393, 19:23 عصر
نحوه استفاده از برنامه ای که در زیر میاد به این صورته:

rng('default');
[T1,C1] = Repkmeans(V1, nClass, 'emd', 5);
rng('default');
[T2,C2] = Repkmeans(V1, nClass, 'cosine', 5);

5 تعداد تکرار هست و همین طور که مشاهده می کنید قبل از اجرا هر kmeans مقدار rng را برابر default و یا یک عدد یکسان مثلا 2456 قرار بدید تا شرایط برای همه یکسان باشه همچنین خود متلب هم یک تابع به نام pdist2 داره که انواع و اقسام فاصله ها در اون هست که می تونید در اینجا از نام اونها استفاده کنید

function [labels , mu]=Repkmeans(data, k, distType,replicates)

[labels,mu, sumd]= mykmeans(data, k, distType);
if (replicates > 1)
for i = 2:replicates
[labelstemp,mutemp, sumdtemp]= mykmeans(data, k, distType);
if (sumdtemp < sumd)
sumd = sumdtemp;
labels = labelstemp;
mu = mutemp;
end
end
end
end
function [labels,mu, sumd]=mykmeans(data, k, distType)
data = double(data);
labels =uint8(zeros(size(data ,1) ,1));
uniqvals = unique(data,'rows');
randomindex = randperm(size(uniqvals, 1));
mu = uniqvals(randomindex(1:k),:);
mutemp = zeros(size(mu));
while (true)
minDistance = pdist3(data , mu(1, :),distType);
labels(:) = 1;
for i = 2: k
tempDistance = pdist3(data , mu(i, :), distType);
ans1 = minDistance < tempDistance;
labels = uint8(ans1) .* labels + uint8(~ans1) .* i ;
minDistance = min (minDistance, tempDistance);
end
for i = 1: k
mutemp(i,:) = mean(data(labels == i, :), 1);
end
if (all(mu == mutemp))
sumd= sum(minDistance(:));
break;
end
mu = mutemp;
end
end
function result = pdist3(X , Y , distType)
if(distType == 'emd')
result = distEmd (X , Y);
else
result = pdist2(X , Y , distType);
end
end

function D = distEmd( X, Y )

Xcdf = cumsum(X,2);
Ycdf = cumsum(Y,2);

m = size(X,1); n = size(Y,1);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
ycdf = Ycdf(i,:);
ycdfRep = ycdf( mOnes, : );
D(:,i) = sum(abs(Xcdf - ycdfRep),2);
end
end

rahnema1
چهارشنبه 08 بهمن 1393, 19:51 عصر
چند تا اصلاح کردم