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.