論文中對比演算法應該以自己實現的為主還是以原作者給出的為主?
01-09
論文中要用到一些對比演算法,很多對比演算法都沒有公布源碼。自己實現又與原作者給出的結果相差較大。原作者也不對論文中的一些細節作回應!這種情況下我應該以哪個結果為準呢!當然如果自己演算法的結果比對比演算法原文中的結果還要好當然就不存在這個問題了!可是實際上往往沒有原文中的結果好,卻比自己實現的好。這時候要怎麼辦呢!
對比演算法盡量選用那些經典的,禁得住推敲的演算法,這類演算法往往也有開源代碼。如果你選的「對比演算法」本身就是一個改進演算法,或者經不住推敲的演算法,那人家自然不敢公開代碼。你強行跟人家對比,也不是太好,「→_→何苦為難←_←」你在related work裡面提一下他的工作就行了,委婉地說一下他有什麼不足。他要是不服氣,你再要求他公開代碼。
你也可以窮盡各種辦法實現作者的論文的內容,然後發一篇論文說他的文章不能復現,乾死他
這個東西真的很難說。
一般來說作者如果有公開的代碼,則用作者的代碼,這樣你的責任是最小的。免得做的不一樣別人來攻擊你。如果作者沒有代碼,你如果能管他要到,那就還是第一種情況。如果要不到,你自己實現一個即可,一方面你自己問心無愧,確實是好好實現的別人的演算法,沒有偷奸耍滑,另一方面實驗結果也應該和人家論文的差不多。可能有些技巧你不知道,導致性能有差別,但不應該差得太大。如果真是怎麼也調不好,則應該分析問題,並給嘗試出一定的解決方案,讓看你論文的人明白、並且認同,這是人家演算法的問題,不是你自己寫程序寫錯了導致的問題。之前我們也是提了一個演算法,和之前人家的比,有一個沒有給代碼的,實現起來也不複雜,我就自己寫了一個,結果跑出來效果真的很差,迭代根本不收斂。。不過對比了原論文的結果我覺得也合理,在同樣規模的數據集上,原作者report的結果需要數千分鐘才能收斂。而我們的大約是幾秒鐘,主流演算法一般也都是幾秒鐘。於是我們比較的時候對他的演算法做了一些改進,大概能收斂了,並把相關的分析簡要在論文里寫了一下。剛投,review還沒出。==
補充,後來被拒了。。找原作者要代碼唄,或者把自己根據論文自己實現的發給原作者問他哪有問題,為什麼得不到類似結果。
反正我經常被人要代碼,還經常幫作者「debug」,最誇張的一次,那個作者快瘋了,怎麼弄我的演算法結果都不對,說結果比論文的大了8-12倍級別。他把代碼發給我(他運行環境和我的不一樣所以移植了一份)我也看不出毛病,還和他skype了半天討論。最後我設置了他一樣的環境運行,發現結果完全正確嘛,原來那個作者肉眼看最後結果,把一個8位數數成了9位數。。。如果確定自己的演算法等前提條件不存在大的問題的情況下得出的結論不同建議用自己的結論。正確與否以及原作者給出的演算法結果的合理性就交給別人去判斷好了。有理即是正確的,科學就是在不斷的完善中進步的,但是真相始終只有一個。
這要看你是不是想踏踏實實科研
對對對,某些偏玄學的領域經常有這種情況,很多時候一些作者認為不必在論文中說明的實現細節對性能有重要影響。好多論文對比別人演算法的時候,別人演算法性能都很差。我覺得這是一個很好的辦法,因為有助於體現自己的演算法有多麼好。
至於你最後用作者的實現還是自己實現,主要取決於 1.作者有沒有提供 2.哪個結果更差。沒看懂題主的思路,只是比較演算法精確性的話,根據作者的假設條件,自己建立同樣的假設,直接比較結果就好。
如果是作者文章中也沒解釋清楚某些參數的話,確實比較煩~~什麼樣的語言,什麼樣的編譯環境,什麼樣的數據結構,以及你寫代碼的水平都影響著數據。以你的數據為準,但前提是你演算法理論分析部分是正確的。註:這裡的數據僅僅指演算法運算時間。。。
有國際通用benchmark的話,當然要和別人結果進行對比。如果僅僅只是同一問題的話,沒有必要糾結於他人結果。做演算法比較時,前面提一句常用解決演算法有誰提出的哪個演算法,後面結果對比則不要加名字,因為容易引起爭議。
推薦閱讀: