error function

昨天做 《Introduction to Quantum Mechanics》上的一道题目,即归一化下面的波函数:     搞了一会儿,才发现自己不会计算 的不定积分:熟悉的积分计算规则全部都用不上!上网查了一会,才发现这就是大名鼎鼎的 Error Function:     它的图像是: 这是一个不能用初等解析函数表示的函数,在统计学和量子力学中有着广泛的应用。对于我上面的问题,根据归一化的基本要求我们有:     如果我们假定:     那么:     按照erf 的形式展开有:     这样就计算出    

动量对于时间的导数等于势能对于距离的导数

自己最近在努力学习量子力学,看到Ehrenfest’s theorem: the expected values in Quantum Mechanics obeys the classical laws. 现在证明动量对于时间的导数等于势能对于距离的导数,即: (1)   First by definition, we have: (2)   (3)   How do we proof the equality? First we notice that the norm of the wave function can be expressed the following: (4)   so (3) can be expanded as:     …

继续持有或者换一种股票,哪一个更划算?

假定我现在有 Google 的股票100万,但是我发现 Amazon 的股票涨势更好,我是不是应该卖掉 Google 股票,换成 Amazon 的股票呢? 这个问题看上去挺简单,实际上却有多种因素的作用在里面,我最近跟一个投资股票市场多年的朋友请教了一下,算是有了一些理解。 最简单的,既然 Amazon 股票涨得更好,那当然应该卖掉 Google 股票,换成 Amazon 的股票。 可是接下来我又想到,把现在的 Google 股票卖掉本身就要交税,只能用剩下的钱去买 Amazon 股票,这样一来虽然 Amazon 的股票涨势更好,但是基数却更小,这样下来一定划算吗? 再进一步,即使基于持有 Google 股票将来总数更高,但是要交税的部分也更高(因为换成 Amazon 股票的时候就已经交过一部分税了),这样下来即使总数更高也不一定划算吧? 朋友帮我列了一个公式计算如下: 假定我现在 Google 股票有 100,其中 50 是原有资本, 50 是 截至目前为止需要交税的 Capital Gain。另外,假定 Capital Gain 部分的税率是 20%,假定未来一年里 Google 股票的涨幅 是 ,Amazon 股票的涨幅 是 ,那么: 如果不卖掉股票,那么未来一年持有的股票总额是:     …

从作为预测的模型到作为概率分布的模型 (Model: From Prediction to Distribution)

作为机器学习的实践者,自己对于模型的理解就是 Predict:从一组输入信号来计算目标变量,也就是: (1)   但是在机器学习的理论学习中,我常常看到教材上提到模型也描述了概率分布,并从这个角度有很多理论上的推导,比如在分类模型中,Maximum Likelihood Estimation 和 Cross Entropy 是等价的,再比如如果假定观测误差符合正态分布的话,那么Maximum Likelihood Estimation 和 Mean Square Error 在回归模型中也是等价的,等等。在我看来,如果我们已经有了m个训练数据: (2)   那么训练数据的概率分布已经可以使用计数的方法(也就是 Empirical Distribution)直接计算了,为什么还需要一个模型呢? 直到最近,我才对于这个问题有了一些更深刻的认识:所谓模型描述了概率分布,指的是在给定输入条件 的情况下,模型给出预测值 ,以及确认该值是 的概率。也就是下面的条件概率密度函数: (3)   对于分类模型,上面的描述比较好理解:假定我们有 C 个 class,那么在最后一层网络中一般有 C 个输出,经过 Softmax 归一化处理以后,我们把 就当做当前用例属于每一类的概率,这确实是一个概率分布。只不过在实践中我们需要取出概率最大的一个作为模型的输出值(Predict a Class)而已。 对于回归模型,上面的描述的意义就不是那么明显了,下面一段分析引用自 Maximum Likelihood Estimation 和 Mean Square Error: 假定我们根据实验观察,得到了大量的训练数据。因为总是有不可知因素能够影响 的最终取值,但是却没有被我们包含在 当中,不难想象,在这种情况下,我们会发现某些训练数据的输入信号部分是完全一样的,但是 却不一样。同时我们的模型只能够预测一个值,这个时候模型应该预测那一个值呢?如果我们把模型看做对于目标数据的概率密度函数,那么对于和模型预测值相同的那些值,它们的条件概率是1吗?和模型预测值不同的那些值,它们的条件概率是0吗? 对于模型应该预测的值,训练数据的平均值是一个明显正确的选择。但是后面两个问题,我们不应该采用非0即1的答案。统计学指出,在上面的情况下,我们应当假定在相同的输入信号下所有的目标变量的概率分布符合正态分布(Normal Distribution),其分布的中心就是所有目标变量的平均值,这个值也是我们的模型的预测值(Predict)。但是对于和这个预测值相同的值,其概率并不是1,和这个预测值不同的值,其概率也不是0,而是符合正态分布。在这个前提下,我们就可以说模型描述了给定了条件 , 的概率分布: (4)   …

不用f前缀但是像fstring一样Print (fstring print without f-prefix)

Python 早期的Print语句受到 C 的直接影响,在把变量嵌入到输出的字符串时采用了占位符语法。使用这种打印语句,程序员需要在脑子里把所有的变量处理两次,一次是它们在字符串中的位置,一次是它们的具体名称。这样处理实际上比较繁琐而且容易出错的: name = ‘Bob’ age = ’60’ print(‘%s is % years old.’ % (name, age)) 新的f-string 语法可以直接把变量嵌入到字符串中,算是朝正确的方向前进了一大步: print(f'{name} is {age} years old.’) 现在的问题是,我们总是要加上 f 这个恼人的前缀,特别是如果输出的消息是多行的话,每一行都要写上这个前缀,更是麻烦。我琢磨了很久,终于搞明白怎样在正常的字符串中嵌入变量名处理了,真是不错: def Print(message): import inspect frame = inspect.stack()[1][0] print(message.format_map({**frame.f_globals, **frame.f_locals})) name = ‘Bob’ age = ’60’ Print(‘{name} is {age} years old. – Print magic’) 长久以来的一个心病终于解决了。

C++: Variadic Template and Fold Expression are Powerful.

这两天做一个Pipeline的Framework,见识了现在C++ Generic Programming 的强大功能,比原来的 Object Oriented Programming 看上去 Cool 多了:完全没有关系的一堆类型,一样可以放在框架里操作,写出来的程序也没有任何效率的损失,看来这些年C++又进步了很多。下面简要说说我的设计。 Class BaseData 表示 Pipeline 中的一个数据节点。 Class Phase 表示针对数据的某个操作。 Phase 接受一些 BaseData 作为输入,并输出到另外一些BaseData。为了灵活和简单起见,Phase 不设任何 Virtual Method 作为接口,只要就实现一个 Run Method 即可。程序概要如下: class BaseData { public: get() … set() … }; class DataA : public BaseData {…}; class DataB : public BaseData {…}; class DataC : public BaseData {…}; …

C++ 的一些新感想

因为在工作中C++用的比较多,听说 C++ 17 最近又引入了很多新特性,就买了几本 C++ 的书回来看。看了一阵,感慨颇多,罗列如下: C++ 在 Library 开发人员和普通使用人员之间的鸿沟是越来越大了。新增加的很多特性都是给Library作者提供的,普通用户平时根本用不到。特别的,我以前总是以为所谓 Library 就是在语言之上提供一些包装好的功能模块,现在看到标准库中很多 Type Traits (比如 is_trivially_destructible) 都需要编译器的特殊支持才能实现,远远地超出了我以前的理解范畴。一般的 C++ 用户,如果打开标准库里面的程序想要研究一下某个特性是如何实现的,多半和天书一样看不懂。 C++ 现在的救命稻草就是运行时刻的性能了,这集中体现在C++为程序员提供的内存控制上。为此 C++ 几乎牺牲了其他可能的前进方向,并且不惜在语言上增加了巨大的复杂性。C++ 的创始人 Bjarne Stroustrup 前些年还提要在 C++ 中引入自动内存管理,现在是绝口不提了,估计搞出来也没有人用;为了更有效的支持大型对象,C++ 搞出来 Rvalue Reference 和 Move Constructor,让我这样的 C++ 的老鸟程序员也感到太过复杂;更不用提新的 std::string_view,本身大概唯一的作用就是在大字符串上搞一些子串操作比较有效率,结果强行塞进标准库,连 C++ 的资深作者 Nicolai M. Josuttis 都看不下去,在他的书中大声疾呼:string_view is considered harmful! 即便如此追求性能,看着 Programming Language Popularity Trend 上面 C++ 日渐下滑的曲线,我估计日后 …