A. 精通Python需要多長時間
我認為「精通」要滿足如下條件:
熟知主流硬體體系(x86, x64)
熟知 CPython 的具體實現,如若可能至少通讀源碼三遍以上
熟知每條 Python bytecode 如何被解釋執行
熟知每條 Python 語句如何 compile 成 bytecode
熟知 Python 主要數據結構所採用的優化手段
熟知 JIT 以及哪些場合下 PyPy 會比 CPython 有較大性能提高、以及有什麼代價
所以我一直只敢稱自己為 「中級 Pythonista」。對於那些僅僅知道怎麼用 Python 就敢自稱「精通」的人:專家不是那麼好當的,沒有金剛鑽別攬瓷器活。不懂那麼多底層細節就不要隨便說自己「精通」,說自己「擅長」不會被人看不起。
@米嘉 引用的 StackOverflow 上列的那幾項條件是作為將 Python 用於主要工作語言所需要的基本條件,敢於因此而稱自己「精通 Python」要讓不少人笑掉大牙。況且那幾項還有幾個嚴重問題:
第3點:如若可能,盡量避免 map/rece/fitler,而用 list/generator/set comprehension,代碼要清晰得多,GvR 如此說。xrange 和 range 的區別在 Python 3 中馬上就要滾蛋了,所以如非必要,不要大量使用 xrange。
第5點:敢於在 CPython 中大量使用遞歸是對 CPython 實現的公然侮辱。Python 的多個穩定實現都沒有 TCO,遞歸會讓性能迅速下降。記住一點:Python 中函數調用非常昂貴,可讀性、可維護性影響不大的情況下,能展開函數調用的時候盡量展開、遞歸能轉化成循環的盡量轉化。遞歸也不是人類自然的思考方式。
第7點:看書是對的,但不要把 Python 當作一門經典函數式語言對待,因為它不是。你當它是,它會很痛苦(「為毛要這樣濫用我!?」),你也會很痛苦(「為毛你不這樣實現 blah blah!?」)。SICP 是本好書,但不要因此而教條。要清楚的知道什麼時候用函數式,什麼時候用面向對象,什麼時候用面向過程,什麼時候用面向任務,什麼時候用面向結果。在一棵樹上弔死是大多數非理性死忠的表現。
B. 壓縮感知理論基本介紹
姓名:王鑫磊
學號:21011110262
學院:通信工程學院
【嵌牛導讀】壓縮感知是信號處理領域進入21世紀以來取得的最耀眼的成果之一,並在磁共振成像、圖像處理等領域取得了有效應用。壓縮感知理論在其復雜的數學表述背後蘊含著非常精妙的思想。基於一個有想像力的思路,輔以嚴格的數學證明,壓縮感知實現了神奇的效果,突破了信號處理領域的金科玉律——奈奎斯特采樣定律。即,在信號采樣的過程中,用很少的采樣點,實現了和全采樣一樣的效果。
【嵌牛鼻子】壓縮感知,欠采樣,稀疏恢復
【嵌牛提問】壓縮感知相比奈奎斯特采樣定律的主要突破是什麼?
【嵌牛正文】
1.CS的初步理解
CS是一個針對信號采樣的技術,是在采樣過程中完成數據壓縮的過程。我們知道在對模擬信號按一定采樣頻率進行采樣並得到數字信號的過程中,要想完整保留原始信號中的信息,采樣頻率必須大於信號中最高頻率的2倍(奈奎斯特采樣定理)。但Candes等人又提出了,如果信號在頻域是稀疏的,那麼它可以由遠低於采樣定理要求的采樣點重建恢復。Nyquist定理中的采樣為等間距采樣,若采樣頻率低必然會引起混疊,如果不等間距采樣呢?如果是隨機采樣呢?隨機采樣必然會發生頻譜泄露,但泄露會均勻分布在整個頻域且泄露值都較小,而最大的幾個峰值可以通過設置閾值檢測出來,從而有了恢復出原始信號的可能。
圖1展示了一原始的模擬信號在頻域是稀疏的,僅由三個頻率分量組成,為了得到數字信號,首先要在時域對其進行采樣,根據壓縮感知理論,可以在時域進行隨機亞采樣,之後得到的頻譜會產生如圖所示的泄露,但可以通過閾值檢測求出原始信號的真實頻率分量,從而恢復出原始信號。
2. CS的數學模型
CS有兩個前提條件:
假設:x是長度為N的原信號,稀疏度為k,它是未知的;Φ為測量矩陣,對應采樣過程,也就是壓縮的過程,如隨機采樣,是已知的;采樣後的結果為:y=Φx,也是已知的;因此壓縮感知問題是:在已知測量值y和測量矩陣Φ的基礎上,求解原信號x的過程。然而一般信號x本身並不稀疏,需要在某種稀疏基上進行稀疏表示,即x=Ψs, 其中s為稀疏向量,即為所求的稀疏信號;Ψ為稀疏基矩陣,也叫稀疏變換矩陣,如傅里葉變換。
於是最終問題表示為:
y = ΦΨs = Θs (1)
已知y,Φ,Ψ,求s, Θ稱為感知矩陣。感知矩陣需要滿足約束等距原則(RIP),因此需要測量矩陣Φ和稀疏基Ψ滿足不相關,即采樣過程與稀疏過程不相關。Candes等人又找到了獨立同分布的高斯隨機測量矩陣可以稱為普適的壓縮感知測量矩陣,於是滿足高斯分布的隨機測量矩陣就成了CS最常用的觀測矩陣。
3. CS的常用方法
已知(1)方程有無數解,因此需要通過增加約束來得到唯一解。方程是稀疏的,因此我們需要找到這個方程里所有解中最稀疏的內個就行了。
求解上述方程一般有三種思路:凸優化演算法,貪婪演算法,貝葉斯理論。CS常用演算法有:
基追蹤重構演算法 (Basis Pursuit, BP):BP演算法是一種凸優化方法。
正交匹配追蹤演算法 (OMP):OMP屬於貪婪演算法。
閾值迭代演算法 : 包括軟閾值迭代(ISTA)和迭代硬閾值(IHT)。ISTA的一種改進方法為快速閾值迭代(FISTA)。
【嵌牛參考】
[1]. Dandes, E. J. . 「Near-optimal signal recovery from random projections.」 Universal encoding strategies IEEE Transactions on Information Theory 52(2006).
[2]. Donoho, D. L. . 「Compressed sensing.」 IEEE Transactions on Information Theory 52.4(2006):1289-1306.