ورود

View Full Version : بهینه سازی کد Fuzzy C_Means



rashid1368
پنج شنبه 31 اردیبهشت 1394, 11:17 صبح
سلام به همه دوستان برنامه نویس

این فرمول را درنظر بگیرید ( Fuzzy C_Means):
131462

این فرمول، قسمتی از خوشه بندی fuzzy C_Means هست. فرض کنید P یک آرایه 1000*128 (1000 سطر و 128 ستون) هست و V هم یک آرایه 1500*128 ( 1500 سطر و 128 ستون ). همچنین Vi و Vn و Pj، آرایه های 1*128 هستند. منظور از Uij در فرمول، یعنی مقدار محاسبه شده برای Pj و Vi. در واقع برای تک تک سطرهای آرایه های P و V این فرمول باید محاسبه بشه. خود من کد زیر را برای محاسبه فرمول نوشتم:






function BOW = fuzzy_hist(V, P)
m = 2 ;
BOW = zeros(1,size(V,1));
dTotal = EuclideanDistance(P, V);
for i = 1 : size(V,1)
u = 0;
tStart = tic;
% u = sum(power(dTotal(:,i)' / dTotal(:,:)', m))';
for j = 1 : size(P,1)
for n = 1 : size(V,1)
u = u + power(dTotal(j,i) / dTotal(j,n), m);
end
% s = power(dTotal(j,i) / dTotal(j,:), m);
end
fprintf('* %i : %i in %f\n', curIdx, i, toc(tStart));
BOW(1,i) = 1 / u;
end
end





مشکل من، زمان اجرای این تابع هست. تقریبا 30 - 40 ثانیه برای آرایه های گفته شده طول می کشه.

آیا پیاده سازی سریعتری برای این فرمول وجود داره؟ مثلا در حد یکی دو ثانیه یا کمتر؟

کد مربوط به EuclideanDistance هم از این لینک می تونید دانلود کنید. 131464
یه نکته دیگه این که علامت || که در فرمول هست را می شه با فاصله اقلیدسی محاسبه کرد.



||A-B|| = sqrt ( ||A||^2 + ||B||^2 - 2*A.B )




یه نکته دیگه این که: من نمی خوام خوشه بندی انجام بدمم. فقط می خوام این فرمول را پیاده کنم. همین!!!!

پیشاپیش از همه شما دوستان تشکر می کنم.

rahnema1
پنج شنبه 31 اردیبهشت 1394, 13:45 عصر
سلام
نمیدونم این برنامه را بر اساس چه فرمولی نوشتید چون هم u ها باید update بشه و هم center ها در هر مرحله بر اساس u قبلی باید update بشه

rashid1368
پنج شنبه 31 اردیبهشت 1394, 13:59 عصر
سلام
نمیدونم این برنامه را بر اساس چه فرمولی نوشتید چون هم u ها باید update بشه و هم center ها در هر مرحله بر اساس u قبلی باید update بشه

ممنون از شما،
اول این نکته را بگم که من نمی خوام خوشه بندی فازی انجام بدم. فقط می خوام همین فرمول را پیاده کنم.
متغیری هست به نام BOW که دارای 1500 سطره(به تعداد سطرهای V). فرض کنید P1 یک آرایه 1*128 باشه ( 1 سطر و 128 ستون ). اگر P1 را با V1 در فرمول بالا بذاریم (i = 1, j = 1)، مقدار محاسبه شده، در سطر 1 از BOW قرار می گیره. اگر P1 را با V2 در فرمول بالا بذاریم، مقدار محاسبه شده را در سطر دوم می ذاریم و به همین ترتیب تا وقتی V1500 را محاسبه کنیم که در سطر 1500 از BOW قرار می گیره.

rahnema1
پنج شنبه 31 اردیبهشت 1394, 15:16 عصر
با این حساب کلا فرمول را از سوال پاک کنید چون اینجا هیچ کاربردی نداره و بیشتر باعث سر در گمی افراد می شه :)
p و v داخل اون فرموله اما شما در کد خودتون از V و C استفاده کردید لطفا متغیرهای داخل کد را بگید ابعادشون چه قدره چون الان v داخل فرمول با v داخل کد با هم اشتباه شدند

rashid1368
پنج شنبه 31 اردیبهشت 1394, 15:35 عصر
با این حساب کلا فرمول را از سوال پاک کنید چون اینجا هیچ کاربردی نداره و بیشتر باعث سر در گمی افراد می شه :)
p و v داخل اون فرموله اما شما در کد خودتون از V و C استفاده کردید لطفا متغیرهای داخل کد را بگید ابعادشون چه قدره چون الان v داخل فرمول با v داخل کد با هم اشتباه شدند

حق با شماست. اشتباه از من بوده. الان کد برنامه را درست کردم. که دقیقا متغیرها با فرمول یکی هستند و همه چیز مطابق با توضیحات پست اول هست.




function BOW = fuzzy_hist(V, P)
m = 2 ;
BOW = zeros(1,size(V,1));
dTotal = EuclideanDistance(P, V);
for i = 1 : size(V,1)
u = 0;
tStart = tic;
for j = 1 : size(P,1)
for n = 1 : size(V,1)
u = u + power(dTotal(j,i) / dTotal(j,n), m);
end
end
fprintf('* %i : %i in %f\n', curIdx, i, toc(tStart));
BOW(1,i) = 1 / u;
end
end



http://barnamenevis.org/attachment.php?attachmentid=131462&d=1432191523

rahnema1
پنج شنبه 31 اردیبهشت 1394, 15:52 عصر
اینجور سریعتر می شه:

function BOW = fuzzy_hist(V, P)
m = 2 ;
BOW = zeros(1,size(V,1));
dTotal = EuclideanDistance(P, V);
for i = 1 : size(V,1)
u = 0;
tStart = tic;
for j = 1 : size(P,1)
u = u + sum(power(dTotal(j,i) / dTotal(j,:), m));
end
fprintf('* %i : %i in %f\n', curIdx, i, toc(tStart));
BOW(1,i) = 1 / u;
end
end