深度摸鱼入门

import numpy as np
a=np.array([1,2,3,4])
print(a)
[1 2 3 4]
import time
# this code is to compare the vectorization and for-loops
a=np.random.rand(1000000)
b=np.random.rand(1000000)

tic=time.time()
c=np.dot(a,b) # dian cheng in Chinese
toc=time.time()

print(c)
print("Vectorized version:"+str(1000*(toc-tic))+"ms")

c=0
tic=time.time()
for i in range(1000000):
    c+=a[i]*b[i]
toc=time.time()

print(c)
print("For loop:"+str(1000*(toc-tic))+"ms")
# and we know how fast the vectorization can be than the for-loops
249857.1312811841
Vectorized version:1.0018348693847656ms
249857.13128117658
For loop:375.45204162597656ms

由此开始深度学习之路:

这是我的第一个jupyter note,是在用过matlab的mlx之后才开始用这个超级方便的工具,在开始之前,我希望读者可以先做到这几步:

第一步用jupyter notebook,先配好自动补全的环境:Jupyter Notebook 代码自动补全功能设置 - 知乎 (zhihu.com)

第二步学会写公式,在线LaTeX公式编辑器-编辑器 (latexlive.com)

第三步学会用英文表达变量名,百度翻译-200种语言互译、沟通全世界! (baidu.com)

好,我们下面接着向量化与for-loops的比较:

\[ u=A\cdot v\\u_i=\sum_jA_{ij}v_{j}\\ \]

如果写成for-loops

u=np.zeros(rows,colomns)
for i in range(rows):
    for j in range(colomns):
        u[i]+=A[i][j]*v[j]

但如果写成vectorization,这样就可以了

u=np.dot(A,v)

又比如这个

\[v=\begin{bmatrix} v_1\\\vdots\\ v_n \end{bmatrix} \]

你想得到,

\[u=\begin{bmatrix} e^{v_1}\\\vdots\\ e^{v_n} \end{bmatrix} \]

如果你想用for-loops的话就只能这样,但我们可以直接用numpy的内置函数

u=np.zeros((n,1))
for i in range(n):
	u[i]=math.exp(v[i])

这样显然更快:

import numpy as np
u=np.exp(v)

这些向量化的函数都会大大加快我们计算的速度,注意下面的v是vector的意思:

np.log(v) np.abs(v) np.maximun(v,0) v**x 1/v
lnx 绝对值 同零相比最大的绝对值 v^2 倒数

\[ z^{(i)}=w^{T}x^{(i)}+b^{(i)}\\ 在这里x^{(i)}代表的是第i列的数据, \\在这里我们通常喜欢定义X为一个n\times m的矩阵,\\则Z也定义成一个n\times m的矩阵,而w是一个n\times 1的向量,\\而w^T就是一个1\times n的向量,b是一个1\times m的向量\\则我们可以这样理解这个句子\\ Z=w^TX+b\\ \begin{align} \Rightarrow \begin{bmatrix} z^{(1)}& z^{(2)} &\cdots &z^{(m)} \end{bmatrix}&=w^TX+ \begin{bmatrix} b^{(1)}& b^{(2)} &\cdots &b^{(m)} \end{bmatrix}\\ &=\begin{bmatrix} w^Tx^{(1)}+b^{(1)}&w^Tx^{(2)}+b^{(2)} &\cdots &w^Tx^{(m)}+b^{(m)} \end{bmatrix} \end{align} \\\begin{pmatrix} 但需要注意到的是其实在python中输入时b是一个常数\\而在计算时会被拓展成1\times m的向量,这在python中叫broadcasting \end{pmatrix} \\则上面这个本来应该用for-loops去赋值的语句我们可以写成: \]

z=np.dot(w.T,X)+b
# 这里的numpy库中的点乘意思,w.T相当于np.transpose(w)即矩阵转置,b是一个常数

Broadcasting example

import numpy as np
A=np.array([[56.0,0.0,4.4,68.0],
            [1.2,104.0,52.0,8.0],
            [1.8,135.0,99.0,0.9]])
print(A)
[[ 56.    0.    4.4  68. ]
 [  1.2 104.   52.    8. ]
 [  1.8 135.   99.    0.9]]
cal=A.sum(axis=0)# means you want to sum vertically,else axis=1 is horizontally
print(cal)
[ 59.  239.  155.4  76.9]
percentage=100*A/cal.reshape(1,4) #如果不知道矩阵类型这是个好办法去保证
print(percentage)
[[94.91525424  0.          2.83140283 88.42652796]
 [ 2.03389831 43.51464435 33.46203346 10.40312094]
 [ 3.05084746 56.48535565 63.70656371  1.17035111]]
posted @ 2022-03-28 17:37  Link_kingdom  阅读(53)  评论(0编辑  收藏  举报