在工程領域,有個著名的詞叫做「重新發明輪子」。
這個詞是說,本來既然輪子就已經足以應付多數需求,那麼耗費時間精力重新再發明一次輪子會耗費更多的時間精力,完全得不償失,在很多場合,重新發明輪子都不是一個理智的做法。在機器學習等領域尤其是如此,由於實際計算中可能遇到一些複雜的線性代數運算,而本身各種軟體包裡針對這些問題有很多專門的最佳化,通常我們自己發明的輪子還很可能不如原來已有的輪子。
那麼,在呼叫庫函式的情況下,演算法的原理需要掌握到什麼程度呢?我個人認為,對於任何的演算法,需要問這幾個問題:
這個演算法的基本思路是怎樣的?呼叫函式的時候需要用到哪些引數,這些引數分別代表什麼意思?
這個演算法適合用來解決哪些問題?
這個演算法在解決另外一些問題時,跟其他的演算法相比,有哪些缺點?針對這些缺點,這個演算法有哪些變形,這些變形分別是針對哪些特別的情況的改進?
這個演算法的複雜度大概是多少?是否適合並行或者GPU加速?這個演算法當資料量增大時,計算的複雜度是怎樣增長的?
如果現在不允許你使用當前的演算法,可以用哪些其它的方法作為替代?
如果大致能回答這些問題,就可以說,對於演算法的原理已經掌握得比較好了。
在工程領域,有個著名的詞叫做「重新發明輪子」。
這個詞是說,本來既然輪子就已經足以應付多數需求,那麼耗費時間精力重新再發明一次輪子會耗費更多的時間精力,完全得不償失,在很多場合,重新發明輪子都不是一個理智的做法。在機器學習等領域尤其是如此,由於實際計算中可能遇到一些複雜的線性代數運算,而本身各種軟體包裡針對這些問題有很多專門的最佳化,通常我們自己發明的輪子還很可能不如原來已有的輪子。
那麼,在呼叫庫函式的情況下,演算法的原理需要掌握到什麼程度呢?我個人認為,對於任何的演算法,需要問這幾個問題:
這個演算法的基本思路是怎樣的?呼叫函式的時候需要用到哪些引數,這些引數分別代表什麼意思?
這個演算法適合用來解決哪些問題?
這個演算法在解決另外一些問題時,跟其他的演算法相比,有哪些缺點?針對這些缺點,這個演算法有哪些變形,這些變形分別是針對哪些特別的情況的改進?
這個演算法的複雜度大概是多少?是否適合並行或者GPU加速?這個演算法當資料量增大時,計算的複雜度是怎樣增長的?
如果現在不允許你使用當前的演算法,可以用哪些其它的方法作為替代?
如果大致能回答這些問題,就可以說,對於演算法的原理已經掌握得比較好了。