# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  اندازه گیری فاصله دو بردار

## saeedheydari118

سلام دوستان
ترور خدا کمک کنید
من میخوام اندازه بین دو بردار با استفاده از فاصله تکانه زمین EMD محاسبه کنم. فرمولش میدونم ولی نمیدو نم چطور تو متلب کدش کنم. خیلی سریع بهش نیاز دارم لطفا کمکم کنید.    به این صورت که d برابر است با فاصله اقلیدسی و f هم 1- کسینوس بین دو بردار.

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

----------


## saeedheydari118

راستی من یه کد واسه محاسبه 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

سلام
اون فرمول که گذاشتید خودش چند تا مرحله قبلش داره برنامه اش طولانی میشه
این را ببینید:
http://www30.online-convert.com/down...ed-ff1ae5dd.7z

----------


## saeedheydari118

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

----------


## saeedheydari118

کسی نیست جواب بده؟؟

----------


## rahnema1

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

----------


## saeedheydari118

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


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

----------


## saeedheydari118

دوستان هیچ کسی نیست به سوال من جواب بده؟؟؟؟؟
خواهش میکنم خیلی ضروریه؟؟

----------


## rahnema1

فرمول شما اصلش اینجاست:
http://homepages.inf.ed.ac.uk/rbf/CV...RUBNER/emd.htm
این فایل زیپ هم بر اساس همینه که با برنامه ریزی خطی انجام شده
این لینک اصلی اون
http://www.mathworks.com/matlabcentr...downloads/6557
اگه دانلود نشد از اینجا:

http://www30.online-convert.com/down...ed-50dd407f.7z

----------


## saeedheydari118

خیلی ازت مممنونم.
فایل دانلود کردم به نظر شما میشه این فایل برای اندازه گیری تشابه بین دو بردار به کار برد. چون برای اسناد متنی هر سند به یه بردار تبدیل می شه.

----------


## rahnema1

من دقیقا نمیتونم نظر بدم واسه کاربرد شما اما توی  مثالهایی که گذاشته به خوبی نشون داده فاصله بین دو بردار چطور محاسبه میشه
مثل فایل test

----------


## saeedheydari118

دوستان سلام
هنوز مشکلم حل نشده ترو خدا کمکم کنید:
دارم رو پیاده سازی پایان نامه ام کار میکنم و میخوام تشابه دو بردار با استفاده از معیار تکانه زمین محاسبه کنم 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/.../code/pdist2.m اینم آدرس سایت دانشگاه کلمبیا
فرمول اصلی بالا نوشتم

----------


## saeedheydari118

بچه ها ترو خدا کمکم کنید. کسی میتونه کد بالا چگونه به فرمول ربطش بدم؟؟؟؟؟

----------


## rahnema1

> بچه ها ترو خدا کمکم کنید. کسی میتونه کد بالا چگونه به فرمول ربطش بدم؟؟؟؟؟


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

----------


## saeedheydari118

ممنون دوست عزیزکه به سوالام پاسخ می دید. من از این کد متلبی که بالا آوردم استفاده کردم حالا مشکلم اینه که چطور به استادو توضیح بدم که این همون فرمول ؟؟؟؟
این کد رو هم از وب سایت دانشگاه کلمبیا آمریکا گرفتم فکر نکنم چیز الکی باشه. ممنون می شم اگه می تونید کمکم کنید.

----------


## rahnema1

> ممنون دوست عزیزکه به سوالام پاسخ می دید. من از این کد متلبی که بالا آوردم استفاده کردم حالا مشکلم اینه که چطور به استادو توضیح بدم که این همون فرمول ؟؟؟؟
> این کد رو هم از وب سایت دانشگاه کلمبیا آمریکا گرفتم فکر نکنم چیز الکی باشه. ممنون می شم اگه می تونید کمکم کنید.


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

----------


## saeedheydari118

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

----------


## saeedheydari118

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

----------


## rahnema1

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

----------


## saeedheydari118

سلام
ممنون دوست عزیز.
یعنی این کد متلبی که استفاده کردم درسته؟؟؟ این برای من سوال شده؟ مطلبی که فرمودی مطالعه کردم مشکل اصلی ام با کد متلب هستش که آیا میشه گفت همین فرمول emd هستش یا نه؟؟

----------


## rahnema1

> سلام
> ممنون دوست عزیز.
> یعنی این کد متلبی که استفاده کردم درسته؟؟؟ این برای من سوال شده؟ مطلبی که فرمودی مطالعه کردم مشکل اصلی ام با کد متلب هستش که آیا میشه گفت همین فرمول emd هستش یا نه؟؟


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

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

----------


## saeedheydari118

خیلی ممنون دوست عزیز که بهم کمک کردی.
نمیدونم فکر کنم اشتباه کردم.آخه من یه ماتریس دارم که هر سطرش به عنوان یه سند و ستون هاش کلماتی که در سند هستن البته وزنشون که میشه همون تکرار کلمه در هر سند.
به نظرت میشه به عنوان یه بعدی در نظر گرفت؟؟؟؟

----------


## rahnema1

> خیلی ممنون دوست عزیز که بهم کمک کردی.
> نمیدونم فکر کنم اشتباه کردم.آخه من یه ماتریس دارم که هر سطرش به عنوان یه سند و ستون هاش کلماتی که در سند هستن البته وزنشون که میشه همون تکرار کلمه در هر سند.
> به نظرت میشه به عنوان یه بعدی در نظر گرفت؟؟؟؟


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

----------


## saeedheydari118

سلام صبحتون بخیر
ماتریس من اینجوریه که هر سطرش یه سند که ستون هاش تکرار کلمات در سند شنان میده حالا من با این کد اومدم فاصله بین اسناد که میشه سطرهای ماتریس بدست آوردم. 
پس یعنی الان یعنی ماتریس یه بعدی؟؟؟
پس استفاده از این تیکه کد و فرمولی که شما اشاره کردین بهش درسته؟؟

----------


## rahnema1

> سلام صبحتون بخیر
> ماتریس من اینجوریه که هر سطرش یه سند که ستون هاش تکرار کلمات در سند شنان میده حالا من با این کد اومدم فاصله بین اسناد که میشه سطرهای ماتریس بدست آوردم. 
> پس یعنی الان یعنی ماتریس یه بعدی؟؟؟


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




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


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

----------


## saeedheydari118

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

----------


## rahnema1

ببینید این شکل یک هیستوگرام دو بعدیه:
http://www.sharefile.ir/uploads/1421986683.jpg
اما هیستوگرام یک بعدی به صورت یک منحنی نشون داده میشه

----------


## saeedheydari118

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

----------


## rahnema1

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


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

----------


## saeedheydari118

خیلی ممنون دوست عزیز. پس نتایج الگوریتم k-meams  خیلی بستگی به ایم seed اولیه داره. به نظر شما برای اینکه نتیجه مطلوب بگیرم درست بیام چند بار الگوریتم اجرا کنم و بعد میانگین نتایج بدست بیارم؟؟؟
اگر پیشنهادی دارین لطفا بهم بگین ممنون می شم!!!

----------


## rahnema1

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

----------


## saeedheydari118

سلام صبح بخیر.
چطور می تونم از replicates که فرمودین استفاده کنم.

----------


## rahnema1

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

----------


## saeedheydari118

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

----------


## rahnema1

> راهنمای عزیز من هر کاری کردم خطا میده.فایل کامل پروژه ام براتون می فرستم. خواهش میکنم کمکم کن. من تو پایان نامه ام معیار فاصله تکانه زمین با 3 معیار دیگه مقایسه کردم ولی هر بار یه نتیجه میده ولی طبق کارایی که خوندم گفته از معیارهای دیگه بهتره الان جواب نمیگیرم و یه هفته دیگه دفاع دارم خواهش میکنم کمک کن.
> چطور فایل خصوصی برات بفرستم؟؟؟


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

----------


## saeedheydari118

سلام 
فایل برات پیام خصوصی کردم. بیزحمت نگاه کن. بی صبرانه منتظر جوابت هستم

----------


## saeedheydari118

سلام  صبح بخیر
راهنمای عزیز فایل به دستت رسید؟؟؟

----------


## saeedheydari118

اینم خروجی تا قبل از الگوریتم خوشه بندی.
فقط این فایل به عنوان ورودی به الگوریتم k-means بدید.
با تشکر 
http://www.sharefile.ir/uploads/1422514079.zip

----------


## saeedheydari118

دوست عزیز لطفا تو فایل K-MENS ببین موقعی که EMD فذاخوانی میشه دستورش درسته؟؟

----------


## saeedheydari118

ببخشید من چون اسمت نمیدونم از لفظ راهنما استفاده میکنم.
دوست عزیز فکر کنم ایراد کار من اینه که فرمول emd برای یه بعدی بکار بردم. که اشتباه، به نظر شما ماتریس که الان داریم یه بعدی؟؟
یا باید از فرمول چند بعدی emd استفاده کنیم.

----------


## rahnema1

لطفا فایل kmeans اصلی دستکاری نشده را بفرستید

----------


## rahnema1

نحوه استفاده از برنامه ای که در زیر میاد به این صورته:

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

چند تا اصلاح کردم

----------

