C++实现惰性求值
什么是惰性求值?
我们先来看下面一段Python程序,在python中输入
1 | a = [1,2,3] |
这个程序很快执行,但是试想一下,如果a和b都是很大的List,那么生成中间变量,再去遍历他将是一个极为浪费时间的做法,我们希望c只在求值(即print)的时候再来计算,这样能节省出产生临时变量的时间。
C++实现
我们以矩阵类来展示惰性求值的实现方法。首先我们有一个共同的基类:
矩阵的条件数是什么
条件数定义
在矩阵的数值计算中经常会遇到条件数的概念,条件数通常用于描述一个线性系统的稳定性,条件数越大,系统的稳定性越差。通常条件数太大的线性系统,求得的解会受到舍入误差的严重影响。下面我们来看条件数的一些概念。
条件数被定义为:
κ(A)=∣∣A∣∣2∣∣A−1∣∣2
其中,∣∣A∣∣2表示矩阵的二范数,定义为:
∣∣A∣∣2=x=0max∣∣x∣∣2∣∣Ax∣∣2
因此,条件数可表示为:
κ(A)=∣∣A∣∣2∣∣A−1∣∣2=(x=0max∣∣x∣∣2∣∣Ax∣∣2)(x=0min∣∣x∣∣2∣∣Ax∣∣2)−1
可以看出,他的意义就是单位向量拉伸的最大比例除以单位向量拉伸的最小比例。而这个拉伸比例就是矩阵最大和最小的奇异值,记作σn(A),σ1(A)有
κ(A)=σ1(A)σn(A)
条件数与奇异值
我们再来回顾一下奇异值分解(参见 理解PCA和SVD ),矩阵A的奇异值分解为A=UΣVT,其中,U,V为正交单位阵,因此Ax=UΣVTx=UΣy,这里y=VTx是对x做一个正交变换,其模长不变,若x为单位向量的话,y也为单位向量。同理最后用U来对Σy进行正交变换也不改变其模长,因此,最终的模长可看做是一个对角阵Σ对一个单向量y,进行变换的结果,而对角阵Σ的对角元素就是奇异值,如果最大的奇异值和最小的奇异值相差较大的话,那么对一个单位向量的变换结果模长的变化范围就很大,这样的话,不同向量的计算出的数量级不一样,就会出现舍入误差的问题。
Comparison of Gradient Descent, Stochastic Gradient Descent and L-BFGS
Symbols count in article: 1.7k Reading time ≈ 6 mins.
Dataset
The mnist dataset is one of the most popular dataset in machine learning especially in handwriting recognition systems. It contains 50000 pictures of 28x28 size as the training set while 10000 as validation set and 10000 as test set. The Bench mark error rate of mnist in traditional linear classification method is 7.6%[1]. However, the result improved dramatically after the deep learning method is proposed. DNN0.35%[2], CNN0.23%[3]. In this article, we only compare the optimization method in logistic regression.
Experiment
理解PCA和SVD
一个集合和其全子集一定不是等势的证明
云存储服务器搭建
seafile服务搭建
内网穿透
由于我们的云存储服务一般都放在家里,需要从外部访问,但是外部访问的地址该怎么填呢?是不是直接填自己的ip就行了?不幸的是,对大多数人来讲,这是不行的。我们先来查查自己的ip,查询ip有两种方法,一是在命令行里面输入ifconfig,二是登录http://ip.cn/ 查询,经过查询后,发现两个ip不一样,查阅资料后发现是因为家里的网络通常是被运营商再包过一层,使用的ip是运营商提供的内网ip,相当于处在了一个局域网里面,因而无法从外部直接访问,那么这个时候就需要采用内网穿透的方式来提供对外的访问。所谓的内网穿透实际上也还是需要借助外部服务器的,在这里向大家推荐一个软件叫做ngrok,其工作原理就是在他的服务器上建立一个子域名,并和本地服务器关联,所有访问外部服务器的请求都被转到了本地服务器,实现了外部访问。由于众所周知的缘故ngrok主页无法访问,好在国内有人做了一个类似的服务,下面给出实现步骤:
1、到www.tunnel.mobi 下载ngrok 1.7。
2、新建配置文件 ~/.ngrok
内容如下:
1 | server_addr: "tunnel.mobi:44433" |
神经网络的系数求导方法
神经网络在学习的时候通常采用误差反馈的方法,误差反馈的实质是一种梯度下降,由于梯度下降的速度较慢,所以又通常采用SGD等方法实现对计算效率的优化。本文给出了求神经网络似然函数对所有参数导数的方法,该方法基于微分的链式法则,利用该导数实现了基于BFGS的神经网络,取得了良好的效果。同时,除了神经网络之外,该方法对其他复合函数参数的求导也同样有效。
网络结构及函数定义##
这里采用一个单隐层的神经网络作为例子,该神经网络有6个输入结点,三个隐层结点和一个输出结点,a1是输入矩阵,矩阵的每行是一个样本,每列是一个特征,其数量就是输入层的结点数,这里一共有六列。结构如图所示:
其传递关系如下:
\begin{align}&z_2 = a_1 w_1+b_1 \\ & a_2 = h(z_2) \\ &z_3 = a_2 w_2+b_2\\ & a_3 = h(z_3)\\ &c = l(a_3)\\ &v = M:c \end{align}
其中
\begin{align}&h(x)=\frac{1}{1+e^{-x}} \\ &l(a)=\ln(a)\circ y+\ln(1-a)\circ (1-y) \\ &M=[\frac{1}{N},\frac{1}{N},\cdots,\frac{1}{N}]^T \end{align}
TikZ入门教程
引言
在绘制流程框图时,有许多工具可以采用,最著名的有微软的Viso,而开源的有Graphviz、PGF/TikZ,最近要再Mac上画一个流程图,Graphviz是采用dot语言的一个矢量图生成系统,但是不支持LaTeX公式,安装也比较麻烦。PGF是用于生成矢量图的一种语言,而TikZ则是在Tex环境下的一个宏包,实现了对PGF的封装,所以我们要使用TikZ,就需要先配置LaTeX环境,用TikZ绘制出来的图形效果非常好,原生支持所有LaTeX语法,同时能和正文的文字字体保持高度一致,但是学习曲线略微陡峭,适合有排版强迫症的同学。那么下面我们一步一步地熟悉用TikZ来绘制流程图。
环境安装与配置
我们首先要安装Tex环境,Windows系统推荐Texlive 完整安装,Mac系统推荐MacTex 完整安装后,在Windows下,已安装默认编辑器WinEdt,而在Mac下的编辑器则是TeXShop,这两个编辑器都非常好用,直接用就可以了。
第一个例子
我们先从一个最简单的例子开始:画一条直线。
代码如下:
1 | \documentclass[tikz]{standalone} |
这样,我们得到了一个pdf文件,我们用pdf2svg工具将其转换为svg格式的矢量图。
输出:
带\的都是LaTeX的宏命令,可以看到,这段代码的核心就一句话 \draw (0,0) -- (1,1);
这句话的意思就是从(0,0)到(1,1)画一条线段。我们还可以画的稍微复杂一点:
1 | \documentclass[tikz,convert=pdf2svg]{standalone} |